Как запускать команды внутри контейнеров Kubernetes Pod
Приложения, работающие в Kubernetes, обычно представляют собой долгоживущие сервисы, с которыми вам не нужно взаимодействовать. Однако иногда вам может понадобиться вручную запустить команду внутри контейнера, возможно, для разовой операции обслуживания или для помощи в процедуре отладки.
В этой статье мы покажем, как запускать команды и получать интерактивные сеансы оболочки внутри контейнеров Kubernetes. Это позволит вам запускать процессы в контейнере с помощью вашего локального терминала. Он полностью интегрирован с Kubernetes и его интерфейсом командной строки Kubectl, поэтому вам не нужно загрязнять образы контейнеров с помощью демона SSH, чтобы обеспечить удаленный доступ.
Использование KubectlExec
kubectl exec
выполняет команду внутри запущенного контейнера. Он имеет следующий основной синтаксис:
$ kubectl exec demo-pod -- demo-command
Это запустит demo-command
внутри первого контейнера модуля demo-pod
. Команда выполняется с привилегиями root.
Дополнительные флаги необходимы для настройки сеанса интерактивного терминала:
--stdin
(-i
) — передать стандартный поток ввода вашего терминала в контейнер.--tty
(-t
) — пометить стандартный поток ввода как TTY, сделав его интерактивным.
Вот пример получения оболочки в первый контейнер в поде:
$ kubectl exec -it demo-pod -- /bin/sh
Все после --
становится частью команды, которая выполняется внутри контейнера. kubectl exec
игнорирует точку входа контейнера по умолчанию, вместо этого запуская новый процесс с помощью указанной вами команды. Не следует заключать команду в кавычки (\/bin/sh\
), если только вы не будете использовать их в обычном режиме при локальном выполнении команды.
Выбор другого контейнера
kubectl exec
подключается к контейнеру Pod по умолчанию, когда не указаны другие аргументы. Контейнер по умолчанию — это контейнер с аннотацией kubectl.kubernetes.io/default-container
. Это будет первый контейнер в поде, если вы не добавили аннотацию к любому другому вручную.
Вот под, который запускает два контейнера:
apiVersion: v1 kind: Pod metadata: name: demo-pod spec: containers: - name: app-container image: nginx:latest - name: sidecar-container image: busybox:latest
Вы можете запустить команду внутри sidecar-container
, добавив флаг -c
в kubectl exec
:
$ kubectl exec --it demo-pod -c sidecar-container -- /bin/sh
Ожидание запуска модулей
Kubectl подождет минуту, пока под будет Running
, если его контейнеры еще не запущены, когда вы запускаете команду exec
. Это значение времени ожидания можно изменить с помощью флага --pod-running-timeout
. Это полезно, когда вы хотите запустить команду сразу после создания нового пода, когда она, возможно, не была запланирована для узла.
$ kubectl exec --pod-running-timeout=5m demo-pod -- demo-command
Когда я должен использовать это?
kubectl exec
лучше всего подходит для специализированных ситуаций, когда вам необходимо напрямую взаимодействовать с файловой системой контейнера. Вы можете использовать его для доступа к журналам или кешам после возникновения проблемы или для запуска редко используемого служебного сценария, который предоставляется в образе контейнера.
Хотя kubectl exec
позволяет запускать любую команду, следует избегать резкого изменения среды контейнера. Это может привести к отклонению контейнера от ожидаемого состояния. Контейнеры обычно не требуют вмешательства, поэтому использование kubectl exec
в рабочей среде обычно сигнализирует о том, что что-то пошло не так.
Не используйте эту команду для установки пакетов или применения обновлений внутри контейнера. Этот тип операции следует обрабатывать путем создания нового образа контейнера, включающего изменения, а затем замены ваших модулей Kubernetes на те, которые запускают исправленную сборку. Следование этому принципу гарантирует, что ваши изменения не будут потеряны, когда модуль перезапустится и вернется к файловой системе своего образа контейнера. Неизменяемость ваших контейнеров также гарантирует, что они могут быть надежно воспроизведены из их образов, что повышает надежность и упрощает отладку.
Краткое содержание
Запуск одноразовой команды внутри контейнера Kubernetes позволяет отлаживать проблемы, выполнять задачи обслуживания и проверять файловую систему контейнера. В каждой из этих ситуаций вы можете использовать kubectl exec
для подключения к контейнеру.
Добавление комбинации флагов -it
переадресует стандартный поток ввода вашего терминала как TTY, обеспечивая сеанс интерактивной оболочки. Это не всегда будет необходимо в зависимости от команды, которую вы хотите использовать: если она производит только вывод, не требуя ввода, вы можете безопасно опустить флаги.