Контейнеры

Содержание

Понимание контейнеров

Обратитесь к официальной документации сайта Kubernetes: Containers.

Контейнер — это легковесный исполняемый пакет программного обеспечения, который включает всё необходимое для запуска приложения: код, среду выполнения, системные инструменты, системные библиотеки и настройки. Хотя Pods являются наименьшими развертываемыми единицами, контейнеры — это основные компоненты внутри Pods.

Понимание эфемерных контейнеров

Отладка контейнеров с помощью
Обратитесь к официальной документации сайта Kubernetes: Ephemeral Containers

Функция Kubernetes Ephemeral Containers предоставляет надёжный способ отладки запущенных контейнеров путём внедрения специализированных инструментов отладки (системных, сетевых и дисковых утилит) в существующий Pod.

Хотя часто можно выполнять команды непосредственно внутри запущенного контейнера с помощью kubectl exec, многие производственные образы контейнеров намеренно минимальны и могут не содержать необходимых утилит для отладки (например, bash, net-tools, tcpdump), чтобы уменьшить размер образа и поверхность атаки. Эфемерные контейнеры решают эту проблему, предоставляя предварительно настроенную среду с богатым набором инструментов отладки, что делает их идеальными для следующих сценариев:

  • Диагностика неисправностей: когда основной контейнер приложения испытывает проблемы (например, неожиданные сбои, ухудшение производительности, проблемы с сетевым подключением), помимо проверки стандартных событий и логов Pod, часто требуется более глубокая интерактивная отладка непосредственно в среде выполнения Pod.
  • Настройка конфигурации и эксперименты: если текущая конфигурация приложения демонстрирует неоптимальное поведение, можно временно изменить настройки компонентов или протестировать новые конфигурации непосредственно в запущенном контейнере, чтобы наблюдать немедленные эффекты и разработать улучшенные решения.

Принцип реализации: использование эфемерных контейнеров

Функциональность отладки реализована с помощью эфемерных контейнеров. Эфемерный контейнер — это специальный тип контейнера, предназначенный для интроспекции и отладки. Он разделяет сетевое пространство имён Pod и пространство имён процессов (если включено) с существующими основными containers, что позволяет ему напрямую взаимодействовать и наблюдать процессы приложения.

Вы можете динамически добавить эфемерный контейнер (например, my-app-debug) в запущенный Pod и использовать его предустановленные инструменты отладки. Результаты диагностики из этого эфемерного контейнера напрямую относятся к поведению и состоянию основных приложений containers в том же Pod.

:::Notes * Нельзя добавить эфемерный контейнер, напрямую изменяя статический манифест Pod (PodSpec). Функция эфемерных контейнеров предназначена для динамического внедрения в запущенные Pods, обычно через API-вызовы (например, kubectl debug). * **Эфемерные контейнеры**, созданные через функцию отладки, не имеют гарантий ресурсов (CPU/память) или планирования (то есть они не блокируют запуск Pod и не получают собственный класс QoS) и не будут автоматически перезапускаться при выходе. Поэтому избегайте запуска в них постоянных бизнес-приложений; они предназначены исключительно для отладки. * Будьте осторожны при использовании функции отладки, если узел (Node), на котором находится Pod, испытывает высокую загрузку ресурсов или близок к исчерпанию ресурсов. Внедрение эфемерного контейнера, даже с минимальным потреблением ресурсов, может способствовать эвакуации Pod при сильном давлении на ресурсы. :::

Отладка эфемерных контейнеров с помощью CLI

В Kubernetes 1.25+ доступна команда kubectl debug для создания эфемерных контейнеров. Этот метод предоставляет мощную альтернативу командной строки для отладки.

Команда

kubectl debug -it <pod-name> --image=<debug-image> --target=<target-container-name> -n <namespace>
# --image: Указывает образ для отладки (например, busybox, ubuntu, nicolaka/netshoot) с необходимыми инструментами.
# --target: (Опционально) Указывает имя контейнера в Pod, на который направлена отладка. Если опущено и контейнер один, используется он. Если несколько — первый.
# -n: Указывает namespace.

Пример YAML файла Pod

Пример: Отладка nginx в my-nginx-pod

  • Сначала убедитесь, что Pod запущен:

    kubectl apply -f pod-example.yaml
  • Теперь создайте эфемерный контейнер отладки с именем debugger внутри my-nginx-pod, нацеленный на my-nginx-container, используя образ busybox:

    kubectl debug -it my-nginx-pod --image=busybox --target=nginx -- /bin/sh

    Эта команда подключит вас к shell внутри эфемерного контейнера debugger. Теперь вы можете использовать инструменты busybox для отладки my-nginx-container.

  • Чтобы просмотреть эфемерные контейнеры, присоединённые к Pod:

    kubectl describe pod my-nginx-pod

    Найдите раздел Ephemeral Containers в выводе.

Отладка эфемерных контейнеров через веб-консоль

  1. Перейдите в Container Platform, затем в левом меню выберите Workloads > Pods.

  2. Найдите нужный Pod и нажмите ⋮ > Debug.

  3. Выберите конкретный контейнер внутри Pod, который хотите отлаживать.

  4. (Опционально) Если интерфейс запросит инициализацию (например, для настройки необходимой среды отладки), нажмите Initialize.

    INFO

    После инициализации функции Debug, пока Pod не будет пересоздан, вы можете напрямую войти в эфемерный контейнер (например, Container A-debug) для отладки.

  5. Дождитесь готовности окна терминала отладки и начните операции отладки.
    Подсказка: нажмите опцию «Command Query» в правом верхнем углу терминала, чтобы увидеть список распространённых инструментов отладки и примеры их использования.

    INFO

    Нажмите «Command Query» в правом верхнем углу, чтобы просмотреть распространённые инструменты и их использование.

  6. По завершении отладки закройте окно терминала.

Взаимодействие с контейнерами

Вы можете напрямую взаимодействовать с внутренним экземпляром запущенного контейнера с помощью команды kubectl exec, что позволяет выполнять произвольные операции в командной строке. Кроме того, Kubernetes предоставляет удобные возможности для загрузки и скачивания файлов из контейнеров и в контейнеры.

Взаимодействие с контейнерами через CLI

Exec

Для выполнения команды внутри конкретного контейнера в Pod (полезно для получения shell, запуска диагностических команд и т.д.):

kubectl exec -it <pod-name> -c <container-name> -n <namespace> -- <command>
# -it: Обеспечивает интерактивный режим и TTY (псевдо-терминал) для сессии shell.
# -c: Указывает имя целевого контейнера в Pod. Опускается, если контейнер один.
# --: Разделяет аргументы kubectl и команду для выполнения в контейнере.
  • Пример: Получение Bash shell в nginx из my-nginx-pod

    kubectl exec -it my-nginx-pod -c nginx -n default -- /bin/bash
  • Пример: Просмотр файлов в /tmp контейнера

    kubectl exec my-nginx-pod -c nginx -n default -- ls /tmp

Передача файлов

  • Чтобы скопировать файлы с локальной машины в контейнер внутри Pod:

    kubectl cp <local-file-path> <namespace>/<pod-name>:<container-file-path> -c <container-name>
    # -c: (Опционально) Указывает целевой контейнер, если в Pod несколько.
    
    # Пример: Загрузка `my-config.txt` в директорию HTML Nginx
    kubectl cp my-config.txt default/my-nginx-pod:/usr/share/nginx/html/my-config.txt -c nginx
  • Чтобы скопировать файлы из контейнера внутри Pod на локальную машину:

    kubectl cp <namespace>/<pod-name>:<container-file-path> <local-file-path> -c <container-name>
    
    # Пример: Скачивание логов доступа Nginx
    kubectl cp default/my-nginx-pod:/var/log/nginx/access.log ./nginx_access.log -c nginx

Взаимодействие с контейнерами через веб-консоль

Вход в контейнер через Applications

Вы можете войти во внутренний экземпляр контейнера с помощью команды kubectl exec, что позволяет выполнять операции в командной строке в окне веб-консоли. Также можно легко загружать и скачивать файлы внутри контейнера с помощью функции передачи файлов.

  1. Перейдите в Container Platform, затем в левом меню выберите Application > Applications.

  2. Нажмите на Application Name.

  3. Найдите связанный workload (например, Deployment, StatefulSet), нажмите EXEC, затем выберите конкретный Pod Name, в который хотите войти. EXEC > Container Name.

  4. Введите команду, которую хотите выполнить.

  5. Нажмите OK для входа в окно веб-консоли и выполнения командной строки.

  6. Нажмите File Transfer.

    • Введите Upload Path для загрузки локальных файлов в контейнер (например, конфигурационные файлы для тестирования).
    • Введите Download Path для скачивания логов, диагностических данных или других файлов из контейнера на локальную машину для анализа.

Вход в контейнер через Pod

  1. Перейдите в Container Platform, затем в левом меню выберите Workloads > Pods.

  2. Найдите нужный Pod, нажмите вертикальное многоточие (⋮) рядом с ним, выберите EXEC, затем выберите конкретный Container Name внутри этого Pod, в который хотите войти.

  3. Введите команду, которую хотите выполнить.

  4. Нажмите OK для входа в окно веб-консоли и выполнения командной строки.

  5. Нажмите File Transfer.

    • Введите Upload Path для загрузки локальных файлов в контейнер (например, конфигурационные файлы для тестирования).
    • Введите Download Path для скачивания логов, диагностических данных или других файлов из контейнера на локальную машину для анализа.