【问题标题】:How NGINX Ingress controller back-end protocol annotation works in path based routing?NGINX Ingress 控制器后端协议注释如何在基于路径的路由中工作?
【发布时间】:2021-02-15 05:03:44
【问题描述】:

我目前正在我的 k8s 集群中使用 NGINX 入口控制器。我试图使端到端加密工作,并且能够使连接一直安全到 pod。

为了实现 HTTPS 一直到 pod,我不得不使用注解

nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"

示例入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: foo-api-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  tls:
  - hosts:
    - foo.example.com
    secretName: foo-cert
  rules:
  - host: foo.example.com
    http:
      paths:
      - path: /path1
        backend:
          serviceName: foo-api-path1-service
          servicePort: 443
      - path: /path2
        backend:
          serviceName: foo-api-path2-service
          servicePort: 443

我对这究竟是如何发生的感到困惑,因为当我们加密连接路径时也会加密,那么 NGINX 如何进行基于路径的路由?它会在入口处解密连接并重新加密吗?另外,使用这种方法会影响性能吗?

【问题讨论】:

    标签: ssl nginx kubernetes kubernetes-ingress nginx-ingress


    【解决方案1】:

    TL;DR

    它会在入口处解密连接并重新加密吗?

    简而言之,是的。请看下面的解释。


    说明

    请求到达Pod 的路径可以看作:

    假设我们使用Ingress controller (nginx-ingress) 代替Ingress,您可以通过多种方式将您的客户端与Pod(简化)联系起来:

    • 未加密:
      • client -- (HTTP) --> Ingress controller -- (HTTP) --> Service ----> Pod

    • Ingress controller 加密(使用nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
      • client -- (HTTP) --> Ingress controller -- (HTTPS) --> Service ----> Pod

    • 在发生TLS TerminationIngress controller 处加密和解密:
      • client -- (HTTPS) --> Ingress controller (TLS 终止) -- (HTTP) --> Service ----> Pod

    您的设置:

    • Ingress 发生TLS Termination 的控制器上加密和解密,并在nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" 与HTTPS 后端连接时再次加密
      • client -- (HTTPS) --> Ingress controller (TLS 终止) -- (HTTPS) --> Service ----> Pod

    • Pod 处加密和解密,其中Ingress controller 配置为SSL Passthrough
      • client -- (HTTPS) --> Ingress controller -- (HTTPS) --> Service ----> Pod

    免责声明!

    这只是一个简化的解释。如需更多参考,您可以查看此评论:

    这里缺少一个细节,SSL Passthrough 流量永远不会到达入口控制器中的 NGINX。有一个用于 TLS 连接的 go listener,它只是将流量通过管道传输到 ingress 中定义的服务。



    如需更多参考,您可以查看类似问题(附有答案):

    您也可以使用与您类似的示例设置来查看这篇文章:


    其他资源:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      • 2021-09-15
      • 2020-06-30
      • 2021-09-17
      • 1970-01-01
      • 2021-10-30
      相关资源
      最近更新 更多