Перейти к содержанию

Кастомизация 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

Single and split containers

Вы можете задать подход как глобально, так и на уровне отдельных подов:

  • Глобально: в параметре чарта 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-контроллер определяет его автоматически на основе следующих настроек:

  1. Аннотация пода sidecar.wallarm.io/application-port

  2. Порт, заданный в атрибуте name: http в настройках контейнера с приложением

  3. Первый порт, заданный в настройках контейнера с приложением

  4. Значение config.nginx.applicationPort Helm-чарта

Контроллер проверяет эти настройки последовательно, переходит к следующей настройке, только если НЕ обнаружил значение в предыдущей.

Если контроллер определяет порт некорректно, задайте порт явно через настройку 1 или 4.

Перехват входящего трафика (переадресация портов)

По умолчанию для маршрутизации трафика, sidecar-контроллер Вебмониторэкс использует следующий алгоритм:

  1. Перехватывает трафик с IP пода и порта контейнера с приложением.

  2. Перенаправляет этот трафик на Sidecar-контейнер Вебмониторэкс, используя сервис iptables.

  3. Блокирует (если задан режим block) вредоносные запросы и отправляет легитимный трафик на адрес контейнера приложения.

Это распространенный подход для автоматической переадресации портов. Перехват трафика выполняет init-контейнер с сервисом iptables.

Default port forwarding with iptables

Однако, этот подход уже реализован на стороне некоторых сервисов в подходе "service mesh", например, Istio. Внедрение такого же подхода, реализованного на стороне Вебмониторэкс, невозможно для инфраструктур с Istio и другими подобными сервисами.

Вы можете отключить перехват трафика с помощью iptables. Тогда переадресация портов будет работать следующим образом:

Port forwarding without iptables

Чтобы отключить перехват трафика с помощью iptables:

  1. Отключите iptables одним из способов:

    • Глобально: в values.yaml задайте config.injectionStrategy.iptablesEnable: "false"
    • На уровне пода приложения: добавьте аннотацию sidecar.wallarm.io/sidecar-injection-iptables-enable: "false"
  2. Задайте 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

Настройка функциональности Вебмониторэкс

Помимо общих настроек решения, мы также рекомендуем ознакомиться с лучшими практиками по настройке функциональности Вебмониторэкс.

Настройка выполняется через аннотации и Консоль управления Вебмониторэкс.

Другие настройки через аннотации

Помимо перечисленных настроек, вы можете задать и множество других, используя аннотации.

Список поддерживаемых аннотаций