在AWS上使用Nginx Ingress Controller配置LB TLS终止遇阻
AWS Nginx Ingress LB终止TLS失效及访问不稳定问题解决
问题现象
按AWS Nginx Ingress官方文档配置负载均衡器(LB)终止TLS:绑定ACM证书、配置VPC CIDR,Ingress Controller服务状态正常,AWS控制台显示LB已绑定目标证书,但出现以下异常:
http://foobar.com访问时偶尔正常,刷新后无法打开https://foobar.com提示「无法解析主机」,完全未实现LB终止TLS后转发流量到后端服务的预期效果- 对Pod做
kubectl port-forward测试:当Pod的containerPort设为8080时,首次请求正常,后续请求全部失败;改为80后,多次请求均稳定正常
排查过程
- 确认Ingress Controller的Service资源状态正常,Endpoint关联无异常
- 核对AWS控制台中LB的证书绑定、监听规则配置,确认符合文档要求
- 验证ClusterIP Service及Ingress规则的YAML配置,无语法或端口映射错误
- 通过
port-forward直接访问Pod,定位到containerPort的配置差异是核心变量
根因分析
- 当containerPort配置为8080时,Nginx Ingress Controller的后端健康检查逻辑与非80端口的适配存在隐性问题:LB的健康检查会频繁标记后端Pod为「不健康」,导致流量分发不稳定,出现http访问时好时坏的情况
- https访问的「无法解析主机」并非真的DNS问题,而是LB终止TLS后,流量无法通过Ingress Controller正确转发到后端Pod——containerPort的非标准配置加剧了转发链路的异常,使得DNS解析后的流量无法正常到达服务
- 将containerPort改为80后,Ingress Controller的端口映射、健康检查逻辑与后端服务完全匹配,流量转发链路恢复稳定,LB的TLS终止配置也能正常生效
解决方案
- 修改Pod的Deployment配置,将containerPort调整为80:
containers: - name: httpd image: httpd ports: - containerPort: 80 # 替换原8080配置 - 同步更新ClusterIP Service的targetPort,确保指向Pod的80端口:
ports: - port: 80 targetPort: 80 - 重新部署资源:
kubectl apply -f deployment.yaml kubectl apply -f service.yaml - 验证效果:
- 多次刷新
http://foobar.com,访问稳定正常 https://foobar.com正常加载,确认LB已完成TLS终止并转发流量到后端服务
- 多次刷新
内容的提问来源于stack exchange,提问作者Vadim Kovrizhkin
相关产品推荐
相关产品推荐

