☸️ Как выполнять команды внутри контейнеров и подов Kubernetes |

☸️ Как выполнять команды внутри контейнеров и подов Kubernetes

Мануал

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

Ранее мы уже рассмотрели данную тему на примере Docker:

🐳 Как запускать команды внутри контейнера Docker?

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

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

Это позволит вам запускать процессы в контейнере с помощью локального терминала.

Метод полностью интегрирован с Kubernetes и его Kubectl CLI, поэтому вам не придется загрязнять образы контейнеров демоном SSH для обеспечения удаленного доступа.

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

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 подключается к контейнеру пода по умолчанию , если не заданы другие аргументы.

Контейнер по умолчанию – это контейнер с аннотацией kubectl.kubernetes.io/default-container.

Это будет первый контейнер в Pod, если вы не добавили аннотацию вручную к любому другому.

Вот под, в котором запущены два контейнера:

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

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

см. также:

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий