Сложность самой системы и отсутствие хоть сколько-нибудь подробной информации о возникающих ошибках усугубляют и без того нетривиальный процесс диагностики в работе платформы. Неполадки в Kubernetes решаются путем выявления, диагностики и решения проблем, возникающих в кластерах, узлах, модулях или контейнерах.
В более широком смысле устранение неполадок Kubernetes также включает эффективное управление сбоями и принятие мер для предотвращения проблем в компонентах Kubernetes.
В некоторых случаях неполадки могут быть вызваны целым комплексом проблем. В руководстве ниже мы сосредоточим внимание на наиболее важных аспектах для решения этих проблем:
Для эффективного устранения неполадок в кластере Kubernetes условно весь процесс траблшутинга можно представить основанным на трех ключевых подпунктах: понимание самой проблемы, управление и устранение неполадки, а также предотвращение повторения проблемы в будущем.
В среде Kubernetes порой может быть довольно сложно выяснить, что произошло, и определить основную причину проблемы. Как правило, для этого требуется ряд некоторых действий:
В идентификации проблемы может помочь комплексное использование целого ряда инструментов, среди них:
В архитектуре микросервисов обычно каждый компонент разрабатывается и управляется отдельной командой разработчиков. Поскольку производственные инциденты часто связаны с взаимодействием между несколькими компонентами, наличие контакта между разработчиками необходимо для быстрого устранения проблем.
Есть три подхода к устранению выявленной проблемы:
Для достижения высоких стандартов по управлению команды разработчиков обычно используют следующие технологии:
На примере наиболее успешных проектов ясно, что предотвращение проблем вносит наибольший вклад в траблшутинг и позволяет заранее ликвидировать многие ошибки в Kubernetes. Превентивный подход значительно сократит время, затрачиваемое на выявление и устранение новых проблем. Профилактика, как правило, включает в себя перечень следующих действий:
Технологии, которые зачастую используются для предотвращения проблем:
Kubernetes - сложная система, и устранение неполадок, возникающих где-то в кластере Kubernetes, требует немало усилий и времени.
Даже в небольшом локальном кластере Kubernetes проблема может быть сложно диагностируемой, поскольку она может быть локализована в отдельном контейнере, в одном или нескольких модулях, контроллере или где-либо еще.
Что еще хуже, Kubernetes часто используется для создания приложений микросервисов, в которых каждый микросервис разрабатывается отдельной командой. В других случаях команды разработки приложений и DevOps работают в одном кластере Kubernetes, что негативно сказывается на разделении ответственности.
Таким образом, в Kubernetes настройка системы может быстро превратиться в хаос, результатом чего станут лишние затраты ресурсов и снижение функциональности приложений. Всего этого можно избежать, если разработчики будут тесно координировать свои действия и использовать набор необходимых инструментов.
Если вы столкнулись с распространенной ошибкой в Kubernetes, проблема наверняка широко изучена другими разработчиками. Вот лишь часть таких ошибок, решение которых мы приведем ниже:
Эта ошибка обычно возникает из-за отсутствия Secret или ConfigMap. Secrets - это объекты Kubernetes, используемые для хранения конфиденциальной информации, как, например, учетные данные. ConfigMaps хранят данные в виде пар ключ-значение и обычно используются для хранения информации о конфигурации, используемой несколькими модулями.
Выполните команду
kubectl get pods
Изучите вывод команды, чтобы определить, имеет ли модуль статус CreateContainerConfigError.
Чтобы получить дополнительную информацию о проблеме, запустите команду
kubectl describe [name]
и найдите сообщение, указывающее, какая именно ConfigMap отсутствует.
Теперь запустите эту команду, чтобы увидеть, существует ли ConfigMap в кластере. Например:
$ kubectl get configmap configmap-3
Если результатом является null, то значит ConfigMap отсутствует, и вам необходимо его создать. Изучите документацию, чтобы узнать, как создать ConfigMap с именем, запрошенным вашим модулем.
Убедитесь, что ConfigMap доступен, снова запустив
get configmap [name]
Если вы хотите просмотреть содержимое ConfigMap в формате YAML, добавьте флаг -o yaml.
Убедившись, что ConfigMap существует, снова запустите
kubectl get pods
и убедитесь, что модуль находится в состоянии Running.
Этот статус означает, что модуль не удалось запустить, поскольку он попытался получить образ контейнера из реестра с ошибкой. Модуль отказывается запускаться, потому что он не может создать один или несколько контейнеров, определенных в его манифесте.
Выполните команду
kubectl get pods
Проверьте вывод команды, чтобы узнать, имеет ли модуль статус ImagePullBackOff или ErrImagePull.
Выполните команду
kubectl describe pod [name]
для проблемного модуля.
В выходных данных этой команды будет указана основная причина проблемы. Результатом может оказаться одна из следующих причин:
Эта проблема указывает на то, что модуль не может быть запланирован на ноде. Это могло произойти из-за того, что у узла недостаточно ресурсов для запуска модуля, или из-за того, что модулю не удалось смонтировать запрошенные тома.
В Kubernetes настройка начинается стандартной командой
kubectl get pods
Проверьте результат вывода и определите, имеет ли модуль статус CrashLoopBackOff.
Выполните команду
kubectl describe pod [name]
для проблемного модуля.
Вывод поможет вам определить причину проблемы. Ниже приведены общие причины:
Когда рабочий узел выключается или выходит из строя, все находящиеся на нем поды с отслеживанием состояния становятся недоступными, а статус узла отображается как NotReady.
Если узел находится в состоянии NotReady более пяти минут (по умолчанию), Kubernetes изменяет состояние запланированных на нем модулей на Unknown и пытается запланировать его на другом узле со статусом ContainerCreating.
Выполните команду
kubectl get nodes
Проверьте вывод команды и убедитесь, что статус узла - NotReady.
Чтобы проверить, перемещаются ли модули, запланированные на вашем узле, на другие узлы, выполните команду
get pods
Проверьте, появляется ли модуль дважды на двух разных узлах.
Если отказавший узел может восстановиться или перезагружается пользователем, проблема разрешится сама собой. После того, как отказавший узел восстанавливается и присоединяется к кластеру, происходит следующий процесс: