Kubernetes Pod Предупреждение: 1 узел имел конфликт близости тома узла

Я пытаюсь создать кластер кубернетов. У меня есть Persistent Volomue, Persistent Volume Claim и Storage, все настройки и запуск, но когда я хочу создавать pod из развертывания, pod создается, но он зависает в состоянии ожидания. После описания я получаю только этот предупреждающий "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: {}

Ответ 1

Ошибка "конфликт сродства узла тома" возникает, когда постоянный том утверждает, что используемый модуль запланирован в разных зонах, а не в одной зоне, и поэтому фактический модуль не может быть запланирован, поскольку он не может подключиться к тому из другая зона. Чтобы проверить это, вы можете увидеть детали всех постоянных томов. Чтобы проверить это, сначала получите ваши 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

Ответ 2

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

  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, чтобы локальное хранилище работало должным образом. Обратитесь к примеру здесь, локальное описание класса хранения, официальный документ, чтобы понять причину этого.

Ответ 3

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

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

Ответ 4

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

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

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

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

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