Gymterview
middle

Что такое 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’а.