Руководство по устранению неполадок K8s

Обратите внимание, что полная ментальная карта K8s по устранению неполадок доступна по адресу: K8s Troubleshooting MindMap.

Иногда вы можете видеть, что модули получают статус «Завершение» или «Неизвестно» в кластере K8s. Есть несколько причин, по которым модули могут получить эти два статуса:

  • Период постепенного завершения. Когда модуль удаляется, он переходит в состояние «Завершение», ожидая корректного завершения работы контейнеров. Если для выключения контейнеров требуется больше времени, чем льготный период по умолчанию (обычно 30 секунд), модуль останется в состоянии «Завершение».
  • Финализаторы. Финализаторы — это механизмы, которые позволяют очищать ресурсы перед удалением. Если в модуле присутствует финализатор, а связанное с ним действие очистки зависло или не отвечает, модуль останется в состоянии «Завершение».
  • Контейнеры, не отвечающие. Если контейнер внутри модуля не отвечает на сигналы SIGTERM во время процесса завершения, это может привести к зависанию модуля в состоянии «Завершение».
  • Проблемы с узлом: модули могут получить статус «Неизвестно», если узел, на котором они работают, перестает отвечать на запросы, отключается или возникают другие проблемы. В таких случаях плоскость управления Kubernetes не может определить фактическое состояние модуля.
  • Проблемы с сетью. Проблемы с подключением между узлом и плоскостью управления Kubernetes могут привести к тому, что модуль получит статус «Неизвестно». Например, если плоскость управления не может связаться с узлом, она не может получать обновления статуса от модуля.
  • Проблемы с Kubelet. Если процесс kubelet, запущенный на узле, испытывает проблемы или дает сбой, он может не сообщать о состоянии модуля в плоскость управления, в результате чего модуль переходит в состояние «Неизвестно».

Поиск неисправностей

Мягкий период окончания

Период изящного завершения в K8s — это время, которое дается контейнерам модуля для корректного завершения работы при удалении модуля. В течение этого периода контейнеры получают сигнал SIGTERM, который позволяет им выполнять необходимые задачи очистки, такие как закрытие открытых соединений, завершение текущих задач и освобождение ресурсов до их завершения. Время по умолчанию составляет 30 секунд.

  • Проверьте статус и события модуля: используйте kubectl, чтобы проверить статус и события модуля для получения любой важной информации:
$ kubectl describe pod <pod-name> -n <namespace>
  • Проверьте журналы контейнера:
$ kubectl logs <pod-name> -c <container-name> -n <namespace> --previous
  • Настройте льготный период завершения: если вы обнаружите, что вашим контейнерам постоянно требуется больше времени для завершения работы, вы можете настроить льготный период завершения для модуля, установив поле terminationGracePeriodSeconds в файле YAML модуля.
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  terminationGracePeriodSeconds: 60
  containers:
  - name: my-container
    image: my-image

Финализаторы

Финализаторы — это механизмы, которые позволяют очищать ресурсы перед удалением. Если в модуле присутствует финализатор, а связанное с ним действие очистки зависло или не отвечает, модуль останется в состоянии «Завершение». Например:

apiVersion: v1
kind: Pod
metadata:
  name: my-finalizer-pod
  finalizers:
    - example.com/cleanup
spec:
  containers:
  - name: busybox
    image: busybox
    command: ["sh", "-c", "sleep 3600"]

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

$ kubectl get pod <pod-name> -n <namespace> -o json

Если вы определили, что финализатор не нужен или его можно безопасно удалить, вы можете сделать это с помощью команды kubectl patch. Однако будьте осторожны при этом, так как это может вызвать непреднамеренные побочные эффекты:

$ kubectl patch pod <pod-name> -n <namespace> -p '{"metadata":{"finalizers":["<finalizer-1>", "<finalizer-2>", ...]}}'

Не отвечающие контейнеры

Контейнеры могут перестать отвечать на запросы, если они потребляют слишком много системных ресурсов.

  • Проверьте статус и события Pod с помощью команды kubectl describe:
$ kubectl describe pod <pod-name> -n <namespace>
  • Проверьте журналы пода/контейнера:
$ kubectl logs <pod-name> -c <container-name> -n <namespace>
  • Принудительно удалить модуль: вы можете принудительно удалить застрявший модуль.
$ kubectl delete pod <pod-name> -n <namespace> --force --grace-period=0

Проблемы с узлом/сетью/Kubelet

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

  • Проверьте состояние/события узла: проверьте состояние узла, на котором работает модуль:
$ kubectl describe node <node-name>
$ kubectl get events --field-selector involvedObject.kind=Node,involvedObject.name=<node-name>
  • Проверьте системные журналы узла
$ journalctl -u kubelet
$ journalctl -u docker
$ journalctl -u containerd
$ cat /var/log/messages
  • Опорожнить узел. Если вы обнаружили проблемы с узлом и вам необходимо выполнить техническое обслуживание, вы можете опустошить узел, чтобы безопасно удалить все запущенные модули и пометить узел как незапланированный:
$ kubectl drain <node-name>

Заключение