Поиск по сайту:

Как запускать команды внутри контейнеров 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, обеспечивая сеанс интерактивной оболочки. Это не всегда будет необходимо в зависимости от команды, которую вы хотите использовать: если она производит только вывод, не требуя ввода, вы можете безопасно опустить флаги.




Все права защищены. © Linux-Console.net • 2019-2024