VK Private Cloud logo
Помощь
Обновлена 8 октября 2026 г. в 09:12

Достигнут лимит подов на узлах Kubernetes

Компонент
Kubernetes

На отдельных управляющих узлах кластера Kubernetes достигнут лимит количества подов. Из-за этого новые поды сервисов не могут развернуться на этих узлах.

Проблема возникает, если поды распределены между узлами неравномерно. Пример: после расширения кластера или замены узлов новые поды назначаются только на часть узлов, а остальные остаются свободными.

Решение

Выполните ручную ребалансировку — перераспределите поды с переполненных узлов на свободные.

Нельзя перемещать между узлами:

  • Поды из пространства имен kube-system и поды, созданные ресурсами StatefulSet и DaemonSet.

    Пример: поды calico-node-* из пространства имен kube-system должны находиться на каждом узле Kubernetes, а поды rabbitmq-* из пространства имен rabbitmq должны размещаться на разных узлах: два пода из StatefulSet rabbitmq-* не могут находиться на одном узле согласно политике anti-affinity.

  • Поды из пространства имен rabbitmq. Это может повлечь нарушение работы ключевых сервисов VK Private Cloud (Neutron, Nova, Cinder).

Перемещать между узлами можно поды, созданные ресурсом типа Deployment. Это большинство подов в пространствах имен, отличных от rabbitmq, keycloak-vkcloud и kube-system.

  1. Проверьте количество подов на узлах кластера:

    # 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

    Если на каких-либо узлах количество подов значительно больше, чем на остальных узлах, такие узлы считаются переполненными. Выполните их ребалансировку.

  2. Запретите размещение новых подов на переполненных узлах:

    # kubectl cordon <ИМЯ_УЗЛА>

    Здесь <ИМЯ_УЗЛА> — имя переполненного узла из вывода команды kubectl get nodes.

  3. Проверьте, поды каких пространств имен занимают больше всего слотов на переполненных узлах:

    # 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}'); do  echo $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
  4. Определите, какие пространства имен можно безопасно разгрузить удалением подов с переполненных узлов, и удалите эти поды:

    # for pod in $(kubectl get pods -n <ПРОСТРАНСТВО_ИМЕН> -o wide | grep <ИМЯ_УЗЛА> | awk -F ' ' '{print $1}'); do  kubectl delete pod -n <ПРОСТРАНСТВО_ИМЕН> ${pod}done

    Здесь:

    • <ИМЯ_УЗЛА> — имя переполненного узла из вывода команды kubectl get nodes.
    • <ПРОСТРАНСТВО_ИМЕН> — имя пространства имен.
  5. Дождитесь, пока поды удалятся с переполненных узлов и создадутся на свободных узлах.

  6. Проверьте количество подов на узлах кластера:

    # 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
  7. Если поды распределены по узлам равномерно, снимите запрет размещения подов:

    # kubectl uncordon <ИМЯ_УЗЛА>

    Здесь <ИМЯ_УЗЛА> — имя узла из вывода команды kubectl get nodes, на который ранее был установлен запрет на размещение новых подов.

Была ли статья полезна?