Что такое Init-контейнеры и Sidecar-контейнеры?
Init-контейнеры и Sidecar-контейнеры — два паттерна для расширения функциональности Pod’а через дополнительные контейнеры. Init-контейнеры запускаются до основного приложения, Sidecar-контейнеры работают параллельно с ним.
Init-контейнеры
Init-контейнеры — специальные контейнеры, которые запускаются до основных контейнеров Pod’а. Они выполняются последовательно, каждый следующий стартует только после успешного завершения предыдущего.
Типичные сценарии использования:
- Ожидание готовности базы данных или другого сервиса перед стартом приложения
- Загрузка конфигурации или секретов из внешнего хранилища
- Выполнение миграций базы данных (Liquibase, Flyway)
- Настройка файловой системы или прав доступа
Пример Pod с Init-контейнерами
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
initContainers:
- name: wait-for-db
image: busybox:1.36
command: ['sh', '-c', 'until nc -z postgres-service 5432; do echo "Waiting for DB..."; sleep 2; done']
- name: run-migrations
image: my-registry/my-app-migrations:1.0.0
command: ['java', '-jar', 'migrations.jar']
containers:
- name: app
image: my-registry/my-java-app:1.0.0
ports:
- containerPort: 8080
Sidecar-контейнеры
Sidecar-контейнеры — дополнительные контейнеры, которые работают параллельно с основным контейнером в одном Pod’е. Они расширяют функциональность основного контейнера.
Типичные сценарии использования:
- Логирование — сбор и отправка логов (Fluentd, Filebeat)
- Прокси — Envoy/Istio sidecar для service mesh
- Мониторинг — экспорт метрик
- Синхронизация данных — загрузка конфигурации из внешнего источника
Пример Pod с Sidecar-контейнером
apiVersion: v1
kind: Pod
metadata:
name: app-with-sidecar
spec:
containers:
- name: app
image: my-registry/my-java-app:1.0.0
ports:
- containerPort: 8080
volumeMounts:
- name: logs
mountPath: /var/log/app
- name: log-collector
image: fluent/fluent-bit:latest
volumeMounts:
- name: logs
mountPath: /var/log/app
readOnly: true
volumes:
- name: logs
emptyDir: {}
В этом примере основной контейнер пишет логи в общий том, а sidecar-контейнер fluent-bit читает их и отправляет в систему логирования.
На собеседовании: интервьюер часто просит привести примеры использования Init- и Sidecar-контейнеров. Достаточно назвать 2-3 сценария для каждого. Частая ошибка — путать Init и Sidecar: Init завершается до старта основного контейнера, Sidecar работает параллельно всё время жизни Pod’а.