Приложения, запущенные в 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=5m demo-pod -- demo-command
Когда это следует использовать?
kubectl exec лучше всего использовать в специальных ситуациях, когда вам нужно напрямую взаимодействовать с файловой системой контейнера.
Вы можете использовать его для доступа к логам или кэшам после возникновения проблемы или для запуска редко используемого сценария обслуживания, который поставляется в образе контейнера.
Хотя kubectl exec позволяет выполнить любую команду, следует избегать резкого изменения окружения контейнера.
Это может привести к тому, что контейнер отклонится от ожидаемого состояния.
Контейнеры обычно не требуют вмешательства, поэтому использование kubectl exec в производственных средах обычно сигнализирует о том, что что-то пошло не так.
Не используйте эту команду для установки пакетов или применения обновлений внутри контейнера.
Такого рода операции следует выполнять путем создания нового образа контейнера, включающего изменения, а затем заменить ваши Kubernetes поды на те, которые запускают обновленную сборку.
Следование этому принципу гарантирует, что ваши изменения не будут потеряны, когда под перезапустится и вернется к файловой системе своего образа контейнера.
Сохранение неизменяемости ваших контейнеров также гарантирует, что они могут быть надежно воспроизведены из их образов, что повышает надежность и облегчает отладку.
Заключение
Выполнение разовой команды внутри контейнера Kubernetes позволяет отлаживать проблемы, выполнять задачи по обслуживанию и проверять файловую систему контейнера.
В каждой из этих ситуаций вы можете использовать kubectl exec для получения соединения с контейнером.
Добавление комбинации флагов -it перенаправит стандартный поток ввода вашего терминала в качестве TTY, обеспечивая интерактивный сеанс оболочки.
Это не всегда необходимо в зависимости от команды, которую вы хотите использовать: если она выдает только вывод, не требуя никакого ввода, флаги можно опустить.
см. также:
- ☸️ Как мониторить логи Kubernetes подов в режиме реального времени с помощью Stern
- ☸️ Перехват трафика контейнеров в Kubernetes
- ☸️ Выполняем проверку безопасности манифестов Kubernetes и чартов Helm с помощью Datree
- ☸️ Внедрили Kubernetes? Попробуйте эти 5 инструментов для аудита прав Rbac
- ☸️ Ломаем и чиним Kubernetes
- ☸️ Peirates : Инструмент для тестирования на проникновение Kubernetes
- ☸️ Побег из контейнера Kubernetes с помощью монтирования HostPath
- ☸️ Какие типы сервисов существуют в Kubernetes?