Ingress规则与LoadBalancer类型Service配合异常:无限重定向问题排查
你遇到的这个问题其实很常见,核心矛盾出在请求协议传递和应用重定向逻辑的不匹配上,我来帮你拆解分析并给出解决方案:
问题根源分析
当你访问https://demo.azure.com/demo时,Nginx Ingress会把HTTPS请求终止后,通过HTTP协议转发到后端demo-backend的ClusterIP(LoadBalancer类型的Service本质上也有内部ClusterIP)。如果你的demo-backend应用配置了强制HTTPS重定向(比如把所有HTTP请求跳转至HTTPS),它会返回重定向响应要求浏览器访问https://demo.azure.com/demo,浏览器再次发起HTTPS请求到Ingress,Ingress又转成HTTP发给后端,如此循环就形成了无限重定向。
而aks-helloworld是ClusterIP类型,要么它没配置强制HTTPS重定向,要么它的逻辑能正确识别Ingress传递的头信息,所以没有触发循环。另外还有一种可能:demo-backend的应用把自己的外部地址设成了LoadBalancer的23.99.128.86,重定向时会跳转到这个IP,导致浏览器反复在域名和IP之间跳转。
解决方案
方案1:调整Ingress配置,传递正确的协议头
让Nginx Ingress向后端传递原始请求的协议(HTTPS),这样应用就不会再触发HTTP转HTTPS的重定向。修改你的Ingress配置,添加对应的注解:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: demo-ingress annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: / # 开启SSL自动重定向(可选,将HTTP请求转HTTPS) nginx.ingress.kubernetes.io/ssl-redirect: "true" # 向后端传递原始请求的协议类型 nginx.ingress.kubernetes.io/configuration-snippet: | proxy_set_header X-Forwarded-Proto $scheme; # 也可以用更简洁的注解(需Ingress Controller支持) nginx.ingress.kubernetes.io/use-forwarded-headers: "true" spec: tls: - hosts: - demo.azure.com secretName: aks-ingress-tls rules: - host: demo.azure.com http: paths: - path: / backend: serviceName: aks-helloworld servicePort: 80 - path: /demo backend: serviceName: demo-backend servicePort: 80
更新配置后等待Ingress Controller重载规则,再测试https://demo.azure.com/demo即可。
方案2:将demo-backend改为ClusterIP类型(推荐)
如果demo-backend不需要直接通过LoadBalancer对外暴露(已经通过Ingress作为统一入口),完全可以把它改成ClusterIP类型,既节省外部IP资源,也从根源上避免重定向问题:
- 修改Service类型:
kubectl patch service demo-backend -p '{"spec":{"type":"ClusterIP"}}'
- 验证修改结果:
kubectl get services demo-backend
看到EXTERNAL-IP变为<none>后,再访问https://demo.azure.com/demo就能正常工作了。
方案3:调整demo-backend应用的重定向逻辑
如果必须保留LoadBalancer类型的Service,你可以修改应用配置:
- 关闭强制HTTPS重定向,或者添加例外规则,允许来自Ingress的HTTP请求(因为Ingress已经处理了HTTPS终止)
- 配置应用使用Ingress域名
demo.azure.com作为外部访问地址,而非LoadBalancer的IP,确保重定向目标正确。
验证方法
修改配置后,用curl命令调试重定向流程,确认循环是否终止:
curl -v https://demo.azure.com/demo
查看响应中的Location头,确认重定向目标是否符合预期。
内容的提问来源于stack exchange,提问作者Neil

