详解 外部负载均衡器 → Ingress Controller Pod 这个过程

发布于:2025-08-29 ⋅ 阅读:(19) ⋅ 点赞:(0)

在常见的生产架构中:
外部负载均衡器(Ng/ELB/ALB/NLB等)终止来自客户端的 HTTPS 连接。
它将解密后的明文 HTTP 请求转发给后端的 Kubernetes Ingress Controller Pods。
Ingress Controller 处理 HTTP 请求,并将 HTTP 响应返回给负载均衡器。
负载均衡器重新加密这个 HTTP 响应为 HTTPS,并最终返回给原始客户端。
总结:对于客户端来说,他始终认为自己在进行端到端的 HTTPS 通信,完全不知道后端发生了 TLS 终止和再加密的过程。

为什么选择在外部负载均衡器终止 TLS?(SSL Termination)

这种做法被称为 SSL Termination 或 TLS Termination,主要有以下几个优势:

性能开销降低:

TLS 加密解密是 CPU 密集型操作。将这项工作卸载到专门优化的、通常具有硬件加速功能的外部负载均衡器上,可以显著减轻集群内 Ingress Controller 和 Worker 节点的计算压力,让它们更专注于处理业务逻辑。

负载均衡器可以集中高效地处理大量 TLS 握手和加密操作。

简化证书管理:

你只需要在负载均衡器上配置和管理 SSL/TLS 证书(例如,从 AWS Certificate Manager, Let‘s Encrypt 等获取和自动续签)。

集群内部的 Ingress Controller 和所有后端服务完全不需要关心证书问题,简化了配置和安全管理。你不再需要将证书作为 Secret 挂载到 Ingress Controller Pod 中。

增强可观测性和灵活性:

负载均衡器可以提供丰富的、与应用层解耦的 TLS 相关指标(如 TLS 版本、密码套件、握手错误等)。

你可以在负载均衡器层灵活地设置安全策略(如强制 TLS 1.2+,使用特定的密码套件),而无需修改后端应用。

支持基于内容的路由:

一些高级负载均衡器(如 AWS ALB)需要能看到 HTTP 请求的明文内容(如 Host 头、URL 路径)才能做出更智能的路由决策。如果全程加密,它们就无法做到这一点。

详解如下:

详细过程分解:从 HTTPS 入口到 HTTP 内部
让我们详细跟踪一个请求 https://my-app.com 的旅程,特别是 外部负载均衡器 → Ingress Controller Pod 这一段。

步骤 1: 客户端发起 HTTPS 请求
客户端(浏览器)向 https://my-app.com 发起请求,完成 DNS 解析,找到外部负载均衡器的 IP 地址。

客户端与负载均衡器开始 TLS 握手。负载均衡器出示其配置的 SSL 证书。客户端验证证书(有效性、是否由可信CA签发、域名是否匹配等)。

握手成功后,建立了一条安全的、加密的 HTTPS 连接。

步骤 2: 负载均衡器终止 TLS 并解密请求
负载均衡器使用自己的私钥解密接收到的加密请求数据包。

此时,负载均衡器得到了一个完整的、明文的 HTTP 请求(包括 HTTP 方法、URL、Headers、Body 等)。

步骤 3: 负载均衡器转发 HTTP 请求到 Ingress Controller
负载均衡器根据其配置的健康检查目标和路由规则,从健康的 Ingress Controller Pod 池中选择一个后端。

负载均衡器创建一个新的、内部的 TCP 连接到选中的那个 Ingress Controller Pod(例如,通过 NodePort 或直接到 Pod IP,如果使用云提供商的集成模式)。

负载均衡器通过这个新的、未加密的 TCP 连接,将步骤 2 中得到的明文 HTTP 请求原样发送出去。

重要:负载均衡器通常会在转发时添加或修改一些 HTTP 头,以传递原始客户端的信息,最常见的是:

X-Forwarded-For: 记录原始客户端的真实 IP 地址。

X-Forwarded-Proto: 告知后端原始请求使用的协议(这里是 https)。

X-Forwarded-Port: 告知后端原始请求的端口。

步骤 4: Ingress Controller 接收并处理 HTTP 请求
Ingress Controller Pod(如 Nginx)接收到这个明文的 HTTP 请求。

它查看 Host 头和 Path,并根据集群中定义的 Ingress 资源规则,决定将这个请求路由到哪个后端 Service 和 Pod。

它将请求转发给目标 Service(通过 ClusterIP,再由 kube-proxy 的 iptables/IPVS 规则导向最终 Pod)。

步骤 5: 生成响应并沿原路返回
应用 Pod 处理请求,生成一个 HTTP 响应。

该 HTTP 响应先返回给 Ingress Controller。

Ingress Controller 将其作为 HTTP 响应 返回给外部负载均衡器。

负载均衡器接收到这个明文的 HTTP 响应。

负载均衡器重新加密这个 HTTP 响应。它使用在步骤 1 中与客户端建立的 TLS 会话密钥,将响应数据加密。

负载均衡器将加密后的 HTTPS 响应数据包发送回给原始客户端。

安全性考虑:内部通信安全吗?
你可能会问:“集群内部的 HTTP 通信安全吗?”

在可信的网络边界内(例如,云服务商的同一个 VPC 内、数据中心的内网中),这种架构被认为是安全的。攻击者很难进入到这个内部网络来窃听明文流量。

如果需要对内部流量进行加密(多租户集群、严格的安全合规要求),可以采用服务网格(Service Mesh)(如 Istio, Linkerd),它们会在 Pod 之间自动进行 mTLS 加密。这样,从 Ingress Controller 到后端服务的链路也是加密的。

另一种方案是使用 SSL Passthrough,即负载均衡器不终止 TLS,而是将加密的流量直接透传给 Ingress Controller。但这会失去上述所有优点(性能开销、高级路由等),并将证书管理的负担转移回集群内部,因此不常用。

网站公告

今日签到

点亮在社区的每一天
去签到