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

Миграция с предыдущей версии Ingress‑контроллера

Предыдущая версия Ingress‑контроллера Вебмониторэкс построена на Community Ingress‑контроллере NGINX (ingress-nginx). Сообщество Kubernetes прекратило поддержку ingress-nginx в марте 2026 года: исправления, в том числе исправления уязвимостей, больше не выпускаются. Новая версия Ingress‑контроллера Вебмониторэкс построена на поддерживаемом F5 NGINX Ingress Controller.

В этой статье описаны отличия новой версии и порядок перехода без простоя: новый Ingress‑контроллер устанавливается рядом с предыдущим, после проверки на него переключается трафик.

Обновить предыдущую версию командой helm upgrade нельзя: у новой версии другой Helm‑чарт, другие названия параметров и формат образов. Кроме того, обе версии по умолчанию создают класс Ingress nginx, поэтому установка новой версии с параметрами по умолчанию рядом с предыдущей завершится ошибкой: IngressClass nginx уже принадлежит другой установке Helm.

Что меняется

Предыдущая версия (ingress-nginx) Новая версия (F5 NGINX Ingress Controller)
Helm‑чарт webmonitorx-ingress, параметры в controller.wallarm новый чарт, параметры в controller.wmx (см. таблицу)
Аннотации Вебмониторэкс nginx.ingress.kubernetes.io/wallarm-* prowaf.wmx.pro/*; прежние названия также поддерживаются
Глобальные настройки Вебмониторэкс (ConfigMap) wallarm-* те же ключи wallarm-* в controller.config.entries
Прочие аннотации NGINX nginx.ingress.kubernetes.io/* nginx.org/* (см. ниже)
Несколько Ingress с одним хостом объединяются второй Ingress отклоняется; используйте объединяемые Ingress
Сниппеты в аннотациях Ingress разрешены настройкой allow-snippet-annotations отключены; см. ниже
Определение IP‑адреса клиента enable-real-ip, forwarded-for-header, proxy-real-ip-cidr real-ip-header, set-real-ip-from, real-ip-recursive (см. инструкцию)
Проверка аннотаций webhook проверяет все аннотации до применения Ingress до применения проверяются аннотации Вебмониторэкс; при ошибке в прочих аннотациях Ingress отклоняется контроллером, а его маршруты удаляются

Параметры Helm‑чарта

Предыдущая версия Новая версия
controller.wallarm.enabled controller.wmx.enable
controller.wallarm.token controller.wmx.token
controller.wallarm.existingSecret.enabled, .secretName, .secretKey controller.wmx.existingSecret.name, .key (Secret используется, если задано name)
controller.wallarm.apiHost, apiPort, apiSSL, apiCaVerify controller.wmx.api.host, port, ssl, caVerify
controller.wallarm.fallback controller.wmx.fallback
controller.wallarm.tarantool.kind, replicaCount, arena controller.wmx.postanalytics.kind, replicaCount, arena
controller.wallarm.tarantool.resources controller.wmx.postanalytics.tarantool.resources
controller.wallarm.tarantool.affinity, tolerations, nodeSelector, topologySpreadConstraints, livenessProbe, terminationGracePeriodSeconds controller.wmx.postanalytics.* с теми же названиями
controller.wallarm.metrics.enabled controller.wmx.metrics.service.create
controller.wallarm.metrics.port controller.wmx.metrics.port
controller.wallarm.<сервис>.resources (collectd, exportEnvironment, exportAttacks и др.) controller.wmx.<сервис>.resources для сервисов в pod'е контроллера и controller.wmx.postanalytics.<сервис>.resources для сервисов постаналитики (см. список)
controller.ingressClassResource.name controller.ingressClass.name
controller.replicaCount, controller.affinity, controller.resources, controller.service.* те же названия

Аннотации Вебмониторэкс

Аннотации nginx.ingress.kubernetes.io/wallarm-* работают в новой версии без изменений. Рекомендуем перейти на новые названия:

Предыдущая версия Новая версия
nginx.ingress.kubernetes.io/wallarm-mode prowaf.wmx.pro/mode
nginx.ingress.kubernetes.io/wallarm-mode-allow-override prowaf.wmx.pro/mode-allow-override
nginx.ingress.kubernetes.io/wallarm-application, wallarm-instance prowaf.wmx.pro/application
nginx.ingress.kubernetes.io/wallarm-block-page prowaf.wmx.pro/block-page
nginx.ingress.kubernetes.io/wallarm-acl-block-page (устарела) prowaf.wmx.pro/block-page
nginx.ingress.kubernetes.io/wallarm-parse-response prowaf.wmx.pro/parse-response
nginx.ingress.kubernetes.io/wallarm-unpack-response prowaf.wmx.pro/unpack-response
nginx.ingress.kubernetes.io/wallarm-parse-websocket prowaf.wmx.pro/parse-websocket
nginx.ingress.kubernetes.io/wallarm-parser-disable prowaf.wmx.pro/parser-disable
nginx.ingress.kubernetes.io/wallarm-fallback prowaf.wmx.pro/fallback
nginx.ingress.kubernetes.io/wallarm-partner-client-uuid prowaf.wmx.pro/partner-client-uuid

Более строгая проверка значений

Аннотации nginx.ingress.kubernetes.io/wallarm-* работают как раньше: если значение некорректно, оно игнорируется и действует значение по умолчанию, а в событиях Ingress появляется предупреждение (kubectl describe ingress <INGRESS_NAME>). Проверьте события после переноса: например, в application теперь допускаются только цифры, а в block-page — только пробелы и табуляция в качестве разделителей, файл страницы блокировки (&...) должен лежать в /usr/share/nginx/html/, переменные NGINX ($...) не допускаются — такие значения перенесите в ConfigMap (wallarm-block-page).

Аннотации prowaf.wmx.pro/ проверяются строго: Ingress с некорректным значением не применяется.

Аннотации NGINX

Аннотации ingress-nginx (nginx.ingress.kubernetes.io/rewrite-target, ssl-redirect, proxy-body-size и др.) новой версией не обрабатываются. Используйте соответствующие аннотации nginx.org/* или ключи ConfigMap. Соответствие аннотаций и ключей ConfigMap приведено в руководстве F5 по миграции с ingress-nginx.

Найти аннотации ingress-nginx, используемые в кластере:

kubectl get ingress -A -o json \
  | jq -r '.items[] | .metadata.namespace + "/" + .metadata.name + ": " +
      ((.metadata.annotations // {}) | keys | map(select(startswith("nginx.ingress.kubernetes.io/") and (contains("wallarm") | not))) | join(", "))' \
  | grep -v ': $'

Сниппеты

Сниппеты позволяют вставлять произвольные директивы NGINX и поэтому по умолчанию отключены. Вместо сниппетов:

  • Глобальные директивы задавайте в ключах ConfigMap http-snippets, server-snippets и location-snippets раздела controller.config.entries — они применяются ко всем Ingress и управляются только администратором Ingress‑контроллера.

  • Настройки Вебмониторэкс, которые раньше задавались сниппетами (например, wallarm_enable_libdetection), задавайте глобально.

Если сниппеты в аннотациях Ingress необходимы, включите их параметром controller.enableSnippets: true и используйте аннотации nginx.org/server-snippets и nginx.org/location-snippets. Учитывайте, что сниппеты позволяют любому, кто может изменять Ingress, изменить конфигурацию NGINX.

Порядок перехода

1. Подготовка

  1. Составьте список Ingress предыдущей версии и используемых в них аннотаций (см. Аннотации NGINX).

  2. Уменьшите время жизни (TTL) DNS‑записей приложений, чтобы ускорить переключение трафика.

  3. Сохраните текущие параметры Helm‑чарта:

    helm get values <OLD_RELEASE_NAME> -n <OLD_NAMESPACE> > old-values.yaml
    

2. Установка новой версии рядом с предыдущей

Установите новую версию по инструкции в отдельное пространство имен. Задайте классу Ingress название, которое не используется предыдущей версией (по умолчанию обе версии используют класс nginx), и перенесите параметры по таблице:

controller:
  ingressClass:
    name: wmx-nginx
  wmx:
    enable: true
    existingSecret:
      name: wmx-node-token
  service:
    externalTrafficPolicy: Local

Новый Ingress‑контроллер получит собственный внешний адрес. Трафик приложений на него пока не поступает.

Новый Ingress‑контроллер обрабатывает только Ingress своего класса (wmx-nginx): Ingress предыдущей версии, в том числе Ingress без класса, он не изменяет и не проверяет. Проверка аннотаций при применении (ValidatingAdmissionPolicy) тоже действует только для Ingress класса wmx-nginx.

3. Создание Ingress для новой версии

Для каждого Ingress создайте копию с другим названием и классом wmx-nginx, заменив аннотации ingress-nginx на аннотации nginx.org/*. Аннотации Вебмониторэкс можно перенести без изменений или заменить на prowaf.wmx.pro/*.

Если несколько Ingress используют один хост, объедините их в объединяемые Ingress.

Если сертификаты выпускает cert-manager:

  • Перенесите в копию аннотацию cert-manager.io/issuer или cert-manager.io/cluster-issuer и секцию tls с тем же Secret. Сертификат (ресурс Certificate) принадлежит Ingress предыдущей версии; после его удаления cert-manager создаст Certificate для копии и продолжит использовать существующий Secret без перевыпуска. Если Certificate не появился через минуту, измените любую аннотацию копии: cert-manager проверит ее заново.

  • Для проверки HTTP‑01 добавьте в копию аннотацию acme.cert-manager.io/http01-edit-in-place: "true". Без нее cert-manager создает для проверки отдельный Ingress с тем же хостом, а Ingress‑контроллер не принимает два Ingress одного класса с одним хостом.

  • После переключения трафика укажите в Issuer новый класс Ingress (solvers[].http01.ingress.ingressClassName).

4. Проверка

Отправьте запросы на новый Ingress‑контроллер, не меняя DNS:

curl --resolve app.example.com:443:<NEW_EXTERNAL_IP> https://app.example.com/
curl --resolve app.example.com:443:<NEW_EXTERNAL_IP> "https://app.example.com/?file=../../etc/passwd"

Убедитесь, что приложения работают, атаки отображаются в Консоли управления, а в событиях Ingress нет ошибок:

kubectl get events -A --field-selector involvedObject.kind=Ingress

5. Переключение трафика

Направьте трафик на новый внешний адрес: измените DNS‑записи или настройки внешнего балансировщика. Предыдущую версию не удаляйте, пока не истечет TTL DNS‑записей: клиенты с устаревшими записями продолжат обращаться к ней.

6. Удаление предыдущей версии

  1. Удалите копии Ingress предыдущей версии и предыдущую версию Ingress‑контроллера:

    helm uninstall <OLD_RELEASE_NAME> -n <OLD_NAMESPACE>
    
  2. Удалите ноды предыдущей версии в Консоли управления Вебмониторэкс → Ноды.

  3. При необходимости переименуйте класс Ingress (например, обратно в nginx), обновив controller.ingressClass.name и spec.ingressClassName в Ingress.