Кастомизация Sidecar-прокси Вебмониторэкс¶
Эта инструкция описывает способ безопасной тонкой настройки Sidecar-прокси решения Вебмониторэкс и содержит примеры частых настроек.
Уровни настройки¶
Настройка Sidecar-прокси решения Вебмониторэкс во многом идентична настройке стандартных компонентов Kubernetes. Решение можно настраивать как глобально через values.yaml
, так и на уровне отдельных подов приложений с помощью аннотаций.
Глобальная настройка¶
Глобальные настройки решения применяются ко всем компонентам Kubernetes, которые создает контроллер.
По умолчанию глобальные настройки заданы в исходном values.yaml
Helm-чарта. Чтобы изменить исходные настройки, вы можете создать кастомный values.yaml
и использовать его при выполнении команд helm install
и helm upgrade
.
Набор глобальных настроек решения не ограничен. Чтобы настроить решение корректно и не вызвать непредвиденного поведения компонентов, рекомендуем внимательно изучать документацию Helm и Kubernetes на соответствующие настройки.
Настройки на уровне подов¶
С помощью настроек на уровне подов вы можете кастомизировать решение Вебмониторэкс для отдельных приложений.
Настройка решения на уровне подов выполняется через аннотации подов. Аннотации имеют приоритет над глобальными настройками. Если один и тот же параметр задан в values.yaml
и через аннотацию, применяется значение параметра из аннотации.
Набор поддерживаемых аннотаций ограничен, но аннотации nginx-*-include
и nginx-*-snippet
позволяют встраивать в решение любую кастомную конфигурацию NGINX.
Список поддерживаемых аннотаций подов
Частые настройки¶
Набор настроек решения не ограничен, он зависит как от особенностей вашей инфраструктуры, так и от требований к функциональности Вебмониторэкс. Однако некоторые из настроек являются наиболее частыми, их внедряет большинство клиентов. В этой секции мы описали такие настройки с примерами с учетом лучших практик.
Подход к деплою контейнеров Вебмониторэкс¶
Вы можете выбрать один из следующих способов деплоя сервисов Вебмониторэкс:
-
Объединенный / Single (по умолчанию)
-
Раздельный / Split
Вы можете задать подход как глобально, так и на уровне отдельных подов:
-
Глобально: в параметре чарта
config.injectionStrategy.schema
передать значениеsingle
(по умолчанию) илиsplit
. -
На уровне отдельного пода: добавить аннотацию
sidecar.wallarm.io/sidecar-injection-schema
со значением"single"
или"split"
.
Модуль постаналитики
Контейнер с модулем постаналитики всегда запускается отдельно. Настройка подхода относится ко всем сервисам Вебмониторэкс, за исключением модуля постаналитики.
Объединенный деплой сервисов (по умолчанию)¶
Все сервисы Вебмониторэкс, за исключением модуля постаналитики и iptables, запускаются в одном контейнере.
В поде будут запущены 2 контейнера:
-
sidecar-init-iptables
— init-контейнер с сервисом iptables. Контейнер запускается по умолчанию, но вы можете отключить его. -
sidecar-proxy
с сервисами NGINX, модулями Вебмониторэкс и вспомогательными сервисами. Процессы запускает supervisord.
Контейнер с модулем постаналитики всегда запускается отдельно и не приведен в списке.
Раздельный деплой сервисов¶
Сервисы Вебмониторэкс распределены между несколькими контейнерами. В отличие от объединенного деплоя, вспомогательные сервисы Вебмониторэкс запускаются в отдельном контейнере. В контейнере sidecar-proxy
запускаются только сервисы NGINX.
Раздельный деплой сервисов позволяет отдельно выделять ресурсы для сервисов NGINX и вспомогательных сервисов. Такой подход рекомендуется для высоконагруженных приложений и API, чтобы распределять нагрузку более низкоуровнево и поддерживать стабильность работы системы.
В поде будут запущены 4 контейнера:
-
sidecar-init-iptables
— init-контейнер с сервисом iptables. Контейнер запускается по умолчанию, но вы можете отключить его. -
sidecar-init-helper
— init-контейнер со скриптами для подключения ноды к Вычислительному кластеру Вебмониторэкс. -
sidecar-proxy
с сервисами NGINX. -
sidecar-helper
с другими вспомогательными сервисами.
Контейнер с модулем постаналитики всегда запускается отдельно и не приведен в списке.
Автоопределение порта контейнера с приложением¶
Чтобы обрабатывать трафик, Sidecar-контейнеру Вебмониторэкс должен быть известен TCP-порт приложения, на который поступают входящие запросы.
Порт контейнера с приложением может быть настроен разными способами. Sidecar-контроллер определяет его автоматически на основе следующих настроек:
-
Аннотация пода
sidecar.wallarm.io/application-port
-
Порт, заданный в атрибуте
name: http
в настройках контейнера с приложением -
Первый порт, заданный в настройках контейнера с приложением
-
Значение
config.nginx.applicationPort
Helm-чарта
Контроллер проверяет эти настройки последовательно, переходит к следующей настройке, только если НЕ обнаружил значение в предыдущей.
Если контроллер определяет порт некорректно, задайте порт явно через настройку 1 или 4.
Перехват входящего трафика (переадресация портов)¶
По умолчанию для маршрутизации трафика, sidecar-контроллер Вебмониторэкс использует следующий алгоритм:
-
Перехватывает трафик с IP пода и порта контейнера с приложением.
-
Перенаправляет этот трафик на Sidecar-контейнер Вебмониторэкс, используя сервис iptables.
-
Блокирует (если задан режим
block
) вредоносные запросы и отправляет легитимный трафик на адрес контейнера приложения.
Это распространенный подход для автоматической переадресации портов. Перехват трафика выполняет init-контейнер с сервисом iptables.
Однако, этот подход уже реализован на стороне некоторых сервисов в подходе "service mesh", например, Istio. Внедрение такого же подхода, реализованного на стороне Вебмониторэкс, невозможно для инфраструктур с Istio и другими подобными сервисами.
Вы можете отключить перехват трафика с помощью iptables. Тогда переадресация портов будет работать следующим образом:
Чтобы отключить перехват трафика с помощью iptables:
-
Отключите iptables одним из способов:
- Глобально: в
values.yaml
задайтеconfig.injectionStrategy.iptablesEnable: "false"
- На уровне пода приложения: добавьте аннотацию
sidecar.wallarm.io/sidecar-injection-iptables-enable: "false"
- Глобально: в
-
Задайте
spec.ports.targetPort: proxy
в конфигурации объекта Service.Если перехват входящего трафика отключен, sidecar-контейнер публикует порт
proxy
и ожидает, что сервис Kubernetes будет перенаправлять трафик на этот порт.
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
wallarm-sidecar: enabled
annotations:
sidecar.wallarm.io/sidecar-injection-iptables-enable: "false"
spec:
containers:
- name: application
image: kennethreitz/httpbin
ports:
- name: http
containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
namespace: default
spec:
ports:
- port: 80
targetPort: proxy
protocol: TCP
name: http
selector:
app: myapp
Настройка ресурсов для контейнеров Вебмониторэкс¶
Количество ресурсов, выделенных для контейнеров Вебмониторэкс, определяет качество и скорость обработки запросов. Чтобы выделить достаточно запрашиваемых ресурсов и лимитов, изучите наши рекомендации.
Настройка ресурсов возможна как на глобальном уровне, так и на уровне отдельных подов.
Глобальная настройка ресурсов через Helm-чарт¶
Подход к деплою контейнеров | Название контейнера | Параметр чарта |
---|---|---|
Split, Single | sidecar-proxy | config.sidecar.containers.proxy.resources |
Split | sidecar-helper | config.sidecar.containers.helper.resources |
Split, Single | sidecar-init-iptables | config.sidecar.initContainers.iptables.resources |
Split | sidecar-init-helper | config.sidecar.initContainers.helper.resources |
Пример Helm-чарта для глобального определения ресурсов (requests & limits):
config:
sidecar:
containers:
proxy:
resources:
requests:
cpu: 200m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
helper:
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 300m
memory: 256Mi
initContainers:
helper:
resources:
requests:
cpu: 100m
memory: 64Mi
limits:
cpu: 300m
memory: 128Mi
iptables:
resources:
requests:
cpu: 50m
memory: 32Mi
limits:
cpu: 100m
memory: 64Mi
Настройка ресурсов на уровне подов через аннотации¶
Подход к деплою контейнеров | Название контейнера | Аннотация |
---|---|---|
Single, Split | sidecar-proxy | sidecar.wallarm.io/proxy-{cpu,memory,cpu-limit,memory-limit} |
Split | sidecar-helper | sidecar.wallarm.io/helper-{cpu,memory,cpu-limit,memory-limit} |
Single, Split | sidecar-init-iptables | sidecar.wallarm.io/init-iptables-{cpu,memory,cpu-limit,memory-limit} |
Split | sidecar-init-helper | sidecar.wallarm.io/init-helper-{cpu,memory,cpu-limit,memory-limit} |
Пример аннотаций для определения ресурсов (requests & limits) на уровне пода:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
wallarm-sidecar: enabled
annotations:
sidecar.wallarm.io/proxy-cpu: 200m
sidecar.wallarm.io/proxy-cpu-limit: 500m
sidecar.wallarm.io/proxy-memory: 256Mi
sidecar.wallarm.io/proxy-memory-limit: 512Mi
sidecar.wallarm.io/init-iptables-cpu: 50m
sidecar.wallarm.io/init-iptables-cpu-limit: 100m
sidecar.wallarm.io/init-iptables-memory: 32Mi
sidecar.wallarm.io/init-iptables-memory-limit: 64Mi
spec:
containers:
- name: application
image: kennethreitz/httpbin
ports:
- name: http
containerPort: 80
Включение дополнительных модулей NGINX¶
Docker-образ с Sidecar-прокси решением Вебмониторэкс поставляется со следующими дополнительными модулями NGINX:
По умолчанию эти модули отключены. Вы можете включать их на уровне отдельных подов через аннотацию sidecar.wallarm.io/nginx-extra-modules
.
Аннотация принимает массив из значений, например:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
wallarm-sidecar: enabled
annotations:
sidecar.wallarm.io/nginx-extra-modules: "['ngx_http_brotli_filter_module.so','ngx_http_brotli_static_module.so', 'ngx_http_opentracing_module.so']"
spec:
containers:
- name: application
image: kennethreitz/httpbin
ports:
- name: http
containerPort: 80
Кастомная конфигурация NGINX¶
Если для необходимых настроек NGINX нет отдельных аннотаций, вы можете задать их с помощью сниппетов и инклюдов на уровне подов приложений.
Сниппеты¶
Сниппеты используются для добавления одной или нескольких строк в конфигурацию NGINX. Для комплексных изменений конфигурации NGINX, рекомендуем использовать инклюды.
Решение Sidecar-прокси Вебмониторэкс поддерживает аннотации для кастомной конфигурации NGINX через сниппеты на уровне любого контекста:
Контекст NGINX | Аннотация |
---|---|
http | sidecar.wallarm.io/nginx-http-snippet |
server | sidecar.wallarm.io/nginx-server-snippet |
location | sidecar.wallarm.io/nginx-location-snippet |
Пример аннотации для изменения директивы disable_acl
(для директивы нет отдельной аннотации):
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
wallarm-sidecar: enabled
annotations:
sidecar.wallarm.io/wallarm-mode: block
sidecar.wallarm.io/nginx-location-snippet: "disable_acl on"
spec:
containers:
- name: application
image: kennethreitz/httpbin
ports:
- name: http
containerPort: 80
Чтобы задать 2 и более директивы, используйте символ ;
:
sidecar.wallarm.io/nginx-location-snippet: "disable_acl on;wallarm_timeslice 10"
Инклюды¶
Чтобы примонтировать дополнительный конфигурационный файл NGINX, вы можете создать из него ConfigMap или ресурс Secret и затем примонтировать его к sidecar-контейнеру.
Примонтировать файл из ConfigMap или Secret можно на уровне пода с помощью компонентов Volumes и VolumeMounts. Конфигурация задается в следующих аннотациях:
Объект | Аннотация | Тип значения |
---|---|---|
Volumes | sidecar.wallarm.io/proxy-extra-volumes | JSON |
Volume mounts | sidecar.wallarm.io/proxy-extra-volume-mounts | JSON |
Когда файл примонтирован, необходимо указать контекст NGINX, в который необходимо добавить конфигурацию из файла. Для этого в соответствующей аннотации передается путь до примонтированного файла:
Контекст NGINX | Аннотация | Тип значения |
---|---|---|
http | sidecar.wallarm.io/nginx-http-include | Массив |
server | sidecar.wallarm.io/nginx-server-include | Массив |
location | sidecar.wallarm.io/nginx-location-include | Массив |
Далее приведен пример аннотаций для монтирования конфигурации на уровне http
контекста NGINX. Предполагается, что ConfigMap nginx-http-include-cm
был создан заранее и содержит валидную конфигурацию NGINX.
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
wallarm-sidecar: enabled
annotations:
sidecar.wallarm.io/proxy-extra-volumes: "[{'name': 'nginx-http-extra-config', 'configMap': {'name': 'nginx-http-include-cm'}}]"
sidecar.wallarm.io/proxy-extra-volume-mounts: "[{'name': 'nginx-http-extra-config', 'mountPath': '/nginx_include/http.conf', 'subPath': 'http.conf'}]"
sidecar.wallarm.io/nginx-http-include: "['/nginx_include/http.conf']"
spec:
containers:
- name: application
image: kennethreitz/httpbin
ports:
- name: http
containerPort: 80
Настройка функциональности Вебмониторэкс¶
Помимо общих настроек решения, мы также рекомендуем ознакомиться с лучшими практиками по настройке функциональности Вебмониторэкс.
Настройка выполняется через аннотации и Консоль управления Вебмониторэкс.
Другие настройки через аннотации¶
Помимо перечисленных настроек, вы можете задать и множество других, используя аннотации.