昨天我创建了一个新的 kubernetes 集群(v1.20.1,在本地),我想添加 NFS 配置。唯一可用(并且仍在维护)的 NFS 配置器似乎是 https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner。
它确实说使用您自己的配置器,默认值 (quay.io/external_storage/nfs-client-provisioner:latest) 是两年前的,但我没有自己的配置器。
当我按照没有 helm 图表的部署指南并检查 nfs 客户端配置器日志时,我看到以下内容:
I1220 22:20:44.160099 1 leaderelection.go:185] attempting to acquire leader lease default/fuseim.pri-ifs...
E1220 22:21:01.598029 1 event.go:259] Could not construct reference to: '&v1.Endpoints{TypeMeta:v1.TypeMeta{Kind:"", APIVersion:""}, ObjectMeta:v1.ObjectMeta{Name:"fuseim.pri-ifs", GenerateName:"", Namespace:"default", SelfLink:"", UID:"c852ca40-471f-4019-a099-d72d32555022", ResourceVersion:"134579", Generation:0, CreationTimestamp:v1.Time{Time:time.Time{wall:0x0, ext:63744022156, loc:(*time.Location)(0x1956800)}}, DeletionTimestamp:(*v1.Time)(nil), DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string(nil), Annotations:map[string]string{"control-plane.alpha.kubernetes.io/leader":"{"holderIdentity":"nfs-client-provisioner-5999484954-n4tj7_94db294f-4261-11eb-9b30-c64536689731","leaseDurationSeconds":15,"acquireTime":"2020-12-20T01:21:01Z","renewTime":"2020-12-20T01:21:01Z","leaderTransitions":2}"}, OwnerReferences:[]v1.OwnerReference(nil), Initializers:(*v1.Initializers)(nil), Finalizers:[]string(nil), ClusterName:""}, Subsets:[]v1.EndpointSubset(nil)}' due to: 'selfLink was empty, can't make reference'. Will not report event: 'Normal' 'LeaderElection' 'nfs-client-provisioner-5999484954-n4tj7_94db294f-4261-11eb-9b30-c64536689731 became leader'
I1220 22:21:01.598123 1 leaderelection.go:194] successfully acquired lease default/fuseim.pri-ifs
I1220 22:21:01.598198 1 controller.go:631] Starting provisioner controller fuseim.pri/ifs_nfs-client-provisioner-5999484954-n4tj7_94db294f-4261-11eb-9b30-c64536689731!
I1220 22:21:01.709535 1 controller.go:680] Started provisioner controller fuseim.pri/ifs_nfs-client-provisioner-5999484954-n4tj7_94db294f-4261-11eb-9b30-c64536689731!
I1220 22:21:01.717419 1 controller.go:987] provision "default/test-claim" class "managed-nfs-storage": started
E1220 22:21:01.720318 1 controller.go:1004] provision "default/test-claim" class "managed-nfs-storage": unexpected error getting claim reference: selfLink was empty, can't make reference
I1220 22:36:01.615073 1 controller.go:987] provision "default/test-claim" class "managed-nfs-storage": started
E1220 22:36:01.618195 1 controller.go:1004] provision "default/test-claim" class "managed-nfs-storage": unexpected error getting claim reference: selfLink was empty, can't make reference
这是我的集群还是此配置程序的问题?我真的不知道。
我也可以放弃这个配置器,甚至是 NFS,换上其他东西。我只需要每个 Pod 实例的存储即可工作,例如 volumeClaimTemplates,存储在我的 kubernetes 集群之外。如果有人有任何建议,请告诉我!
提前感谢, 亨德里克
您看到此错误的原因如下: KEP-1164:弃用并删除自链接
引用上述 KEP:
在 v1.16 中,我们将弃用 ObjectMeta 和 列表元对象: 在字段定义中记录它已弃用并且将要 被删除 添加有关字段弃用的发行说明 我们还将 引入功能门以允许禁用设置 SelfLink 字段 并且不透明地将设置在此功能门后面的逻辑。
在 v1.20(1.16 的 12 个月和 4 个版本)中,我们将关闭功能门,该功能门将自动禁用设置 SelfLinks。但是,仍然可以通过更改功能门的值来还原行为。
在 v1.21 中,我们将摆脱传播这些字段的整个代码 和字段本身。同时,我们将讨论地方 引用该字段(见下文)并摆脱它们。
如您所见,您可以使用 featureGate 重新启用它:RemoveSelfLink=false
尽管它没有重新评论并且 SelfLink 将在 v1.21 中永久删除
还要在 github 上检查此问题:使用 Kubernetes v1.20.0,收到"获取声明引用时出现意外错误:selfLink 为空,无法进行引用
我通过使用 Matt 链接的线程中建议的gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner:v4.0.0
来解决这个问题 https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner/issues/25。
要与 Helm 值文件一起使用,请执行以下操作:
image:
repository: gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner
tag: v4.0.0
要与 Terraform Helm 提供程序一起使用,请执行以下操作:
set {
name = "image.repository"
value = "gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner"
}
set {
name = "image.tag"
value = "v4.0.0"
}
我使用了帖子建议的特定图像,尽管他们的最新图像可能会有其他修复程序,因此使用它可能是谨慎的。
我在这里看到了同样的问题,但它不仅与自链接提供程序有关。我看到的问题是,自从安装最新版本(v1.20.1)以来,我遇到了一个问题,即我的"testclaim"pvc不再能够从存储类(托管-nfs-storage)声明存储,该类在1.20.1之前工作正常
因此,作为健全性检查,我使用 v1.17.16 和 v1.19.6 对此进行了测试,在两个版本中,测试声明的状态立即切换到"绑定",但在 v1.20.1 中,pvc 仍处于"待处理"状态,永远不会更改为"绑定"。谁能阐明这个问题?
咔嚓!
巴特
使用 https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm repo add nfs-subdir-external-provisioner
https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm repo update
helm install nfs-provisioner
nfs-subdir-external-provisioner/nfs-subdir-external-provisioner
--set nfs.server=<server-ip>
--set nfs.path=/path/to/nfs/storage
--set storageClass.name=nfs-provisioner
在 PVC 规范中添加storageClassName=nfs-provisioner
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc
spec:
storageClassName: nfs-provisioner
accessModes:
- ReadWriteMany
resources:
requests:
storage: 20Gi
以下方法已弃用,但如果必须使用它,请在 API 服务器静态清单中添加--feature-gates=RemoveSelfLink=false
标志,/etc/kubernetes/manifests/kube-apiserver.yaml
如下所示
spec:
containers:
- command:
- kube-apiserver
- --feature-gates=RemoveSelfLink=false