Введение
Sidecar (боковая коляска мотоцикла) – архитектурный паттерн, при котором вспомогательный процесс или контейнер развёртывается вместе с основным приложением, разделяя с ним жизненный цикл, ресурсы и сеть, но сохраняя полную независимость кодовой базы. Паттерн назван по аналогии с боковой коляской мотоцикла: она функционирует совместно с мотоциклом, но является отдельным элементом.
В Kubernetes sidecar реализуется как дополнительный контейнер внутри Pod'а. Контейнеры в одном Pod'е разделяют сетевое пространство имён (один IP-адрес), пространство имён PID и тома (volumes), что позволяет sidecar перехватывать трафик или читать файлы приложения.
История и контекст
Паттерн sidecar описан в книге Microsoft Patterns & Practices «Cloud Design Patterns» (2014). Широкое распространение получил с развитием Kubernetes и, особенно, service mesh. Именно service mesh Istio сделал sidecar общеизвестным: Envoy proxy автоматически внедряется в каждый Pod как sidecar.
В Kubernetes 1.28 (2023) был представлен нативный API для Init Containers как sidecar (через restartPolicy: Always), что решило проблему порядка запуска и завершения контейнеров. До этого sidecar могли завершиться раньше основного контейнера или наоборот – вызывая проблемы с graceful shutdown.
Как это работает
В Pod'е с sidecar работают минимум два контейнера:
- Main Container: бизнес-логика приложения.
- Sidecar Container: вспомогательный контейнер, расширяющий функциональность.
Типичные сценарии использования sidecar:
- Proxy (Service Mesh): Envoy/Linkerd proxy перехватывает сетевой трафик через iptables-правила init-контейнера. Приложение не знает о прокси – оно думает, что напрямую соединяется с другими сервисами.
- Log Shipping: Fluentd или Fluent Bit читает логи из общего тома (
/var/log/app), парсит и отправляет в Elasticsearch/Loki. - Secrets Management: Vault Agent Injector монтирует секреты из HashiCorp Vault в общий volume, периодически обновляя их.
- Configuration Refresh: sidecar следит за ConfigMap/внешним хранилищем и обновляет конфигурационные файлы без перезапуска основного контейнера.
- Metrics Collection: sidecar-экспортёр Prometheus собирает метрики и предоставляет их через /metrics endpoint.
В service mesh sidecar работает следующим образом:
- Init-контейнер (istio-init) настраивает iptables-правила, перенаправляя весь TCP-трафик через Envoy.
- Приложение инициирует соединение с целевым сервисом.
- Iptables перенаправляет трафик на локальный порт Envoy (15001 для исходящего, 15006 для входящего).
- Envoy применяет политики, добавляет заголовки трассировки, собирает метрики и проксирует трафик.
Преимущества и недостатки паттерна
Преимущества:
- Разделение ответственности: команда приложения не занимается сетевыми политиками или сбором логов.
- Независимость языка: sidecar работает с любым языком программирования приложения.
- Повторное использование: один и тот же sidecar (Envoy, Fluentd) используется во всех Pod'ах.
- Обновление без даунтайма: sidecar можно обновить, не пересобирая образ приложения.
Недостатки:
- Дополнительное потребление ресурсов: каждый sidecar требует CPU и RAM.
- Усложнение отладки: трафик проходит через дополнительный слой.
- Задержка: дополнительные 1-5 мс из-за прокси.
- Управление жизненным циклом: до Kubernetes 1.28 порядок запуска/остановки мог создавать проблемы.
Где применяется
- Service Mesh: Envoy (Istio), linkerd-proxy (Linkerd) – наиболее массовое применение sidecar.
- Безопасность: Vault Agent для инъекции секретов, cert-manager для сертификатов.
- Observability: OpenTelemetry Collector как sidecar для сбора и экспорта трасс.
- Legacy Migration: sidecar адаптирует старые приложения к cloud-native окружению без переписывания кода.
Связь с другими понятиями
- Service Mesh – sidecar является основным паттерном реализации service mesh data plane.
- Istio – использует Envoy sidecar, автоматически внедряемый через MutatingWebhookConfiguration.
- Log Aggregation – sidecar-паттерн широко используется для отправки логов в централизованное хранилище.
- Kubernetes – Pod как единица развёртывания обеспечивает инфраструктурную основу для sidecar.