Init Container — это специальный контейнер в Pod, который запускается перед основными контейнерами и выполняет подготовительные задачи. В отличие от обычных контейнеров приложения, init-контейнер всегда завершается после выполнения своей работы, а Pod продолжает запускаться дальше.
Особенности Init Container
- Выполняются последовательно
Если в Pod несколько init-контейнеров, они запускаются один за другим. Следующий не стартует, пока предыдущий не завершился успешно. - Отличаются от обычных контейнеров
- Всегда выполняются один раз при запуске Pod.
- Могут использовать другие образы, чем основной контейнер (например, с утилитами для настройки).
- Не перезапускаются после успешного завершения.
- Блокируют запуск 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
- Отделяйте подготовку от основного приложения
- Всё, что нужно сделать один раз перед стартом Pod, лучше вынести в init-контейнер.
- Это упрощает основной контейнер и снижает риск ошибок.
- Используйте специализированные образы
- Для init-контейнера можно брать лёгкие образы (,
busybox
) с минимальным набором утилит.alpine
- Нет смысла тянуть «тяжёлый» образ только ради одной команды.
- Для init-контейнера можно брать лёгкие образы (
- Храните результаты в volume
- Всё, что создаёт init-контейнер (файлы, конфиги, скрипты), должно сохраняться в томах (,
emptyDir
,ConfigMap
).Secret
- Так данные будут доступны основному контейнеру.
- Всё, что создаёт init-контейнер (файлы, конфиги, скрипты), должно сохраняться в томах (
- Контролируйте время выполнения
- Если init-контейнер «зависнет», Pod не стартует.
- Добавляйте таймауты или health-check команд.
- Не злоупотребляйте init-контейнерами
- Если задача должна выполняться постоянно (например, сбор логов), это работа sidecar.
- Init — только для подготовки на старте.
- Совмещайте с RBAC и Secret Management
- Init-контейнер удобно использовать для загрузки секретов (из Vault, AWS Secrets Manager), но доступ к ним должен быть минимально необходимым.
Кратко: Init-контейнеры — это «разогрев перед стартом». Они должны быть простыми, быстрыми и надёжными, чтобы гарантировать стабильный запуск Pod.