Init Container

⌘K

Init Container

Init Container — это специальный контейнер в Pod, который запускается перед основными контейнерами и выполняет подготовительные задачи. В отличие от обычных контейнеров приложения, init-контейнер всегда завершается после выполнения своей работы, а Pod продолжает запускаться дальше.


Особенности Init Container

  1. Выполняются последовательно
    Если в Pod несколько init-контейнеров, они запускаются один за другим. Следующий не стартует, пока предыдущий не завершился успешно.
  2. Отличаются от обычных контейнеров
    • Всегда выполняются один раз при запуске Pod.
    • Могут использовать другие образы, чем основной контейнер (например, с утилитами для настройки).
    • Не перезапускаются после успешного завершения.
  3. Блокируют запуск Pod до готовности
    Основные контейнеры не запустятся, пока все init-контейнеры не завершат свои задачи.

Для чего используются

  • Загрузка конфигураций — скачивание параметров из внешнего хранилища (Vault, Config Server).
  • Инициализация базы данных — выполнение миграций перед запуском приложения.
  • Проверка зависимостей — ожидание готовности внешнего сервиса или API.
  • Подготовка файловой системы — создание директорий, установка прав, копирование данных.

Пример Pod с Init Container

apiVersion: v1
kind: Pod
metadata:
  name: app-with-init
spec:
  initContainers:
  - name: init-config
    image: busybox:1.36
    command: ['sh', '-c', 'echo "Init complete" > /config/status.txt']
    volumeMounts:
    - name: config
      mountPath: /config
  containers:
  - name: main-app
    image: myorg/app:1.0
    volumeMounts:
    - name: config
      mountPath: /app/config
  volumes:
  - name: config
    emptyDir: {}

В этом примере init-контейнер создаёт файл с конфигурацией, и только после этого запускается основное приложение.


Для клиента

Init-контейнеры делают систему надёжнее и предсказуемее:

  • гарантируют правильный порядок запуска,
  • устраняют проблему «гонок» при зависимости от внешних сервисов,
  • позволяют разделять ответственность: основной контейнер остаётся простым, а подготовка выносится в init.

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


Best Practices для Init Container

  1. Отделяйте подготовку от основного приложения
    • Всё, что нужно сделать один раз перед стартом Pod, лучше вынести в init-контейнер.
    • Это упрощает основной контейнер и снижает риск ошибок.
  2. Используйте специализированные образы
    • Для init-контейнера можно брать лёгкие образы (busybox, alpine) с минимальным набором утилит.
    • Нет смысла тянуть «тяжёлый» образ только ради одной команды.
  3. Храните результаты в volume
    • Всё, что создаёт init-контейнер (файлы, конфиги, скрипты), должно сохраняться в томах (emptyDir, ConfigMap, Secret).
    • Так данные будут доступны основному контейнеру.
  4. Контролируйте время выполнения
    • Если init-контейнер «зависнет», Pod не стартует.
    • Добавляйте таймауты или health-check команд.
  5. Не злоупотребляйте init-контейнерами
    • Если задача должна выполняться постоянно (например, сбор логов), это работа sidecar.
    • Init — только для подготовки на старте.
  6. Совмещайте с RBAC и Secret Management
    • Init-контейнер удобно использовать для загрузки секретов (из Vault, AWS Secrets Manager), но доступ к ним должен быть минимально необходимым.

Кратко: Init-контейнеры — это «разогрев перед стартом». Они должны быть простыми, быстрыми и надёжными, чтобы гарантировать стабильный запуск Pod.