# Урок 3.2 — Автоматическое добавление sidecar контейнеров ## Файлы | Файл | Описание | |------|----------| | `inject-fluent-bit.yaml` | Opt-in injection Fluent Bit (по аннотации) | | `fluent-bit-configmap.yaml` | ConfigMap с конфигурацией Fluent Bit | | `inject-prometheus-exporter.yaml` | Opt-in injection Prometheus exporter | ## Подготовка ```bash # Применить ConfigMap (нужен до создания подов с Fluent Bit) kubectl apply -f fluent-bit-configmap.yaml # Применить политики injection kubectl apply -f inject-fluent-bit.yaml kubectl apply -f inject-prometheus-exporter.yaml ``` ## Тестирование Fluent Bit injection ```bash # Под БЕЗ аннотации — sidecar не добавится kubectl apply -f test-resources/pod-no-logging.yaml kubectl get pod pod-no-logging -o jsonpath='{.spec.containers[*].name}' # Вывод: app # Под С аннотацией — sidecar добавится автоматически kubectl apply -f test-resources/pod-with-logging.yaml kubectl get pod pod-with-logging -o jsonpath='{.spec.containers[*].name}' # Вывод: app fluent-bit # Проверить конфигурацию sidecar kubectl describe pod pod-with-logging | grep -A 30 "fluent-bit:" # Удалить тесты kubectl delete pod pod-no-logging pod-with-logging ``` ## Тестирование Prometheus exporter injection ```bash kubectl apply -f test-resources/pod-with-monitoring.yaml kubectl get pod pod-with-monitoring \ -o jsonpath='{.spec.containers[*].name}' # Вывод: app prometheus-exporter # Проверить аннотации kubectl get pod pod-with-monitoring \ -o jsonpath='{.metadata.annotations}' | jq . kubectl delete pod pod-with-monitoring ``` ## Opt-in vs Opt-out ```yaml # Opt-in: срабатывает только при наличии аннотации preconditions: - key: "{{ request.object.metadata.annotations.\"logging.company.com/enabled\" }}" operator: Equals value: "true" # Opt-out: срабатывает везде, кроме явно исключённых preconditions: - key: "{{ request.object.metadata.annotations.\"logging.company.com/disabled\" || 'false' }}" operator: NotEquals value: "true" ``` ## Защита от дублирования ```bash # Попробовать создать под, который уже содержит fluent-bit kubectl apply -f test-resources/pod-already-has-sidecar.yaml # Sidecar НЕ будет дублирован (precondition NotIn защищает) kubectl get pod pod-already-has-sidecar \ -o jsonpath='{.spec.containers[*].name}' ```