☸️ Как исследовать проблемы контейнеров Kubernetes с помощью “Kubectl Debug” |

☸️ Как исследовать проблемы контейнеров Kubernetes с помощью “Kubectl Debug”

Мануал

Диагностика проблем с запущенными рабочими нагрузками Kubernetes может быть непростой задачей.

Вам может повезти, и вы найдете причину в логах приложения с помощью команды kubectl logs.

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

Команда kubectl debug упрощает эти задачи отладки, предоставляя новый эфемерный контейнер внутри вашего пода.

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

Подготовка к использованию Kubectl Debug

kubectl debug был запущен в версии v1.18 Kubernetes и Kubectl

Он зависит от наличия эфемерных контейнеров в вашем кластере.

Эфемерные контейнеры стали бета-функцией в Kubernetes v1.23 и теперь включены по умолчанию.

Вам нужно будет вручную включить функцию gate, если в вашем кластере используется более старая версия Kubernetes.

Эфемерные контейнеры предназначены для транзитных задач, когда вам нужно временно подключить дополнительный контейнер к существующему поду.

Это идеально подходит для отладочных операций, когда вы хотите проверить поды, не затрагивая живые экземпляры контейнеров.

Использование Kubectl Debug

Прежде чем продолжить, разверните деплоймент для использования в целях тестирования:

kubectl create deployment nginx --image=nginx:latest
deployment.apps/nginx created

Затем используйте команду get pods, чтобы найти имя пода:

kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-55649fd747-qsnr2   1/1     Running   0          5s

Под нашего развертывания называется nginx-55649fd747-qsnr2.

Теперь вы можете использовать команду kubectl debug для запуска сеанса отладки внутри вашего Pod:

kubectl debug -it --image=ubuntu:20.04 nginx-55649fd747-qsnr2

Синтаксис команды похож на гибрид kubectl create и kubectl log.

Аргумент –image указывает образ, который будет использоваться для нового контейнера.

Мы используем здесь ubuntu:20.04, чтобы получить доступ к знакомым командам, входящим в дистрибутив Ubuntu Linux.

Флаг -it эквивалентен –stdin –tty.

Включение этих аргументов выделит TTY для контейнера, подключится к нему и подключит поток stdin вашего терминала. Таким образом, вы получите интерактивную оболочку внутри вашего нового контейнера.

Теперь вы можете выполнять задачи по отладке внутри вашего эфемерного контейнера.

Копирование подов

Другой способ использования kubectl debug – это аргумент –copy-to.

При этом создается копия целевого пода добавляется эфемерный контейнер в копию.

Оригинальный под остается нетронутым.

kubectl debug -it --image=ubuntu:20.04 --copy-to nginx-debug nginx-555649fd747-qsnr2

Эта функция дает вам еще большую уверенность в том, что изменения, внесенные во время отладки, не повлияют непосредственно на ваше производственное приложение.

Копирование пода также позволяет активировать совместное использование пространства имен процессов.

Это делает существующие процессы в пода видимыми для вашего эфемерного контейнера.

Это нельзя использовать с существующими контейнерами, так как их поле spec.shareProcessNamespace обычно имеет значение false.

Запуск kubectl debug с флагами –copy-to и –share-processes включит совместное использование процессов на копируемом пода, что делает эту процедуру гораздо более интуитивной:

kubectl debug -it --image=ubuntu:20.04 --copy-to nginx-debug --share-processes nginx-555649fd747-qsnr2
Список процессов, видимых в вашем эфемерном контейнере Ubuntu, теперь будет включать процесс NGINX:
ps ax
PID   USER     TIME  COMMAND
1 root      0:00 /pause
9 root      0:00 nginx: master process nginx -g daemon off;

Этот процесс все еще выполняется в отдельном контейнере NGINX внутри вашего пода.

Совместное использование пространства имен также обеспечивает доступ к файловой системе целевого контейнера через /proc:

ls /proc/9/root/etc/nginx
conf.d fastcgi_params mime.types modules nginx.conf ...

Поэтому копирование пода таким образом является мощным инструментом отладки.

Вы можете легко проверить файлы и процессы пода, используя отдельный контейнер, подготовленный с помощью знакомых инструментов.

Необязательные аргументы

Флаг –copy-to по умолчанию всегда оставляет исходный под нетронутым.

Вы можете заставить операцию действовать как замена вместо этого, используя –replace.

Это остановит первый под.

kubectl debug -it --image=ubuntu:20.04 --copy-to nginx-debug --replace nginx-555649fd747-qsnr2
Kubernetes назначит скопированный под на любой доступный хост.
Это может быть проблематично, если вы хотите обеспечить согласованную тестовую среду.
Добавление –same-node запланирует копию на существующий узел под, устраняя любые различия, которые могут существовать между машинами в вашем кластере.
kubectl debug -it --image=ubuntu:20.04 --copy-to nginx-debug --same-node nginx-555649fd747-qsnr2
Другой полезной опцией является –env для установки дополнительных переменных окружения внутри вашего эфемерного контейнера.
Это может понадобиться для настройки инструментов отладки или переопределения значений, унаследованных от целевого пода.
kubectl debug -it --image=ubuntu:20.04 --copy-to nginx-debug --env EDITOR=/usr/bin/nano nginx-555649fd747-qsnr2

Наконец, помните, что контейнеры, созданные с помощью kubectl debug, не обязательно должны быть интерактивными.

Вы можете легко выполнять одноразовые команды для своих контейнеров, используя синтаксис, подобный kubectl exec.

Аргумент –attach поддерживается для управления тем, подключена ли ваша оболочка к контейнеру, когда вы не выполняете команду -i (–stdin).

kubectl debug --image=ubuntu:20.04 --copy-to nginx-debug --share-processes --attach true nginx-555649fd747-qsnr2 -- ls /proc/9/root/etc/nginx
conf.d fastcgi_params mime.types modules nginx.conf ...

Заключение

Эфемерные контейнеры и команда отладки kubectl обеспечивают упрощенную отладку рабочих нагрузок Kubernetes.

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

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

kubectl debug также может создавать копии Pods и делиться их процессами с оригиналом.

Этот механизм позволяет вам проверять процессы в контейнерах целевого пода из отдельного эфемерного контейнера, над которым у вас есть полный контроль.

Он предоставляет более продвинутые возможности отладки, когда вам нужно исследовать запущенные процессы.

 

Добавить комментарий