AWS Load Balancer Controller 实现 NLB TLS 终止完全指南

AWS Load Balancer Controller 实现 NLB TLS 终止完全指南

aws-load-balancer-controller A Kubernetes controller for Elastic Load Balancers aws-load-balancer-controller 项目地址: https://gitcode.com/gh_mirrors/aw/aws-load-balancer-controller

为什么需要 TLS 终止

在现代云原生架构中,TLS 加密通信已成为安全标配。然而直接在 Kubernetes 集群内部处理 TLS 加解密会带来几个显著问题:

  1. 证书管理复杂:每个服务都需要单独配置证书,增加了运维复杂度
  2. 安全风险:私钥需要在集群内存储,增加了泄露风险
  3. 性能开销:服务实例需要承担加密解密计算负担

AWS 网络负载均衡器(NLB)的 TLS 终止功能完美解决了这些问题。它允许在负载均衡器层面对 HTTPS 流量进行解密,然后将明文 HTTP 请求转发到后端服务。

NLB TLS 终止架构解析

NLB TLS 终止架构图

整个流程可分为三个阶段:

  1. 客户端到 NLB:客户端通过 HTTPS(443端口)访问服务,使用公网证书加密通信
  2. NLB 解密:NLB 使用 ACM 管理的证书解密请求
  3. NLB 到集群:解密后的 HTTP(80端口)请求被转发到集群内部,同时保留原始客户端 IP

这种架构的优势在于:

  • 证书由 AWS ACM 集中管理,无需在集群内存储私钥
  • 后端服务只需处理 HTTP 流量,简化了应用配置
  • 利用了 NLB 的高性能和低成本优势

实施前的准备工作

在开始配置前,请确保满足以下条件:

  1. 域名管理权限:需要能够为服务创建子域名(如 service.example.com)并设置 DNS 记录
  2. AWS Load Balancer Controller 已安装:控制器需要正确配置 IAM 权限以管理 AWS 资源
  3. ACM 证书:为你的域名准备好有效的 TLS 证书

详细配置步骤

第一步:获取 ACM 证书

  1. 登录 AWS ACM 控制台
  2. 为你的域名申请新证书(支持通配符证书如 *.example.com)
  3. 完成域名验证(如果使用 Route53 会自动完成)
  4. 记录证书 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 记录

  1. 获取 NLB 的 DNS 名称:

    kubectl get svc my-tls-service
    

    输出中的 EXTERNAL-IP 字段即为 NLB 域名

  2. 在你的 DNS 提供商处创建记录:

    • 记录类型:A 记录(如果使用 Route53 可启用 Alias 功能)
    • 名称:你的服务域名(如 service.example.com)
    • 值:NLB 的 DNS 名称

验证配置

完成配置后,建议进行以下验证:

  1. 证书验证

    openssl s_client -connect service.example.com:443 -servername service.example.com
    

    确认返回的证书信息正确

  2. 服务可达性

    curl -I https://service.example.com
    

    应返回 HTTP 200 响应

  3. 客户端 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"

常见问题排查

  1. 证书不匹配:确保证书 ARN 正确且与 DNS 名称匹配
  2. NLB 创建失败:检查控制器日志和 IAM 权限
  3. 连接超时:验证安全组是否允许 443 端口入站
  4. 502 错误:检查后端 Pod 是否健康且监听正确端口

通过以上步骤,你可以轻松地在 AWS 上实现安全、高效的 TLS 终止方案,既保证了通信安全,又简化了应用架构。

aws-load-balancer-controller A Kubernetes controller for Elastic Load Balancers aws-load-balancer-controller 项目地址: https://gitcode.com/gh_mirrors/aw/aws-load-balancer-controller

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宗津易Philip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值