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

Повышение стабильности работы Ingress‑контроллера

Новый Ingress‑контроллер

Ingress‑контроллер Вебмониторэкс построен на F5 NGINX Ingress Controller (open source). Предыдущая версия контроллера была построена на Community Ingress‑контроллере NGINX (ingress-nginx), поддержка которого прекращена сообществом Kubernetes в марте 2026 года.

Рекомендации в этой статье относятся к production‑окружениям. Настройки задаются в файле values.yaml и применяются командой helm upgrade (см. Настройка Ingress‑контроллера).

Несколько pod'ов Ingress‑контроллера

Запустите не менее двух pod'ов Ingress‑контроллера и разместите их на разных узлах кластера, чтобы отказ узла не прерывал обработку трафика:

controller:
  replicaCount: 2
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        - labelSelector:
            matchLabels:
              app.kubernetes.io/name: wmx-ingress
              app.kubernetes.io/instance: <RELEASE_NAME>
          topologyKey: kubernetes.io/hostname

<RELEASE_NAME> — название установки Helm. Если узлов в кластере меньше, чем pod'ов, используйте preferredDuringSchedulingIgnoredDuringExecution: иначе лишние pod'ы не будут запущены.

Чтобы обслуживание узлов (например, обновление кластера) не останавливало все pod'ы одновременно, включите PodDisruptionBudget:

controller:
  podDisruptionBudget:
    enabled: true
    minAvailable: 1

Горизонтальное масштабирование

Для кластеров с переменной нагрузкой включите автоматическое масштабирование (HPA). Для работы HPA в кластере должен быть установлен metrics-server, а для pod'ов — заданы запросы ресурсов.

controller:
  autoscaling:
    enabled: true
    minReplicas: 2
    maxReplicas: 10
    targetCPUUtilizationPercentage: 50
    targetMemoryUtilizationPercentage: 70

Ресурсы

Модуль Вебмониторэкс загружает правила обнаружения атак в каждый рабочий процесс NGINX, поэтому Ingress‑контроллеру требуется больше памяти, чем NGINX без модуля. Ориентировочно контейнер wmx-ingress использует 200–400 МБ; при перезагрузке конфигурации потребление памяти кратковременно возрастает до двух раз (см. ниже).

controller:
  resources:
    requests:
      cpu: 500m
      memory: 512Mi
    limits:
      memory: 1Gi

Уточните значения по результатам мониторинга на реальной нагрузке.

Постаналитика

Запустите не менее двух pod'ов постаналитики на разных узлах, чтобы данные об атаках выгружались и при отказе одного из них:

controller:
  wmx:
    postanalytics:
      replicaCount: 2
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                labelSelector:
                  matchLabels:
                    app.kubernetes.io/name: wmx-ingress-wmx-postanalytics
                    app.kubernetes.io/instance: <RELEASE_NAME>
                topologyKey: kubernetes.io/hostname

Объем памяти постаналитики задается параметром controller.wmx.postanalytics.arena (ГБ). Он должен вмещать запросы за последние 5–15 минут; при нехватке памяти часть данных об атаках теряется (метрика wallarm_requests_lost).

Уменьшение количества pod'ов

При уменьшении количества pod'ов постаналитики данные, которые еще не были выгружены из удаляемых pod'ов, теряются. Уменьшайте количество pod'ов в периоды низкой нагрузки.

Изменения сервисов и перезагрузки NGINX

По умолчанию Ingress‑контроллер направляет трафик напрямую на pod'ы сервиса и перезагружает конфигурацию NGINX при каждом изменении их набора: при масштабировании, обновлении или перезапуске приложения. Перезагрузка с модулем Вебмониторэкс занимает около секунды, на это время увеличиваются задержки ответов и потребление памяти.

Для сервисов, которые часто масштабируются (например, с HPA), включите передачу трафика через ClusterIP сервиса. Тогда изменения pod'ов не вызывают перезагрузок NGINX, а распределение запросов между pod'ами выполняет Kubernetes:

kubectl annotate ingress <INGRESS_NAME> nginx.org/use-cluster-ip=true

Ограничения ClusterIP

С аннотацией nginx.org/use-cluster-ip недоступны функции, которые требуют выбора pod'а в NGINX: привязка сессий (sticky sessions), методы балансировки NGINX и повтор запроса на другом pod'е (proxy_next_upstream). Не используйте аннотацию для сервисов, которым нужны эти функции.

После перезагрузки старые рабочие процессы NGINX завершаются, когда закрываются их соединения. Долгоживущие соединения (WebSocket, gRPC‑потоки) могут удерживать старые процессы и их память. Ограничьте время завершения:

controller:
  config:
    entries:
      worker-shutdown-timeout: 240s

Аварийный режим

Параметр controller.wmx.fallback (по умолчанию on) позволяет NGINX продолжать пропускать трафик, если нода не смогла загрузить правила обнаружения атак или зарегистрироваться в Вычислительном кластере (например, при недоступности api.webmonitorx.ru). В этом случае трафик не анализируется. Не выключайте аварийный режим в production‑окружении, если доступность приложений важнее непрерывности защиты.