В этой статье мы попробуем рассмотреть, как перехватить взаимодействие между подами с помощью функции sidecar-контейнера, предоставляемой кластером kubernetes.
- Тестовая среда
- Контейнеры Sidecar
- Шаг 1: Убедитесь, что кластер Kubernetes запущен
- Шаг 2: Включите функцию sidecar feature gate для компонентов
- Шаг 3: Создание деплоймента с sidecar контейнером
- Шаг 4: Развертывание приложения
- Шаг 5: Привязка порта к приложению
- Шаг 6: Генерируем входящий и исходящий трафик
- Трафик с ноды на под
- Трафик из пода в Интернет
- Шаг 7: Проверка логов
Тестовая среда
Кластер Kubernetes – v1.28.5
Контейнеры Sidecar
Контейнеры Sidecar – это вторичные контейнеры, которые запускаются вместе с основным контейнером приложения в рамках одного пода.
Эти контейнеры используются для улучшения или расширения функциональности основного контейнера приложения путем предоставления дополнительных сервисов или функций, таких как логирование, мониторинг, безопасность или синхронизация данных, без непосредственного изменения кода основного приложения.
☸️ Что такое Kubernetes Service Mesh и Istio
Kubernetes реализует контейнеры sidecar как особый случай контейнеров init; контейнеры sidecar остаются запущенными после запуска пода.
Шаг 1: Убедитесь, что кластер Kubernetes запущен
В качестве первого шага убедитесь, что у вас настроен рабочий кластер kubernetes.
Шаг 2: Включите функцию sidecar feature gate для компонентов
Начиная с Kubernetes 1.28, функция под названием SidecarContainers позволяют указать политику перезапуска для контейнеров, перечисленных в поле initContainers пода.
Но эта функция не включена по умолчанию, как указано в документации «Feature Gates».
Нам нужно включить ее с помощью feature gate на всех необходимых компонентах, как показано ниже.
Обновите файлы манифеста API-сервера, контроллера и планировщика, чтобы включить функцию «SidecarContainers».
root@k8master:/etc/kubernetes/manifests# cat kube-apiserver.yaml | grep -i feature
- --feature-gates=SidecarContainers=true
root@k8master:/etc/kubernetes/manifests# cat kube-controller-manager.yaml | grep -i feature
- --feature-gates=SidecarContainers=true
root@k8master:/etc/kubernetes/manifests# cat kube-scheduler.yaml | grep -i feature
- --feature-gates=SidecarContainers=true
Также обновите конфигурационный файл kubelet, чтобы включить эту функцию на главном и рабочих узлах, и перезапустите службу kubelet.
Шаг 3: Создание деплоймента с sidecar контейнером
На этом шаге мы будем использовать образ nginx для запуска в нашем основном контейнере, который будет выступать в качестве контейнера приложения.
В нашем контейнере sidecar мы будем использовать «sadeghrz/kubernetes-pod2pod-log» для перехвата http-трафика от пода к поду.
Вот configmap, который мы будем использовать для передачи конфигурации нашему образу.
Согласно документации, я использую «SEND_LOGS_TO» с «stdout» для захвата HTTP-трафика и отправки его в вывод терминала.
У нас есть и другие варианты отправки логов в систему, которые вы можете изучить подробнее.
☸️ Обновление ConfigMap и secrets без перезапуска пода в K8s
Вот определение развертывания с контейнером sidecar для захвата HTTP-трафика как входящего, так и исходящего.
Обратите внимание, что мы запускаем initcontainer в привилегированном режиме, так как он требует захвата трафика интерфейса пода, что является операцией, недопустимой в непривилегированных контейнерах.
Шаг 4: Развертывание приложения
Теперь давайте применим наши файлы определения yaml к нашему кластеру kubernetes.
Шаг 5: Привязка порта к приложению
Здесь мы опубликуем наш деплоймент в качестве службы на nodeport, как показано ниже.
☸️ Определение пода Kubernetes в качестве службы NodePort
Шаг 6: Генерируем входящий и исходящий трафик
Здесь мы попробуем сгенерировать входящий и исходящий трафик с узла и внутри стручка соответственно, как показано ниже.
Трафик с ноды на под
Трафик из пода в Интернет
Шаг 7: Проверка логов
Если режим привилегий не включен в initcontainer и вы пытаетесь проверить логи initcontainer, вы увидите следующую ошибку.
Если режим привилегий включен, вы сможете увидеть входящий и исходящий http-трафик, регистрируемый в формате json в stdout, как показано ниже.
см. также:
- ☸️ Как проверить содержимое чарта Helm
- ☸️ Ротация сертификатов Kubernetes
- ☸️ Выполнение безопасных и автоматических перезагрузок нод Kubernetes с помощью Kured
- ☸️ Vesta: Анализ конфигурации кластеров Docker и Kubernetes и анализ уязвимостей
- ☸️ Защита трафика кластера Kubernetes с помощью сетевых политик подов
- 🐧 Как составить список и управлять атрибутами файлов на Linux