Предупреждение модуля Kubernetes: 1 узел (а) имел конфликт привязки узла тома

Пытаюсь настроить кластер Kubernetes. У меня есть постоянный том, утверждение постоянного тома и класс хранилища, все настроены и запущены, но когда я хочу создать модуль из развертывания, модуль создается, но он зависает в состоянии ожидания. После описания я получаю только предупреждение «1 узел (а) имеет конфликт сродства узла тома». Может ли кто-нибудь сказать мне, чего мне не хватает в моей конфигурации тома?

apiVersion: v1
kind: PersistentVolume
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: mariadb-pv0
  name: mariadb-pv0
spec:
  volumeMode: Filesystem
  storageClassName: local-storage
  local:
    path: "/home/gtcontainer/applications/data/db/mariadb"
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 2Gi
  claimRef:
    namespace: default
    name: mariadb-claim0
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/cvl-gtv-42.corp.globaltelemetrics.eu
            operator: In
            values:
            - master

status: {}
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
61
0
61 530
8

Ответы 8

почти такая же проблема, описанная здесь ... https://github.com/kubernetes/kubernetes/issues/61620

"Если вы используете локальные тома, и узел выходит из строя, ваш модуль не может быть перенесен на другой узел. Он должен быть запланирован на тот же узел. Это предостережение при использовании локального хранилища, ваш модуль навсегда привязан к одному конкретному узлу. узел."

Есть несколько причин, которые могут вызвать эту ошибку:

  1. Узел не помечен должным образом. У меня была эта проблема на AWS, когда у моего рабочего узла не было соответствующих меток (хотя они были у мастера), например:

    failure-domain.beta.kubernetes.io/region=us-east-2

    failure-domain.beta.kubernetes.io/zone=us-east-2c

    После исправления узла с помощью меток ошибка «1 узел (а) имел конфликт сродства узла тома» исчезла, поэтому PV, PVC с модулем были успешно развернуты. Значение этих меток зависит от поставщика облачных услуг. По сути, это задача поставщика облака (с параметром —cloud-provider, определенным в cube-controller, API-server, kubelet), чтобы установить эти метки. Если соответствующие ярлыки не установлены, проверьте правильность интеграции с CloudProvider. Я использовал kubeadm, поэтому его громоздко настраивать, но с другими инструментами, например, kops, он сразу работает.

  2. Основываясь на вашем определении PV и использовании поля nodeAffinity, вы пытаетесь использовать локальный том (читайте здесь ссылка на описание локального тома, официальные документы), затем убедитесь, что вы установили «поле NodeAffinity» таким образом (в моем случае это работало на AWS):

    nodeAffinity:

         required:
          nodeSelectorTerms:
           - matchExpressions:
             - key: kubernetes.io/hostname
               operator: In
               values:
               - my-node  # it must be the name of your node(kubectl get nodes)
    

Таким образом, после создания ресурса и запуска на нем описания он будет отображаться в таком виде:

         Required Terms:  
                    Term 0:  kubernetes.io/hostname in [your node name]
  1. Определение StorageClass (с именем local-storage, которое здесь не публикуется) должно быть создано с параметром volumeBindingMode, установленным в WaitForFirstConsumer, чтобы локальное хранилище работало правильно. Обратитесь к примеру здесь локальное описание класса хранения, официальный документ, чтобы понять причину этого.

Спасибо за предложение (2) после недавнего обновления / переустановки на моем компьютере с Windows имя по умолчанию моего узла Kubernetes незаметно изменилось с «docker-for-desktop» на «docker-desktop»

morechilli 25.04.2019 17:23

Я использовал для nodeAffinity только имя хоста, а не полное имя хоста, как описано в kubectl get nodes - это была моя ошибка. Большое спасибо!

snukone 01.12.2020 22:01

Ошибка «конфликт сродства узла тома» возникает, когда постоянный том утверждает, что модуль использует запланированные в разных зонах, а не в одной зоне, и поэтому фактический модуль не удалось запланировать, потому что он не может подключиться к тому из другая зона. Чтобы проверить это, вы можете просмотреть подробную информацию обо всех постоянных томах. Чтобы проверить это, сначала получите ваши PVC:

$ kubectl get pvc -n <namespace>

Затем получите подробную информацию о постоянных объемах (не о заявках на объем).

$  kubectl get pv

Найдите PV, которые соответствуют вашим PVC, и опишите их

$  kubectl describe pv <pv1> <pv2>

Вы можете проверить Source.VolumeID для каждого PV, скорее всего, это будут разные зоны доступности, поэтому ваш модуль выдает ошибку сродства. Чтобы исправить это, создайте класс хранения для одной зоны и используйте этот класс хранения в своем PVC.

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: region1storageclass
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
  encrypted: "true" # if encryption required
volumeBindingMode: WaitForFirstConsumer
allowedTopologies:
- matchLabelExpressions:
  - key: failure-domain.beta.kubernetes.io/zone
    values:
    - eu-west-2b # this is the availability zone, will depend on your cloud provider
    # multi-az can be added, but that defeats the purpose in our scenario

Есть ли способ, чтобы том другой зоны был подключен к модулю, запланированному на узле в другой зоне?

Vedant Aggrawal 03.10.2019 05:58

Достаточно ли установки volumeBindingMode: WaitForFirstConsumer на StorageClass по умолчанию?

Sid 03.10.2019 22:17

Это началось с развертывания, которое работало на AWS более месяца. Мне не удалось изменить класс хранилища PVC, поэтому я добавил параметр --force в kubectl apply. Это уничтожило мой том.

Eduardo 08.01.2020 22:11

@Sid Нет, этого было бы недостаточно

Sownak Roy 09.01.2020 18:35

Я исправил это: - удалил PVC и PV - установил volumeBindingMode: WaitForFirstConsumer в классе хранилища вместо Immediate - повторно развернул модуль.

rh0x 25.01.2021 11:44

У меня было по 3 тома в разных зонах, том 1 и 2 были в порядке, но 3 выдавали эту ошибку.

Ajeesh 26.02.2021 11:03

Исправил тоже только с volumeBindingMode: WaitForFirstConsumer. Почему этого не должно быть достаточно?

Fabio Formosa 23.04.2021 09:39

Ошибка "1 узел (а) имел конфликт сходства узлов тома" создается планировщиком, потому что он не может запланировать для вашего модуля узел, который соответствует полю persistenvolume.spec.nodeAffinity в вашем PersistentVolume (PV).

Другими словами, вы говорите в своем PV, что модуль, использующий этот PV, должен быть запланирован для узла с меткой kubernetes.io/cvl-gtv-42.corp.globaltelemetrics.eu = master, но по какой-то причине это невозможно.

Могут быть разные причины, по которым ваш модуль не может быть назначен на такой узел:

  • У пода есть сходства узлов, сродства подов и т. д., Которые конфликтуют с целевым узлом.
  • Целевой узел испорчен
  • Целевой узел достиг предельного количества пакетов на узел.
  • Нет узла с данной меткой

Место для начала поиска причины - это определение узла и модуля.

В моем случае основная причина заключалась в том, что постоянный том находится в us-west-2c, а новые рабочие узлы перезапускаются в us-west-2a и us-west-2b. Решение состоит в том, чтобы либо иметь больше рабочих узлов, чтобы они находились в большем количестве зон, либо удалить / расширить привязку узлов для приложения, чтобы большее количество рабочих узлов соответствовало требованиям для привязки к постоянному тому.

Другой случай от GCP GKE. Предположим, вы используете региональный кластер и создали два PVC. Оба были созданы в разных зонах (вы не заметили).

На следующем шаге вы пытаетесь запустить модуль, в котором оба PVC будут подключены к одному модулю. Вы должны запланировать этот модуль для определенного узла в определенной зоне, но поскольку ваши тома находятся в разных зонах, k8s не сможет запланировать это, и вы получите следующую проблему.

Например - два простых PVC в региональном кластере (узлы в разных зонах):

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: disk-a
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: disk-b
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

Следующий простой модуль:

apiVersion: v1
kind: Pod
metadata:
  name: debug
spec:
  containers:
    - name: debug
      image: pnowy/docker-tools:latest
      command: [ "sleep" ]
      args: [ "infinity" ]
      volumeMounts:
        - name: disk-a
          mountPath: /disk-a
        - name: disk-b
          mountPath: /disk-b
  volumes:
    - name: disk-a
      persistentVolumeClaim:
        claimName: disk-a
    - name: disk-b
      persistentVolumeClaim:
        claimName: disk-b

Наконец, в результате может случиться так, что k8s не сможет запланировать pod, потому что тома находятся в разных зонах.

Отличный ответ Сонака Роя. У меня был такой же случай, когда PV создавался в другой зоне по сравнению с узлом, который должен был его использовать. Решение, которое я применил, было основано на ответе Сонака, только в моем случае было достаточно указать класс хранилища без списка «allowedTopologies», например:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: cloud-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
volumeBindingMode: WaitForFirstConsumer

У меня это работало раньше. Я снова запустил свой кластер через месяц, но столкнулся с той же проблемой. Класс хранения уже применен. :(

Nikhil Utane 31.07.2020 12:40

Скорее всего, вы просто сократили количество узлов в кластере кубернетов, и некоторые «регионы» больше не доступны ...

Кое-что стоит упомянуть ... если ваш под будет находиться в зоне, отличной от зоны постоянного тома, тогда:

  • время доступа к вашему диску значительно снизится (ваше локальное постоянное хранилище больше не является локальным - даже с гипербыстрыми оптоволоконными соединениями Amazon / Google он все еще проходит через центры обработки данных)
  • вы будете платить за «межрегиональную сеть» (в вашем счете AWS это что-то, что входит в «EC2-other», и только после детализации счета Aws вы можете это заметить)

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