Руководство по устранению неполадок 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>