Облачная платформаAdvanced

Что делать, если планирование Pod не удалось?

Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

Определение неисправности

Если pod находится в состоянии Pending и события содержат информацию, указывающую на сбой планирования pod, вы можете определить причину на основе событий. Подробности о том, как просматривать события, см. How Can I Locate the Root Cause If a Workload Is Abnormal?

Устранение неполадок

Определите причину на основе событий, перечисленных в Table 1.

Table 1 События, связанные со сбоем планирования pod

Событие

Причина и решение

no nodes available для планирования pods.

В кластере нет доступных узлов.

Пункт проверки 1: Доступен ли узел в кластере

0/2 узлов доступно: 2 Insufficient cpu.

0/2 узлов доступно: 2 Insufficient memory.

Ресурсы (CPU и память) на узле недостаточны.

Пункт проверки 2: Достаточны ли ресурсы узла (CPU и память)

0/2 узлов доступно: 1 узел(ов) didn't match node selector, 1 узел(ов) didn't match pod affinity rules, 1 узел(ов) didn't match pod affinity/anti-affinity.

Конфигурации node и pod affinity являются взаимно исключающимися. Ни один узел не удовлетворяет требованиям pod.

Пункт проверки 3: Конфигурация Affinity и Anti-Affinity рабочей нагрузки

0/2 узлов доступно: 2 узел(ов) had volume node affinity conflict.

Том EVS, смонтированный к pod, и узел находятся в разных AZ.

Пункт проверки 4: Находятся ли том Workload и узел в одной AZ

0/1 узлов доступно: 1 узел(ов) had taints that the pod didn't tolerate.

На узле есть некоторые taints, и pod не может их терпеть.

Пункт проверки 5: Tolerations pod

0/7 узлов доступно: 7 Insufficient ephemeral-storage.

Эфемерное пространство хранения на узле недостаточно.

Пункт проверки 6: Использование Ephemeral Volume

0/1 узлов доступно: 1 everest driver not found at node

everest-csi-driver на узле не находится в рабочем состоянии.

Пункт проверки 7: Работает ли дополнение CCE Container Storage (Everest) корректно

Failed to create pod sandbox: ...

Создайте больше свободного места в thin pool или используйте параметр dm.min_free_space, чтобы изменить поведение

The node thin pool space is insufficient.

Пункт проверки 8: Достаточно ли места в Thin Pool

0/1 nodes are available: 1 Too many pods.

The number of pods scheduled to the node exceeds the maximum allowed.

Пункт проверки 9: У узла слишком много запланированных pod‑ов

UnexpectedAdmissionError Allocate failed due to not enough cpus available to satisfy request, which is unexpected.

The kubelet static CPU pinning is abnormal due to a known community issue.

Пункт проверки 10: Является ли статическое привязывание CPU kubelet аномальным

Пункт проверки 1: Доступен ли узел в кластере

Вы можете войти в консоль CCE и проверить, имеет ли статус узла значение Available. Вы также можете использовать следующую команду, чтобы проверить, имеет ли статус узла значение Ready:

$ kubectl get node
NAME STATUS ROLES AGE VERSION
192.168.0.37 Ready <none> 21d v1.19.10-r1.0.0-source-121-gb9675686c54267
192.168.0.71 Ready <none> 21d v1.19.10-r1.0.0-source-121-gb9675686c54267

Если статус всех узлов Not Ready, это означает, что в кластере нет доступных узлов.

Решение

  • Добавьте узел. Если для нагрузки не настроено правило аффинности, pod будет автоматически запланирован на новый узел, чтобы обеспечить корректную работу сервиса.
  • Найдите недоступные узлы и исправьте ошибки. Для получения подробной информации см. What Should I Do If a Cluster Is Available But Some Nodes in It Are Unavailable?
  • Сбросьте недоступные узлы.

Пункт проверки 2: Достаточны ли ресурсы узла (CPU и память)

0/2 nodes are available: 2 Insufficient cpu. указывает, что CPU недостаточно.

0/2 nodes are available: 2 Insufficient memory. указывает, что память недостаточна.

Если ресурсы, запрашиваемые pod, превышают выделяемые ресурсы на узле, где pod будет запущен, планирование pod на узел обязательно завершится неудачей из‑за недостатка ресурсов узла.

Если на узле выделяемых ресурсов меньше, чем запрашивает pod, планирование pod завершится неудачей.

Решение

Добавьте больше узлов в кластер. Scale-out является распространённым решением при недостатке ресурсов.

Пункт проверки 3: Конфигурация Affinity и Anti-Affinity рабочей нагрузки

Несоответствующие политики affinity приведут к неудаче планирования pod.

Например, для рабочей нагрузки 1 и рабочей нагрузки 2 настроена политика anti-affinity. Они работают на узле 1 и узле 2 соответственно.

Если вы попытаетесь настроить политику affinity для рабочей нагрузки 3 и рабочей нагрузки 2, а затем развернёте рабочую нагрузку 3 на узле, отличном от того, где размещена рабочая нагрузка 2, например на узле 1, это вызовет конфликт и приведёт к ошибке развертывания рабочей нагрузки.

0/2 nodes are available: 1 node(s) не соответствует node selector, 1 node(s) не соответствует pod affinity rules, 1 node(s) не соответствует pod affinity/anti-affinity.

  • node selector указывает, что node affinity не выполнено.
  • pod affinity rules indicate that the pod affinity is not met.
  • pod affinity/anti-affinity indicates that the pod affinity and anti-affinity are not met.

Решение

  • При настройке политик workload‑workload affinity и workload‑node affinity убедитесь, что эти политики не конфликтуют друг с другом, иначе развертывание рабочей нагрузки завершится с ошибкой.
  • Для рабочей нагрузки с настроенной политикой node affinity необходимо убедиться, что supportContainer в метке узла affinity имеет значение true. В противном случае pod‑ы не могут быть запланированы на узел, и будет сгенерировано следующее событие:
    No nodes are available that match all of the following predicates: MatchNode Selector, NodeNotSupportsContainer

    Если значение равно false, планирование pod‑ов завершится с ошибкой.

Пункт проверки 4: находятся ли Workload's Volume и узел в одной AZ

0/2 nodes are available: 2 node(s) had volume node affinity conflict. indicates that an affinity conflict occurs between the volume mounted to the pod and the host node. As a result, the pod scheduling fails.

Это происходит потому, что диски EVS нельзя подключать к узлам, находящимся в разных AZ от дисков EVS. Например, pod рабочей нагрузки с томом EVS в AZ 1 не может быть запланирован на узел в AZ 2.

По умолчанию тома EVS, созданные в CCE, имеют настройки affinity, как показано ниже.

kind: PersistentVolume
apiVersion: v1
metadata:
name: pvc-c29bfac7-efa3-40e6-b8d6-229d8a5372ac
spec:
...
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: failure-domain.beta.kubernetes.io/zone
operator: In
values:
-

Решение

В AZ, где находится узел рабочей нагрузки, создайте том. Либо создайте идентичную рабочую нагрузку и выберите автоматически назначенный том облачного хранилища.

Пункт проверки 5: tolerations pod‑а

0/1 nodes are available: 1 node(s) had taints that the pod didn't tolerate. indicates that there are some taints on the node, and the pod cannot tolerate these taints.

В этом случае вы можете проверить taints на узле. Если отображается информация, похожая на следующую, на узле присутствуют некоторые taints:

$ kubectl describe node 192.168.0.37
Name: 192.168.0.37
...
Taints: key1=value1:NoSchedule
...

В некоторых случаях система автоматически добавляет taint к узлу. Встроенные taint включают:

  • node.kubernetes.io/not-ready: Узел не готов.
  • node.kubernetes.io/unreachable: Контроллер узла не может получить доступ к узлу.
  • node.kubernetes.io/memory-pressure: Узел находится под давлением памяти.
  • node.kubernetes.io/disk-pressure: Узел находится под давлением диска. В этом случае следуйте инструкциям, описанным в Check Item 4: Whether the Node Disk Space Is Insufficient, чтобы решить проблему.
  • node.kubernetes.io/pid-pressure: Узел находится под давлением PID.
  • node.kubernetes.io/network-unavailable: Сеть узла недоступна.
  • node.kubernetes.io/unschedulable: Узел не может быть запланирован.
  • node.cloudprovider.kubernetes.io/uninitialized: Когда kubelet запускается с указанием внешнего драйвера облачной платформы, он добавляет taint к узлу, помечая его как недоступный. После того как cloud-controller-manager инициализирует узел, kubelet удаляет taint.

Решение

Чтобы запланировать pod на узел, используйте любой из следующих методов:

  • Если taint добавлен пользователем, вы можете удалить taint на узле. Если taint automatically added by the system, taint будет автоматически удалён после устранения неисправности.
  • Укажите toleration для pod, содержащий taint. Подробности см. в Taints and Tolerations.
    apiVersion: v1
    kind: Pod
    metadata:
    name: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:alpine
    tolerations:
    - key: "key1"
    operator: "Equal"
    value: "value1"
    effect: "NoSchedule"

Check Item 6: Ephemeral Volume Usage

0/7 nodes are available: 7 Insufficient ephemeral-storage. указывает, что на узле недостаточно места для временного хранилища.

В этом случае вы можете проверить, ограничено ли пространство временного тома подом. Если требуемое приложением пространство временного тома превышает существующую ёмкость на узле, приложение не может быть запланировано на этот узел. Чтобы решить проблему, измените пространство временного тома или увеличьте ёмкость диска на узле.

apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: app
image: images.my-company.example/app:v4
resources:
requests:
ephemeral-storage: "2Gi"
limits:
ephemeral-storage: "4Gi"
volumeMounts:
- name: ephemeral
mountPath: "/tmp"
volumes:
- name: ephemeral
emptyDir: {}

Чтобы получить общую ёмкость (Capacity) и доступную ёмкость (Allocatable) временных томов на узле, выполните команду kubectl describe node и проверьте запрос памяти и ограничение выделенного временного тома на узле.

Ниже приведён пример вывода:

...
Capacity:
cpu: 4
ephemeral-storage: 61607776Ki
hugepages-1Gi: 0
hugepages-2Mi: 0
localssd: 0
localvolume: 0
memory: 7614352Ki
pods: 40
Allocatable:
cpu: 3920m
ephemeral-storage: 56777726268
hugepages-1Gi: 0
hugepages-2Mi: 0
localssd: 0
localvolume: 0
memory: 6180752Ki
pods: 40
...
Allocated resources:
(Total limits may be over 100 percent, i.e., overcommitted.)
Resource Requests Limits
-------- -------- ------
cpu 1605m (40%) 6530m (166%)
memory 2625Mi (43%) 5612Mi (92%)
ephemeral-storage 0 (0%) 0 (0%)
hugepages-1Gi 0 (0%) 0 (0%)
hugepages-2Mi 0 (0%) 0 (0%)
localssd 0 0
localvolume 0 0
Events: <none>

Пункт проверки 7: Работает ли дополнение CCE Container Storage (Everest) корректно

0/1 nodes are available: 1 everest driver not found at node. указывает на то, что everest-csi-driver из CCE Container Storage (Everest) не запущен корректно на узле.

В этом случае вы можете проверить демон с именем everest-csi-driver в пространстве имён kube-system и убедиться, что pod запущен корректно. Если нет, удалите pod. Демон перезапустит другой pod.

Пункт проверки 8: Достаточно ли пространства Thin Pool

Для kubelet и среды выполнения контейнеров будет подключён отдельный диск с данными к новому узлу. Если пространство диска с данными недостаточно, pod не может быть создан на узле.

Решение 1: Очистка образов

Выполните следующие действия для очистки неиспользуемых образов:

  • Узлы, использующие containerd
    1. Получите локальные образы на узле.
      crictl images -v
    2. Удалите ненужные образы по ID образа.
      crictl rmi {Image ID}
  • Узлы, использующие Docker
    1. Получите локальные образы на узле.
      docker images
    2. Удалите ненужные images по image ID.
      docker rmi {image-ID}
Note

Do not delete system images, such as the cce-pause image. Otherwise, the pod creation may fail.

Решение 2: Расширение ёмкости диска

Чтобы расширить ёмкость диска, выполните следующие действия:

  1. Увеличьте ёмкость Диска с данными в консоли EVS.

    Только ёмкость хранилищ EVS‑дисков может быть расширена. Для расширения ёмкости логических томов и файловых систем необходимо выполнить следующие действия.

  2. Log in to the CCE console and click the cluster name to access the cluster console. In the navigation pane, choose Nodes. In the right pane, click the Nodes tab, locate the row containing the node, and choose More > Sync Server Data in the Operation column.
  3. Войдите в node.
  4. Run lsblk to view the block device information of the node.

    A data disk is divided depending on the container storage Rootfs:

Пункт проверки 9: Слишком ли много Pods запланировано на узел

0/1 nodes are available: 1 Too many pods. указывает, что на узел запланировано чрезмерное количество Pods.

При создании узла настройте Max. Pods в разделе Advanced Settings, чтобы указать максимальное количество Pods, которое может корректно работать на узле. Значение по умолчанию зависит от флейвора узла. При необходимости вы можете изменить значение.

На странице Nodes получите значение Pods (Allocated/Total Available Addresses/Total) узла и проверьте, достигло ли количество Pods, запланированных на узел, верхнего предела. Если да, добавьте узлы или измените максимальное количество Pods.

Чтобы изменить максимальное количество Pods, которое может работать на узле, выполните следующее:

  • Для узлов в пуле узлов по умолчанию: измените значение Max. Pods при сбросе узла.
  • Для узлов в пользовательском пуле узлов: измените значение параметра пула узлов max-pods.

Пункт проверки 10: является ли статическое закрепление CPU kubelet аномальным

Если pod имеет init‑container с запросом CPU, отличным от настроек основного контейнера, и ему назначен класс QoS Guaranteed, в то время как kubelet использует статическое закрепление CPU (с параметром cpuManagerPolicy, установленным в static), планирование pod может завершиться неудачей, что приводит к ошибке UnexpectedAdmissionError.

Проблема, связанная с сообществом: https://github.com/kubernetes/kubernetes/issues/112228

Решение

Установите запрос CPU для init‑container в десятичное значение, соответствующее лимиту CPU, и избегайте использования закрепления CPU.

Например: основной контейнер: {"limits":{"cpu":"7","memory":"60G"},"requests":{"cpu":"7","memory":"60G"}}; init‑container: {"limits":{"cpu":"6.9","memory":"60G"},"requests":{"cpu":"6.9","memory":"60G"}}