Что такое Sidecar-контейнер в Kubernetes?

«Что такое Sidecar-контейнер в Kubernetes?» — вопрос из категории DevOps, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Sidecar — это паттерн проектирования в Kubernetes, при котором к основному контейнеру Pod'а добавляется один или несколько вспомогательных контейнеров, расширяющих или дополняющих его функциональность. Эти контейнеры разделяют жизненный цикл, сеть, хранилище и пространство имён с основным приложением.

Ключевые принципы:

  • Разделение ответственности: Основной контейнер содержит бизнес-логику, sidecar — вспомогательную (логирование, синхронизация, прокси).
  • Общие ресурсы: Контейнеры в Pod'е совместно используют:
    • Сетевое пространство (localhost).
    • Тома (volumes) для обмена файлами.
    • Цикл жизни (запускаются и останавливаются вместе).

Типичные use-cases:

  1. Логирование и мониторинг: Sidecar-контейнер собирает логи с общего тома и отправляет их в централизованную систему (Fluentd, Logstash).
  2. Прокси-сервис: Контейнер-прокси (например, Envoy, NGINX) обрабатывает входящий/исходящий трафик для основного приложения (сервисная сеть — Service Mesh).
  3. Синхронизация конфигураций: Контейнер (как git-sync) периодически обновляет конфиги на общем томе, основной контейнер использует их.

Пример манифеста:

apiVersion: v1
kind: Pod
metadata:
  name: webapp-with-log-sidecar
spec:
  containers:
  - name: main-app # Основной контейнер
    image: my-webapp:latest
    volumeMounts:
    - name: log-volume
      mountPath: /var/log/app
  - name: log-sidecar # Sidecar-контейнер
    image: fluentd:latest
    volumeMounts:
    - name: log-volume
      mountPath: /var/log/app
    command: ['fluentd', '-c', '/etc/fluentd.conf']
  volumes:
  - name: log-volume
    emptyDir: {}

Преимущество: Позволяет модифицировать или расширять поведение основного приложения без изменения его кода.