【问题标题】:Kubernetes nfs provider selfLink was emptyKubernetes nfs 提供者 selfLink 为空
【发布时间】:2021-03-30 05:53:29
【问题描述】:

昨天我创建了一个新的 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-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 集群之外。如果有人有任何建议,请告诉我!

提前致谢, 亨德里克

【问题讨论】:

    标签: kubernetes storage nfs


    【解决方案1】:

    您看到此错误是因为:KEP-1164: Deprecate and Remove SelfLink

    引自提到的 KEP:

    在 v1.16 中,我们将弃用 ObjectMeta 和 ListMeta 对象: 在字段定义中记录它已被弃用并且将要使用 被删除添加关于字段弃用的发行说明我们还将 引入功能门以允许禁用设置 SelfLink 字段 并且不透明将其设置在此功能门后面的逻辑。

    在 v1.20(12 个月和 v1.16 的 4 个版本)中,我们将关闭功能门 这将自动禁用设置 SelfLinks。但是会 仍然可以通过更改 a 的值来恢复行为 功能门

    在 v1.21 中,我们将摆脱传播这些字段的整个代码 和字段本身。与此同时,我们会去一些地方 引用该字段(见下文)并删除这些字段。

    如您所见,您可以使用 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

    【讨论】:

      【解决方案2】:

      我在这里看到了同样的问题,但它不仅与 selflink 提供程序有关。我看到的问题是,自从安装最新版本 (v1.20.1) 以来,我的“testclaim”pvc 不再能够从存储类 (managed-nfs-storage) 中请求存储,这在 1.20 之前运行良好。 1

      因此,作为健全性检查,我使用 v1.17.16 和 v1.19.6 对此进行了测试,并且在这两个版本中,testclaim 的状态立即切换为“绑定”,但在 v1.20.1 中,pvc 仍处于状态“ Pending' 并且永远不会更改为 'Bound'。谁能解释一下这个问题?

      发送!

      巴特

      【讨论】:

      【解决方案3】:

      使用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
      

      【讨论】:

        【解决方案4】:

        我通过使用 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"
          }
        

        我使用了帖子建议的特定图像,尽管他们最近的图像可能会有额外的修复,因此可能谨慎使用它。

        【讨论】:

          猜你喜欢
          • 2021-10-13
          • 2021-03-08
          • 2020-09-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-02
          • 2013-10-08
          • 2013-04-08
          相关资源
          最近更新 更多