Селфлинк провайдера Kubernetes nfs был пустым

Вчера я создал новый кластер 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 для чего-то другого. Мне просто нужно хранилище для каждого экземпляра модуля, например. volumeClaimTemplates, хранящиеся за пределами моего кластера kubernetes. Если у кого-то есть какие-либо предложения, пожалуйста, дайте мне знать!

Заранее спасибо, Хендрик

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
2
0
14 831
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы видите эту ошибку из-за этого: KEP-1164: устареть и удалить SelfLink

Цитата из упомянутого КЭП:

В версии 1.16 мы удалим поле SelfLink как в ObjectMeta, так и в Объекты ListMeta: документирование в определении поля, что оно устарело и будет будет удалено добавление примечания к выпуску об устаревании поля Мы также ввести функцию, позволяющую отключать настройку полей SelfLink и непрозрачная логика, устанавливающая его за этими воротами функции.

В версии 1.20 (12 месяцев и 4 выпуска из версии 1.16) мы отключим функциональные ворота. который автоматически отключит настройку SelfLinks. Однако это будет по-прежнему можно изменить поведение, изменив значение особенность ворот.

В версии 1.21 мы избавимся от всего кода, распространяющего эти поля. и сами поля. А пока пройдемся по местам со ссылкой на это поле (см. ниже) и избавиться от них тоже.

Как видите, вы можете снова включить его с помощью featureGate: RemoveSelfLink=false хотя это не рекомендуется, и SelfLink будет навсегда удален в версии 1.21.

Также проверьте эту проблему на github: Используя Kubernetes v1.20.0, получаю «неожиданную ошибку при получении ссылки на претензию: selfLink был пуст, не могу сделать ссылку

Я вижу здесь ту же проблему, но дело не только в провайдере самоссылки. Я вижу проблему, заключающуюся в том, что после установки последней версии (v1.20.1) у меня возникла проблема, заключающаяся в том, что мой «testclaim» pvc больше не может запрашивать хранилище из класса хранения (managed-nfs-storage), который отлично работал до 1.20. 1

Итак, в качестве проверки работоспособности я протестировал это как с v1.17.16, так и с v1.19.6, и в обеих версиях статус testclaim сразу переключился на «Привязано», но с v1.20.1 pvc остается в статусе «Ожидание» и никогда не меняется на «Связанный». Кто-нибудь может пролить свет на этот вопрос?

Ткс!

Барт

Как сказал Мэтт, github.com/kubernetes-sigs/nfs-subdir-external-provisioner/… решил это за меня.

Hendrik 21.12.2020 16:12

Используйте 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

Добавьте storageClassName=nfs-provisioner в спецификацию ПВХ

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
spec:
  storageClassName: nfs-provisioner
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 20Gi

Приведенный ниже подход устарел, но, тем не менее, если вы должны его использовать, добавьте флаг --feature-gates=RemoveSelfLink=false в статический манифест сервера API /etc/kubernetes/manifests/kube-apiserver.yaml вот так

spec:
  containers:
  - command:
    - kube-apiserver
    - --feature-gates=RemoveSelfLink=false

Я решил эту проблему, используя 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"
  }

Я использовал конкретное, предложенное в сообщении, хотя вполне вероятно, что их последнее изображение будет иметь дополнительные исправления, поэтому вместо этого было бы разумно использовать его.

Другие вопросы по теме

Похожие вопросы