Kubernetes nfs 提供者 selfLink 为空
Kubernetes nfs provider selfLink was empty
昨天我创建了一个新的 kubernetes 集群(v1.20.1,on prem),我想添加 NFS 配置。唯一可用(并且仍在维护)的 NFS 配置器似乎是 https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner.
它确实说要使用你自己的供应商,默认的(码头。io/external_storage/nfs-client-provisioner:最新)是两年前的,但我没有自己的供应商。
当我在没有 helm chart 的情况下遵循部署指南并检查 nfs-client-provisioner 日志时,我看到以下内容:
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: Deprecate and Remove SelfLink
引自提到的 KEP:
In v1.16, we will deprecate the SelfLink field in both ObjectMeta and
ListMeta objects by:
documenting in field definition that it is deprecated and is going to
be removed adding a release-note about field deprecation We will also
introduce a feature gate to allow disabling setting SelfLink fields
and opaque the logic setting it behind this feature gate.
In v1.20 (12 months and 4 release from v1.16) we will switch off the feature gate
which will automatically disable setting SelfLinks. However it will
still be possible to revert the behavior by changing value of a
feature gate.
In v1.21, we will get rid of the whole code propagating those fields
and fields themselves. In the meantime, we will go over places
referencing that field (see below) and get rid of those too.
如您所见,您可以使用 featureGate 重新启用它:RemoveSelfLink=false
尽管它没有被推荐并且 SelfLink 将在 v1.21
中永久删除
也在 github 上检查这个问题:Using Kubernetes v1.20.0, getting "unexpected error getting claim reference: selfLink was empty, can't make reference
我在这里看到了同样的问题,但它不仅与自链接提供程序有关。我看到的问题是,自从安装最新版本 (v1.20.1) 以来,我的 'testclaim' pvc 不再能够从存储类 (managed-nfs-storage) 中获取存储空间,之前工作正常1.20.1
因此,作为完整性检查,我使用 v1.17.16 和 v1.19.6 进行了测试,在这两个版本中,testclaim 的状态立即切换为 'Bound',但对于 v1.20.1,pvc 仍然存在状态 'Pending' 并且永远不会更改为 'Bound'。任何人都可以阐明这个问题吗?
Tx!
巴特
使用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 服务器静态清单 /etc/kubernetes/manifests/kube-apiserver.yaml
中添加 --feature-gates=RemoveSelfLink=false
标志,就像这样
spec:
containers:
- command:
- kube-apiserver
- --feature-gates=RemoveSelfLink=false
我按照 Matt 链接的 https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner/issues/25 的帖子中的建议,使用 gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner:v4.0.0
解决了这个问题。
与 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"
}
我使用了 post 建议的特定图像,尽管他们的最新图像可能会有其他修复,因此使用它可能是谨慎的做法。
昨天我创建了一个新的 kubernetes 集群(v1.20.1,on prem),我想添加 NFS 配置。唯一可用(并且仍在维护)的 NFS 配置器似乎是 https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner.
它确实说要使用你自己的供应商,默认的(码头。io/external_storage/nfs-client-provisioner:最新)是两年前的,但我没有自己的供应商。
当我在没有 helm chart 的情况下遵循部署指南并检查 nfs-client-provisioner 日志时,我看到以下内容:
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: Deprecate and Remove SelfLink
引自提到的 KEP:
In v1.16, we will deprecate the SelfLink field in both ObjectMeta and ListMeta objects by: documenting in field definition that it is deprecated and is going to be removed adding a release-note about field deprecation We will also introduce a feature gate to allow disabling setting SelfLink fields and opaque the logic setting it behind this feature gate.
In v1.20 (12 months and 4 release from v1.16) we will switch off the feature gate which will automatically disable setting SelfLinks. However it will still be possible to revert the behavior by changing value of a feature gate.
In v1.21, we will get rid of the whole code propagating those fields and fields themselves. In the meantime, we will go over places referencing that field (see below) and get rid of those too.
如您所见,您可以使用 featureGate 重新启用它:RemoveSelfLink=false
尽管它没有被推荐并且 SelfLink 将在 v1.21
也在 github 上检查这个问题:Using Kubernetes v1.20.0, getting "unexpected error getting claim reference: selfLink was empty, can't make reference
我在这里看到了同样的问题,但它不仅与自链接提供程序有关。我看到的问题是,自从安装最新版本 (v1.20.1) 以来,我的 'testclaim' pvc 不再能够从存储类 (managed-nfs-storage) 中获取存储空间,之前工作正常1.20.1
因此,作为完整性检查,我使用 v1.17.16 和 v1.19.6 进行了测试,在这两个版本中,testclaim 的状态立即切换为 'Bound',但对于 v1.20.1,pvc 仍然存在状态 'Pending' 并且永远不会更改为 'Bound'。任何人都可以阐明这个问题吗?
Tx!
巴特
使用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 服务器静态清单 /etc/kubernetes/manifests/kube-apiserver.yaml
中添加 --feature-gates=RemoveSelfLink=false
标志,就像这样
spec:
containers:
- command:
- kube-apiserver
- --feature-gates=RemoveSelfLink=false
我按照 Matt 链接的 https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner/issues/25 的帖子中的建议,使用 gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner:v4.0.0
解决了这个问题。
与 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"
}
我使用了 post 建议的特定图像,尽管他们的最新图像可能会有其他修复,因此使用它可能是谨慎的做法。