Миграция с предыдущей версии 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. Подготовка¶
-
Составьте список Ingress предыдущей версии и используемых в них аннотаций (см. Аннотации NGINX).
-
Уменьшите время жизни (TTL) DNS‑записей приложений, чтобы ускорить переключение трафика.
-
Сохраните текущие параметры 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. Удаление предыдущей версии¶
-
Удалите копии Ingress предыдущей версии и предыдущую версию Ingress‑контроллера:
helm uninstall <OLD_RELEASE_NAME> -n <OLD_NAMESPACE> -
Удалите ноды предыдущей версии в Консоли управления Вебмониторэкс → Ноды.
-
При необходимости переименуйте класс Ingress (например, обратно в
nginx), обновивcontroller.ingressClass.nameиspec.ingressClassNameв Ingress.