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
Есть несколько вещей, которые могут вызвать эту ошибку:
-
Узел не помечен правильно. У меня была эта проблема в 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, он работает сразу.
-
Исходя из определения 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]
- Определение 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 на узел"
- Не существует узла с данной меткой
Место, где можно начать поиск причины, - это определение узла и модуля.