AWS Load Balancer Controller 实现 NLB TLS 终止完全指南
为什么需要 TLS 终止
在现代云原生架构中,TLS 加密通信已成为安全标配。然而直接在 Kubernetes 集群内部处理 TLS 加解密会带来几个显著问题:
- 证书管理复杂:每个服务都需要单独配置证书,增加了运维复杂度
- 安全风险:私钥需要在集群内存储,增加了泄露风险
- 性能开销:服务实例需要承担加密解密计算负担
AWS 网络负载均衡器(NLB)的 TLS 终止功能完美解决了这些问题。它允许在负载均衡器层面对 HTTPS 流量进行解密,然后将明文 HTTP 请求转发到后端服务。
NLB TLS 终止架构解析
整个流程可分为三个阶段:
- 客户端到 NLB:客户端通过 HTTPS(443端口)访问服务,使用公网证书加密通信
- NLB 解密:NLB 使用 ACM 管理的证书解密请求
- NLB 到集群:解密后的 HTTP(80端口)请求被转发到集群内部,同时保留原始客户端 IP
这种架构的优势在于:
- 证书由 AWS ACM 集中管理,无需在集群内存储私钥
- 后端服务只需处理 HTTP 流量,简化了应用配置
- 利用了 NLB 的高性能和低成本优势
实施前的准备工作
在开始配置前,请确保满足以下条件:
- 域名管理权限:需要能够为服务创建子域名(如 service.example.com)并设置 DNS 记录
- AWS Load Balancer Controller 已安装:控制器需要正确配置 IAM 权限以管理 AWS 资源
- ACM 证书:为你的域名准备好有效的 TLS 证书
详细配置步骤
第一步:获取 ACM 证书
- 登录 AWS ACM 控制台
- 为你的域名申请新证书(支持通配符证书如 *.example.com)
- 完成域名验证(如果使用 Route53 会自动完成)
- 记录证书 ARN,后续配置会用到
第二步:配置 Kubernetes 服务
创建或修改 Service 资源,添加以下关键注解:
apiVersion: v1
kind: Service
metadata:
name: my-tls-service
annotations:
# 指定使用 NLB
service.beta.kubernetes.io/aws-load-balancer-type: external
# 使用 IP 模式直接路由到 Pod
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
# 创建面向互联网的负载均衡器
service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
# 指定 ACM 证书 ARN
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn:aws:acm:..."
# 指定 TLS 监听端口
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443"
spec:
externalTrafficPolicy: Local # 保留客户端 IP
ports:
- port: 443 # NLB 监听端口
targetPort: 80 # 转发到 Pod 的端口
protocol: TCP
selector:
app: my-app
type: LoadBalancer
关键配置说明:
externalTrafficPolicy: Local
确保保留客户端真实 IP- 端口映射将外部 443(HTTPS)映射到内部 80(HTTP)
- 选择器必须匹配你的应用 Pod 标签
第三步:配置 DNS 记录
-
获取 NLB 的 DNS 名称:
kubectl get svc my-tls-service
输出中的 EXTERNAL-IP 字段即为 NLB 域名
-
在你的 DNS 提供商处创建记录:
- 记录类型:A 记录(如果使用 Route53 可启用 Alias 功能)
- 名称:你的服务域名(如 service.example.com)
- 值:NLB 的 DNS 名称
验证配置
完成配置后,建议进行以下验证:
-
证书验证:
openssl s_client -connect service.example.com:443 -servername service.example.com
确认返回的证书信息正确
-
服务可达性:
curl -I https://service.example.com
应返回 HTTP 200 响应
-
客户端 IP 检查: 在应用日志中检查是否能看到真实客户端 IP
高级配置选项
自定义监听端口
虽然 443 是 HTTPS 标准端口,但你可以配置其他端口:
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "8443"
多证书支持
如果需要支持多个域名,可以指定多个证书 ARN:
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn1,arn2"
安全策略调整
可以自定义 TLS 协议版本和加密套件:
service.beta.kubernetes.io/aws-load-balancer-ssl-negotiation-policy: "ELBSecurityPolicy-TLS13-1-2-2021-06"
常见问题排查
- 证书不匹配:确保证书 ARN 正确且与 DNS 名称匹配
- NLB 创建失败:检查控制器日志和 IAM 权限
- 连接超时:验证安全组是否允许 443 端口入站
- 502 错误:检查后端 Pod 是否健康且监听正确端口
通过以上步骤,你可以轻松地在 AWS 上实现安全、高效的 TLS 终止方案,既保证了通信安全,又简化了应用架构。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考