Прямой ответ
Sidecar pattern — отдельный контейнер в поде для кросс-каттинг функций (sidecar — «мотоцикл с коляской» — sidecar — «основной контейнер + sidecar» — sidecar — k8s — «под с двумя контейнерами» — sidecar); аналогия: мотоцикл с коляской (sidecar — «мотоцикл + коляска» — sidecar — k8s — «основной контейнер + sidecar» — sidecar); проблема, которую решает: кросс-каттинг функции в каждом сервисе (sidecar — «логирование/прокси/конфигурация в каждом сервисе» — sidecar — техдолг — «20 сервисов — 20 реализаций логирования» — техдолг — sidecar); механика: вынос функций в sidecar (sidecar — «логирование → sidecar» — sidecar — k8s — «sidecar контейнер» — sidecar — микросервисы — «основной контейнер не знает о sidecar» — sidecar); типы sidecar: (1) Логирование (sidecar — «логирование → sidecar» — sidecar — логи — «sidecar собирает логи» — sidecar — логи — Fluentd/Fluent Bit (sidecar — «Fluentd sidecar» — sidecar — логи); (2) Прокси (sidecar — «прокси → sidecar» — sidecar — service mesh — Envoy sidecar (service mesh — «Envoy sidecar» — service mesh — sidecar); (3) Конфигурация (sidecar — «конфигурация → sidecar» — sidecar — k8s — «sidecar обновляет конфигурацию» — sidecar — k8s); (4) Синхронизация (sidecar — «синхронизация → sidecar» — sidecar — k8s — «sidecar синхронизирует данные» — sidecar — k8s); когда sidecar: кросс-каттинг функции (sidecar — «логирование/прокси/конфигурация» — sidecar — микросервисы — «20 сервисов — 20 реализаций» — техдолг — sidecar), микросервисы (микросервисы — «микросервисы — sidecar» — микросервисы — sidecar — service mesh — «service mesh — sidecar» — service mesh), k8s (k8s — «k8s — sidecar» — k8s — sidecar — «под с sidecar» — k8s); когда НЕ sidecar: монолит (sidecar — «монолит — sidecar оверхед» — sidecar — техдолг — «sidecar для монолита» — оверхед — техдолг), простые случаи (sidecar — «sidecar не нужен» — sidecar — техдолг — «sidecar оверхед» — техдолг); антипаттерны: sidecar без нужды (sidecar — «sidecar для всего» — sidecar — «оверхед» — техдолг — «sidecar только для кросс-каттинг» — sidecar), sidecar без мониторинга (метрики — «sidecar упал» — метрика — алерт — алерты — «sidecar сломан» — incident), sidecar без resource limits (k8s — «sidecar без лимитов» — k8s — «sidecar съедает ресурсы» — ёмкость — лимиты обязательны — k8s).
Практика: sidecar в Kubernetes
Логирование sidecar (sidecar — Fluentd (sidecar — apiVersion: v1 kind: Pod spec: containers: - name: app image: app - name: fluentd image: fluentd volumeMounts: - name: logs mountPath: /var/log volumes: - name: logs emptyDir: {} (k8s — «app + fluentd sidecar» — k8s — sidecar — логи); Прокси sidecar (sidecar — Envoy (service mesh — apiVersion: v1 kind: Pod spec: containers: - name: app image: app - name: envoy image: envoy (k8s — «app + envoy sidecar» — k8s — service mesh — sidecar); Конфигурация sidecar (sidecar — apiVersion: v1 kind: Pod spec: containers: - name: app image: app - name: config image: config-sync (k8s — «app + config-sync sidecar» — k8s — sidecar); Resource limits (k8s — resources: limits: memory: 100Mi cpu: 100m (k8s — «sidecar — 100 МБ, 100 мCPU» — k8s — ёмкость — sidecar); Мониторинг (метрики: «sidecar status», «sidecar resource usage» — метрики — алерты — алерты — «sidecar упал» — incident).
Практический сценарий: логирование через sidecar
Контекст: микросервис (микросервисы), боль: логирование в каждом сервисе (логи — «20 сервисов — 20 реализаций логирования» — техдолг — sidecar); решение — логирование sidecar: (1) Fluentd sidecar (sidecar — apiVersion: v1 kind: Pod spec: containers: - name: app image: app - name: fluentd image: fluentd volumeMounts: - name: logs mountPath: /var/log volumes: - name: logs emptyDir: {} (k8s — «app + fluentd sidecar» — k8s — sidecar — логи); (2) Общий volume (k8s — volumes: - name: logs emptyDir: {} (k8s — «app пишет логи, fluentd читает» — k8s — sidecar — логи); (3) Resource limits (k8s — resources: limits: memory: 100Mi cpu: 100m (k8s — «sidecar — 100 МБ» — k8s — ёмкость — sidecar); (4) Мониторинг (метрики — «sidecar status» — метрики — алерты — алерты — «sidecar упал» — incident); результат: логирование в одном месте (логи — «20 реализаций → 1» — техдолг — sidecar — app не знает о логировании (sidecar — «app пишет логи, sidecar собирает» — sidecar — логи); вывод: sidecar решили задачу (логирование вынесено — логи — ADR — «sidecar без resource limits» — антипаттерн — техдолг).
FAQ
Sidecar pattern против service mesh — в чём разница и как связаны? Sidecar pattern (sidecar — отдельный контейнер (sidecar — «sidecar контейнер» — sidecar — k8s — «под с sidecar» — k8s); Service mesh (service mesh — использует sidecar (service mesh — «service mesh — sidecar» — service mesh — sidecar — Envoy sidecar (service mesh — «Envoy sidecar» — service mesh); разница: sidecar — паттерн (sidecar — «паттерн sidecar» — sidecar, service mesh — использует sidecar (service mesh — «service mesh использует sidecar» — service mesh); связь: service mesh — частный случай sidecar (service mesh — «service mesh — sidecar для прокси» — service mesh — sidecar — ADR — техдолг).
Какие типы sidecar бывают и когда какой использовать? Логирование (sidecar — «логирование → sidecar» — sidecar — логи — Fluentd/Fluent Bit (sidecar — «Fluentd sidecar» — sidecar — логи — когда: логирование (sidecar — «логирование» — sidecar); Прокси (sidecar — «прокси → sidecar» — sidecar — service mesh — Envoy (service mesh — «Envoy sidecar» — service mesh — когда: прокси (sidecar — «прокси» — sidecar); Конфигурация (sidecar — «конфигурация → sidecar» — sidecar — k8s — когда: конфигурация (sidecar — «конфигурация» — sidecar); Синхронизация (sidecar — «синхронизация → sidecar» — sidecar — k8s — когда: синхронизация (sidecar — «синхронизация» — sidecar); «один тип для всего» — нет (разные функции — разные типы — sidecar — ADR — техдолг).
Как настроить resource limits для sidecar?
Resource limits (k8s — resources: limits: memory: 100Mi cpu: 100m (k8s — «sidecar — 100 МБ, 100 мCPU» — k8s — ёмкость — sidecar); Зачем: sidecar не должен съедать все ресурсы (k8s — «sidecar без лимитов — съедает ресурсы» — k8s — ёмкость — лимиты обязательны — k8s); Практика: всегда лимиты (k8s — «sidecar с лимитами» — k8s — ёмкость — sidecar — «sidecar без лимитов» — антипаттерн (k8s — «sidecar съедает ресурсы» — ёмкость — лимиты обязательны — k8s — ADR — техдолг).
Когда sidecar действительно нужен, а когда — оверхед? Нужен: кросс-каттинг функции (sidecar — «логирование/прокси/конфигурация» — sidecar — микросервисы — «20 сервисов — 20 реализаций» — техдолг), микросервисы (микросервисы — «микросервисы — sidecar» — микросервисы — sidecar — service mesh, k8s (k8s — «k8s — sidecar» — k8s — sidecar); Оверхед: монолит (sidecar — «монолит — sidecar оверхед» — sidecar — техдолг, простые случаи (sidecar — «sidecar не нужен» — sidecar — техдолг); «sidecar для всего» — антипаттерн (оверхед — техдолг — «sidecar только для кросс-каттинг» — sidecar — ADR — техдолг).
Источники: Microsoft Azure patterns (sidecar), Kubernetes docs, Envoy docs — ссылки в шапке.