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

在常见的生产架构中:

外部负载均衡器(Ng/ELB/ALB/NLB等)终止来自客户端的 HTTPS 连接。

它将解密后的明文 HTTP 请求转发给后端的 Kubernetes Ingress Controller Pods。

Ingress Controller 处理 HTTP 请求,并将 HTTP 响应返回给负载均衡器。

负载均衡器重新加密这个 HTTP 响应为 HTTPS,并最终返回给原始客户端。

总结:对于客户端来说,他始终认为自己在进行端到端的 HTTPS 通信,完全不知道后端发生了 TLS 终止和再加密的过程。

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

bash 复制代码
这种做法被称为 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 路径)才能做出更智能的路由决策。如果全程加密,它们就无法做到这一点。

详解如下:

bash 复制代码
详细过程分解:从 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。但这会失去上述所有优点(性能开销、高级路由等),并将证书管理的负担转移回集群内部,因此不常用。
相关推荐
2301_7809438422 分钟前
linux 对文件打补丁(Patch)
linux·运维·服务器
ICT董老师28 分钟前
通过kubernetes部署nginx + php网站环境
运维·nginx·云原生·容器·kubernetes·php
敬往事一杯酒哈33 分钟前
Ubuntu 20.04 安装Anacada
linux·运维·ubuntu
还在忙碌的吴小二34 分钟前
Jenkins CLI (jcli) 使用手册
运维·jenkins
ChangYan.36 分钟前
Windows命令行(cmd)下快速查找文件路径(类似Linux下find命令)
linux·运维·服务器
陈让然1 小时前
VS Code新版本无法连接WSL ubuntu18.04
linux·运维·ubuntu
lpfasd1231 小时前
宝塔面板使用流程及注意事项
运维
小杰帅气1 小时前
神秘的环境变量和进程地址空间
linux·运维·服务器
胖咕噜的稞达鸭1 小时前
进程间的通信(1)(理解管道特性,匿名命名管道,进程池,systeam V共享内存是什么及优势)重点理解代码!
linux·运维·服务器·数据库