Миграция с Ingress-NGINX Controller на ANIC#
Для миграции ANIC должен быть установлен на том же хосте, где уже работает Ingress-NGINX Controller. Настройте ConfigMap для ANIC, добавив общие параметры для всех Ingress.
Эти параметры будут дефолтными для всех Ingress, если конкретный манифест их не переопределяет. В манифестах для сервисов измените аннотации Ingress-NGINX Controller на соответствующие аннотации ANIC, где это необходимо. Для аннотаций, которые не поддерживаются в ANIC, используйте другие варианты настройки конфигурации (см. примеры ниже). По очереди перенесите манифесты для сервисов, проверяя, что каждый манифест работает корректно. Примечание Не рекомендуется изменять поле В таблице ниже приведены аннотации Ingress-NGINX Controller с эквивалентными аннотациями ANIC. Ingress-NGINX Controller ANIC Полный список аннотаций ANIC см. в разделе Расширенная конфигурация с помощью аннотаций. В таблице ниже приведено ключи ConfigMap в Ingress-NGINX Controller и их эквиваленты в ANIC. Ingress-NGINX Controller ANIC Ingress-NGINX Controller: ANIC: ANIC предоставляет доступ к TCP- и UDP-сервисам с помощью ресурсов TransportServer и GlobalConfiguration.
Ingress-NGINX Controller использует для этой цели ConfigMap. Канареечные и сине-зеленые развертывания (сanary deployment и blue-green deployment) позволяют
внедрять изменения в код в продакшн-среде, не прерывая работу пользователей.
ANIC выполняет развертывания на уровне передачи данных: чтобы перейти с Ingress-NGINX Controller на ANIC,
необходимо сопоставить аннотации Ingress-NGINX Controller с ресурсами VirtualServer и VirtualServerRoute в ANIC. Ingress-NGINX Controller обрабатывает канареечные аннотации в следующем порядке: Примечание Чтобы канареечные аннотации интерпретировались в ANIC аналогично, они должны располагаться в манифесте VirtualServer или VirtualServerRoute в том же порядке. nginx.ingress.kubernetes.io/canary-by-header Ingress-NGINX Controller: ANIC: Ingress-NGINX Controller: ANIC: nginx.ingress.kubernetes.io/canary-by-cookie Ingress-NGINX Controller: ANIC: Аннотации Ingress-NGINX Controller, для которых пока нет соответствующих полей в ресурсах ANIC, необходимо обрабатывать с помощью фрагментов (сниппетов). Примечание Для работы в чарте необходимо установить В примерах ниже аннотации Ingress-NGINX Controller сопоставлены с ресурсами VirtualServer
и VirtualServerRoute в ANIC. custom-http-errors Ingress-NGINX Controller: ANIC: limit-connections Ingress-NGINX Controller: ANIC: limit-rate Ingress-NGINX Controller: ANIC: limit-rpm Ingress-NGINX Controller: ANIC: limit-rps Ingress-NGINX Controller: ANIC: limit-whitelist Ingress-NGINX Controller: ANIC: rewrite-target Ingress-NGINX Controller: ANIC: Ingress-NGINX Controller: ANIC: Установка для Ingress возможна с помощью аннотации В таблице ниже приведены аннотации Ingress-NGINX Controller и параметры в поле Ingress-NGINX Controller ANIC ANIC может обрабатывать аутентификацию mTLS на уровне входного трафика, требуя предоставления действительных сертификатов для внешних соединений. Настройка реализуется с помощью ресурсов Policy, соответствующих аннотациям Ingress-NGINX Controller. Ingress-NGINX Controller: ANIC: Ingress-NGINX Controller: ANIC: Для сохранения сессий в ANIC используются ресурсы Policy. В Ingress-NGINX Controller используются соответствующие аннотации. Ingress-NGINX Controller: ANIC: Ingress-NGINX Controller: ANIC: Используется собственная реализация (применима только для VirtualServer): настройка OIDC.Перенос конфигурации#
spec
в ресурсе Ingress. Реализации Ingress-NGINX Controller и ANIC отличаются, что может привести к проблемам совместимости.Соответствия для аннотаций#
nginx.ingress.kubernetes.io/configuration-snippet
angie.software/location-snippets
nginx.ingress.kubernetes.io/load-balance
angie.software/lb-method
nginx.ingress.kubernetes.io/proxy-buffering
angie.software/proxy-buffering
nginx.ingress.kubernetes.io/proxy-buffers-number
angie.software/proxy-buffers
nginx.ingress.kubernetes.io/proxy-buffer-size
angie.software/proxy-buffer-size
nginx.ingress.kubernetes.io/proxy-connect-timeout
angie.software/proxy-connect-timeout
nginx.ingress.kubernetes.io/proxy-read-timeout
angie.software/proxy-read-timeout
nginx.ingress.kubernetes.io/proxy-send-timeout
angie.software/proxy-send-timeout
nginx.ingress.kubernetes.io/rewrite-target
angie.software/rewrites
nginx.ingress.kubernetes.io/server-snippet
angie.software/server-snippets
nginx.ingress.kubernetes.io/ssl-redirect
ingress.kubernetes.io/ssl-redirect
Глобальная конфигурация с помощью ConfigMap#
disable-access-log
access-log-off
hsts
hsts
hsts-include-subdomains
hsts-include-subdomains
hsts-max-age
hsts-max-age
http-snippet
http-snippets
keep-alive
keepalive-timeout
keep-alive-requests
keepalive-requests
load-balance
lb-method
location-snippet
location-snippets
log-format-escape-json
log-format-escaping: “json”
log-format-stream
stream-log-format
log-format-upstream
log-format
main-snippet
main-snippets
max-worker-connections
worker-connections
max-worker-open-files
worker-rlimit-nofile
proxy-body-size
client-max-body-size
proxy-buffering
proxy-buffering
proxy-buffers-number
proxy-buffers: number size
proxy-buffer-size
proxy-buffers: number size
proxy-connect-timeout
proxy-connect-timeout
proxy-read-timeout
proxy-read-timeout
proxy-send-timeout
proxy-send-timeout
server-name-hash-bucket-size
server-names-hash-bucket-size
proxy-headers-hash-max-size
server-names-hash-max-size
server-snippet
server-snippets
server-tokens
server-tokens
upstream-keepalive-connections
keepalive
use-http2
http2
use-proxy-protocol
proxy-protocol
variables-hash-bucket-size
variables-hash-bucket-size
worker-cpu-affinity
worker-cpu-affinity
worker-processes
worker-processes
worker-shutdown-timeout
worker-shutdown-timeout
Примеры#
Настройка терминации SSL и маршрутизации на основе HTTP-путей#
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-test
spec:
tls:
- hosts:
- foo.bar.com
secretName: tls-secret
rules:
- host: foo.bar.com
http:
paths:
- path: /login
backend:
serviceName: login-svc
servicePort: 80
- path: /billing
serviceName: billing-svc
servicePort: 80
apiVersion: networking.k8s.io/v1
kind: VirtualServer
metadata:
name: anic-test
spec:
host: foo.bar.com
tls:
secret: tls-secret
upstreams:
- name: login
service: login-svc
port: 80
- name: billing
service: billing-svc
port: 80
routes:
- path: /login
action:
pass: login
- path: /billing
action:
pass: billing
Настройка балансировки нагрузки TCP/UDP и TLS Passthrough#
Канареечные развертывания#
nginx.ingress.kubernetes.io/canary-by-header
nginx.ingress.kubernetes.io/canary-by-cookie
nginx.ingress.kubernetes.io/canary-by-weight
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "httpHeader"
matches:
- conditions:
- header: httpHeader
value: never
action:
pass: echo
- header: httpHeader
value: always
action:
pass: echo-canary
action:
pass: echo
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "httpHeader"
nginx.ingress.kubernetes.io/canary-by-header-value: "my-value"
matches:
- conditions:
- header: httpHeader
value: my-value
action:
pass: echo-canary
action:
pass: echo
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-cookie: "cookieName"
matches:
- conditions:
- cookie: cookieName
value: never
action:
pass: echo
- cookie: cookieName
value: always
action:
pass: echo-canary
action:
pass: echo
Управление трафиком#
controller.enableSnippets
в true
.nginx.ingress.kubernetes.io/custom-http-errors: "code"
nginx.ingress.kubernetes.io/default-backend: "default-svc"
errorPages:
- codes: [code]
redirect:
code: 301
url: default-svc
nginx.ingress.kubernetes.io/limit-connections: "number"
http-snippets: |
limit_conn_zone $binary_remote_addr zone=zone_name:size;
routes:
- path: /path
location-snippets: |
limit_conn zone_name number;
nginx.ingress.kubernetes.io/limit-rate: "number"
nginx.ingress.kubernetes.io/limit-rate-after: "number"
location-snippets: |
limit_rate number;
limit_rate_after number;
nginx.ingress.kubernetes.io/limit-rpm: "number"
nginx.ingress.kubernetes.io/limit-burst-multiplier: "multiplier"
rateLimit:
rate: numberr/m
burst: number * multiplier
key: ${binary_remote_addr}
zoneSize: size
nginx.ingress.kubernetes.io/limit-rps: "number"
nginx.ingress.kubernetes.io/limit-burst-multiplier: "multiplier"
rateLimit:
rate: numberr/s
burst: number * multiplier
key: ${binary_remote_addr}
zoneSize: size
nginx.ingress.kubernetes.io/limit-whitelist: "CIDR"
http-snippets: |
server-snippets: |
nginx.ingress.kubernetes.io/rewrite-target: "URI"
rewritePath: "URI"
Манипуляция заголовками#
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
nginx.ingress.kubernetes.io/cors-allow-headers: "X-Forwarded-For"
nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, OPTIONS"
nginx.ingress.kubernetes.io/cors-allow-origin: "*"
nginx.ingress.kubernetes.io/cors-max-age: "seconds"
angie.software/location-snippets
.
Для работы в чарте необходимо установить controller.enableSnippets
в true
.Ingress:
annotations:
angie.software/location-snippets |
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;
VirtualServer
responseHeaders:
add:
- name: Access-Control-Allow-Credentials
value: "true"
- name: Access-Control-Allow-Headers
value: "X-Forwarded-For"
- name: Access-Control-Allow-Methods
value: "PUT, GET, POST, OPTIONS"
- name: Access-Control-Allow-Origin
value: "*"
- name: Access-Control-Max-Age
value: "seconds"
Проксирование и балансировка нагрузки#
upstream
для ресурсов VirtualServer и VirtualServerRoute.nginx.ingress.kubernetes.io/load-balance
lb-method
nginx.ingress.kubernetes.io/proxy-buffering
buffering
nnginx.ingress.kubernetes.io/proxy-buffers-number
buffers
nginx.ingress.kubernetes.io/proxy-next-upstream
next-upstream
nginx.ingress.kubernetes.io/proxy-next-upstream-timeout
next-upstream-timeout
nginx.ingress.kubernetes.io/proxy-read-timeout
read-timeout
nginx.ingress.kubernetes.io/proxy-send-timeout
send-timeout
nginx.ingress.kubernetes.io/service-upstream
use-cluster-ip
Аутентификация mTLS#
nginx.ingress.kubernetes.io/auth-tls-secret: secretName
nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"
nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1"
ingressMTLS:
clientCertSecret: secretName
verifyClient: "on"
verifyDepth: 1
nginx.ingress.kubernetes.io/proxy-ssl-secret: "secretName"
nginx.ingress.kubernetes.io/proxy-ssl-verify: "on|off"
nginx.ingress.kubernetes.io/proxy-ssl-verify-depth: "1"
nginx.ingress.kubernetes.io/proxy-ssl-protocols: "TLSv1.2"
nginx.ingress.kubernetes.io/proxy-ssl-ciphers: "DEFAULT"
nginx.ingress.kubernetes.io/proxy-ssl-name: "server-name"
nginx.ingress.kubernetes.io/proxy-ssl-server-name: "on|off"
egressMTLS:
tlsSecret: secretName
verifyServer: true|false
verifyDepth: 1
protocols: TLSv1.2
ciphers: DEFAULT
sslName: server-name
serverName: true|false
Сохранение сессий#
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "cookieName"
nginx.ingress.kubernetes.io/session-cookie-expires: "x"
nginx.ingress.kubernetes.io/session-cookie-path: "/route"
nginx.ingress.kubernetes.io/session-cookie-secure: "true"
sessionCookie:
enable: true
name: cookieName
expires: xh
path: /route
secure: true
Аутентификация через внешний сервис#
nginx.ingress.kubernetes.io/auth-url