Kubernetes nfs provider selfLink was empty



昨天我创建了一个新的 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

最新更新