Достигнут лимит подов на узлах Kubernetes
На отдельных управляющих узлах кластера Kubernetes достигнут лимит количества подов. Из-за этого новые поды сервисов не могут развернуться на этих узлах.
Проблема возникает, если поды распределены между узлами неравномерно. Пример: после расширения кластера или замены узлов новые поды назначаются только на часть узлов, а остальные остаются свободными.
Выполните ручную ребалансировку — перераспределите поды с переполненных узлов на свободные.
Нельзя перемещать между узлами:
-
Поды из пространства имен
kube-systemи поды, созданные ресурсамиStatefulSetиDaemonSet.Пример: поды
calico-node-*из пространства именkube-systemдолжны находиться на каждом узле Kubernetes, а подыrabbitmq-*из пространства именrabbitmqдолжны размещаться на разных узлах: два пода изStatefulSetrabbitmq-*не могут находиться на одном узле согласно политикеanti-affinity. -
Поды из пространства имен
rabbitmq. Это может повлечь нарушение работы ключевых сервисов VK Private Cloud (Neutron, Nova, Cinder).
Перемещать между узлами можно поды, созданные ресурсом типа Deployment. Это большинство подов в пространствах имен, отличных от rabbitmq, keycloak-vkcloud и kube-system.
-
Проверьте количество подов на узлах кластера:
# for n in $(kubectl get nodes -o name | awk -F '/' '{print $2}');do echo "$n: $(kubectl get pods -A --field-selector spec.nodeName=$n --no-headers | wc -l)"doneЕсли на каких-либо узлах количество подов значительно больше, чем на остальных узлах, такие узлы считаются переполненными. Выполните их ребалансировку.
-
Запретите размещение новых подов на переполненных узлах:
# kubectl cordon <ИМЯ_УЗЛА>Здесь
<ИМЯ_УЗЛА>— имя переполненного узла из вывода командыkubectl get nodes. -
Проверьте, поды каких пространств имен занимают больше всего слотов на переполненных узлах:
# kubectl get pods -A --field-selector spec.nodeName=<ИМЯ_ПЕРЕПОЛНЕННОГО_УЗЛА> -o json | jq -r '.items[] | [.metadata.namespace, (.metadata.ownerReferences[0].kind // "static"), .metadata.name] | @tsv' | sort | awk '{print $1"\t"$2}' | uniq -c | sort -rnЗдесь
<ИМЯ_УЗЛА>— имя переполненного узла из вывода командыkubectl get nodes.Чтобы проверить на всех узлах кластера:
# for n in $(kubectl get nodes -o name | awk -F '/' '{print $2}'); doecho $n && kubectl get pods -A --field-selector spec.nodeName=${n} -o json | jq -r '.items[] | [.metadata.namespace, (.metadata.ownerReferences[0].kind // "static"), .metadata.name] | @tsv' | sort | awk '{print $1"\t"$2}' | uniq -c | sort -rn;done -
Определите, какие пространства имен можно безопасно разгрузить удалением подов с переполненных узлов, и удалите эти поды:
# for pod in $(kubectl get pods -n <ПРОСТРАНСТВО_ИМЕН> -o wide | grep <ИМЯ_УЗЛА> | awk -F ' ' '{print $1}'); dokubectl delete pod -n <ПРОСТРАНСТВО_ИМЕН> ${pod}doneЗдесь:
<ИМЯ_УЗЛА>— имя переполненного узла из вывода командыkubectl get nodes.<ПРОСТРАНСТВО_ИМЕН>— имя пространства имен.
-
Дождитесь, пока поды удалятся с переполненных узлов и создадутся на свободных узлах.
-
Проверьте количество подов на узлах кластера:
# for n in $(kubectl get nodes -o name | awk -F '/' '{print $2}');do echo "$n: $(kubectl get pods -A --field-selector spec.nodeName=$n --no-headers | wc -l)"done -
Если поды распределены по узлам равномерно, снимите запрет размещения подов:
# kubectl uncordon <ИМЯ_УЗЛА>Здесь
<ИМЯ_УЗЛА>— имя узла из вывода командыkubectl get nodes, на который ранее был установлен запрет на размещение новых подов.