Настройка 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

  1. На стороне 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
  2. При последующем создании 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"
  3. Для 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"