Настройка TLS-Passthrough на ingress-контроллере nginx
1. При использовании TLS-PassThrough на Nginx Ingress-контроллер необходимо учитывать следующие особенности
-
для Ingress объектов с активированным TLS-PassThrough не работает path-based routing, так как path зашифрован
-
все запросы Ingress отправляет напрямую на IP адрес соответствующего объекта Service, соответственно stickiness и load-balancing настраивается на стороне объекта Service:
-
использование TLS-PassThrough снижает производительность Ingress-контроллера (простой тест при помощи Locust показал 5-10% снижение Average Response Time)
-
не работает для клиентов с версией TLS, не поддерживающей SNI
2. Алгоритм активации tls-passthrough
-
На стороне Ingress-контроллер необходимо добавить команду
--enable-ssl-passthrough=true
к строке аргументов, передаваемых nginx. Для этого необходимо изменить кастомизациюnova-release-ingress-public-main
, добавив в нее следующий патч:- patch: | - op: add path: /spec/template/spec/containers/0/args value: - /nginx-ingress-controller - '--enable-ssl-passthrough=true' - '--publish-service=$(POD_NAMESPACE)/nova-ingress-public-controller' - '--election-id=nova-ingress-public-leader' - '--controller-class=k8s.io/nginx-public' - '--ingress-class=nginx' - '--configmap=$(POD_NAMESPACE)/nova-ingress-public-controller' - '--report-node-internal-ip-address=true' - '--validating-webhook=:8443' - '--validating-webhook-certificate=/usr/local/certificates/tls.crt' - '--validating-webhook-key=/usr/local/certificates/tls.key' - >- --tcp-services-configmap=$(POD_NAMESPACE)/nova-ingress-public-tcp-services-config - >- --udp-services-configmap=$(POD_NAMESPACE)/nova-ingress-public-udp-services-config
-
При последующем создании ingress-обьектов, для активации tls-passthough необходимо добавить следующие аннотации:
annotations: nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" nginx.ingress.kubernetes.io/ssl-passthrough: "true" nginx.ingress.kubernetes.io/ssl-redirect: "true"
-
Для ingress-обьектов с
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
Nginx работает в режиме TCP-proxy, при этом клиентские сертификаты не передаются бэкенду, что препятствует реализации mTLS. Для корректной работы mTLS необходимо добавить следующую аннотацию к ingress-обьекту:nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true"