Kubernetes Ingress配置NLB SSL终止时遇无限重定向循环问题
无限重定向循环的原因及解决方法
原因分析
- Ingress TLS配置与NLB SSL终止逻辑冲突:你在Ingress资源中配置了
tls块,这会让Ingress Controller认为需要自己处理SSL加密/解密流程,但你指定的tls-secret并没有有效证书(AWS托管证书无法导出私钥,无法创建Kubernetes要求的TLS Secret)。Ingress Controller在检测不到有效证书时,会触发默认的强制重定向——把所有HTTP请求转向HTTPS。但你的NLB已经在负载均衡层完成了SSL终止,将HTTPS请求转换成HTTP后转发给Ingress Controller,这就形成了死循环:NLB发HTTP请求给Controller → Controller重定向到HTTPS → 用户浏览器发起HTTPS请求 → NLB再转成HTTP发给Controller,反复循环。 - Ingress Controller无法识别原始请求协议:NLB终止SSL后转发的是HTTP流量,Ingress Controller默认会判定这是普通HTTP请求,再加上Ingress里的
tls配置,它会认为客户端应该使用HTTPS访问,因此不断触发重定向操作。
解决方法
方法1:直接移除Ingress中的TLS配置块
既然SSL终止已经在NLB层完成,Ingress Controller只需要处理HTTP流量,完全不需要在Ingress资源里配置tls块。你之前移除该块后重定向停止,就是因为Ingress Controller不再强制要求HTTPS,直接处理NLB转发的HTTP请求即可。
方法2:配置Ingress Controller识别原始HTTPS请求(可选,适用于后端需要感知协议的场景)
如果你的后端服务需要知道用户发起的是HTTPS请求(比如生成正确的HTTPS链接),可以做以下配置:
- 给Ingress Controller的Service添加代理协议注解:
在Service的metadata.annotations中添加:
该注解会让NLB发送代理协议头,Ingress Controller可通过这个头识别原始请求的协议为HTTPS。service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: "*" - 启用Ingress Controller的代理协议支持:
针对ingress-nginx控制器,在其对应的ConfigMap中添加:
确保控制器能正确解析代理协议头。use-proxy-protocol: "true" - 开启X-Forwarded-Headers信任:
同样在ConfigMap中设置:
这样控制器会使用NLB传递的use-forwarded-headers: "true"X-Forwarded-Proto: https头判断原始请求协议,不会再触发HTTP到HTTPS的重定向。
内容的提问来源于stack exchange,提问作者user630702
相关产品推荐
相关产品推荐

