Когда узел находится в ненормальном состоянии, Kubernetes будет выселять некоторые pods на узле, чтобы обеспечить доступность нагрузки.
В Kubernetes как kube-controller-manager, так и kubelet могут выселять pods.
kube-controller-manager состоит из нескольких контроллеров, а выселение реализовано node controller. Node controller периодически проверяет статус всех узлов. Если узел находится в состоянии NotReady в течение определённого времени, все pods на узле будут выселены.
kube-controller-manager поддерживает следующие параметры запуска:
Если ресурсы узла исчерпываются, kubelet применяет политику выселения, основываясь на приоритете pod, использовании ресурсов и запросе ресурсов. Если у pods одинаковый приоритет, первым будет выселен pod, который использует наибольшее количество ресурсов или запрашивает их больше всего.
kube-controller-manager выселяет все pods на неисправном узле, тогда как kubelet выселяет некоторые pods на неисправном узле. kubelet периодически проверяет ресурсы памяти и диска узлов. Если ресурсов недостаточно, он выселит некоторые pods в зависимости от приоритета. Подробную информацию о приоритете выселения pod см. в Pod selection for kubelet eviction.
Существуют мягкие пороги выселения и жёсткие пороги выселения.
Вы можете настроить мягкие пороги выселения, используя следующие параметры:
Вы можете настроить жёсткие пороги выселения, используя следующие параметры:
eviction-hard: указывает жёсткий порог выселения. Когда eviction signal узла достигает определённого порога, например, memory.available<1Gi, то есть когда доступная память узла менее 1 ГиБ, выселение pod‑а будет инициировано немедленно.
kubelet поддерживает следующие значения по умолчанию для жёстких порогов выселения:
kubelet также поддерживает другие параметры:
Если pod'ы не выселяются при неисправности узла, выполните следующие действия для определения причины неисправности:
После выполнения следующей команды вывод показывает, что многие pod'ы находятся в состоянии Evicted.
kubectl get pods
Результаты проверки будут записаны в журналы kubelet узла. Вы можете выполнить следующую команду для поиска информации:
Проблемы здесь описаны в порядке их вероятности возникновения.
Проверяйте эти причины одну за другой, пока не найдёте причину неисправности.
Если узел испытывает нехватку ресурсов, kubelet изменит node status и добавит taints к узлу. Выполните следующие действия, чтобы проверить, существует ли соответствующий taint на узле:
$ kubectl describe node 192.168.0.37Name: 192.168.0.37...Taints: key1=value1:NoSchedule...
Node Status | Taint | Eviction Signal | Description |
|---|---|---|---|
MemoryPressure | node.kubernetes.io/memory-pressure | memory.available | Доступная память на узле достигает порогов выселения. |
DiskPressure | node.kubernetes.io/disk-pressure | nodefs.available, nodefs.inodesFree, imagefs.available or imagefs.inodesFree | Доступное дисковое пространство и inode на корневой файловой системе или файловой системе образа узла достигают порогов выселения. |
PIDPressure | node.kubernetes.io/pid-pressure | pid.available | Доступный идентификатор процесса на узле ниже порогов выселения. |
Используйте kubectl или найдите строку, содержащую целевую рабочую нагрузку, и выберите More > Edit YAML в столбце Operation, чтобы проверить, настроена ли toleration для рабочей нагрузки. Подробности см. в Taints and Tolerations.
В кластере с менее чем 50 рабочими узлами, если количество неисправных узлов составляет более 55 % от общего числа узлов, выселение pod будет приостановлено. В этом случае Kubernetes не будет пытаться выселять рабочую нагрузку с неисправного узла. Подробности см. в Rate limits on eviction.
Выселенный pod будет часто планироваться на исходный узел.
Возможная причина
Pod'ы на узле выселяются на основе использования ресурсов узла. Выселенные pod'ы планируются на основе выделенных ресурсов узла. Выселение и планирование основаны на разных правилах. Поэтому выселенный контейнер может быть снова запланирован на исходный узел.
Решение
Правильно выделяйте ресурсы каждому контейнеру.
Pod рабочей нагрузки постоянно сбоит и повторно деплоится.
Анализ
После того как pod будет выгнан и запланирован на новый узел, если pods в этом узле также выгнаны, pod будет выгнан снова. Pods могут быть выгнаны многократно.
Если pod выгнан kube-controller-manager, он будет находиться в состоянии Terminating. Этот pod будет автоматически удалён только после восстановления узла, на котором расположен контейнер. Если узел был удалён или не может быть восстановлен по другим причинам, вы можете принудительно удалить pod.
Если pod выгнан kubelet, он будет находиться в состоянии Evicted. Этот pod используется только для последующего поиска неисправностей и может быть удалён напрямую.
Решение
Выполните следующую команду для удаления выгнанных pod'ов:
kubectl get pods -n <namespace> | grep Evicted | awk '{print $1}' | xargs kubectl delete pod -n <namespace>
В предыдущей команде \u003cnamespace\u003e указывает имя пространства имён. Настройте его в соответствии с вашими требованиями.