Azure Kubernetes下用ConfigMap给NGINX Ingress加请求头不生效如何解决
配置错误点
- 全局配置和自定义请求头配置错位:
use-forwarded-headers、use-proxy-protocol、real-ip-header属于NGINX Ingress控制器的全局配置参数,需要放在ingress-nginx-controllerConfigMap中,不能放在自定义请求头的custom-headersConfigMap里,自定义请求头ConfigMap仅支持定义proxy_set_header对应的请求头键值。 externalTrafficPolicy配置位置错误:该参数是LoadBalancer类型Service的spec字段属性,用于控制节点流量转发策略,放在ConfigMap的data段完全不生效。proxy-set-headers取值不完整:该参数需要指定为[命名空间]/[ConfigMap名称]的完整格式,仅写ConfigMap名称可能导致控制器找不到对应配置。
修正方案
1. 拆分正确的ConfigMap配置
先修正自定义请求头ConfigMapcustom-headers,仅保留请求头相关配置:
apiVersion: v1 data: X-Real-IP: $remote_addr X-Forwarded-For: $proxy_add_x_forwarded_for X-Forwarded-Proto: $proxy_x_forwarded_proto kind: ConfigMap metadata: name: custom-headers namespace: default
再修正控制器全局ConfigMapingress-nginx-controller,移入全局配置、补全自定义头引用路径、删除无效的externalTrafficPolicy配置:
apiVersion: v1 data: proxy-set-headers: "default/custom-headers" use-forwarded-headers: "true" use-proxy-protocol: "true" real-ip-header: "proxy_protocol" kind: ConfigMap metadata: name: ingress-nginx-controller namespace: default labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx
2. 修正Service配置
修改ingress-nginx-controller Service,添加externalTrafficPolicy配置,同时如果开启了代理协议,需要给Azure负载均衡添加开启代理协议的注解:
执行kubectl edit svc ingress-nginx-controller -n default,修改对应字段:
apiVersion: v1 kind: Service metadata: annotations: # 开启Azure LB代理协议,和控制器use-proxy-protocol配置匹配 service.beta.kubernetes.io/azure-load-balancer-enable-proxy-protocol: "true" spec: type: LoadBalancer externalTrafficPolicy: Local # 保留源客户端IP # 其余原有配置保持不变
提示:如果不需要使用代理协议,可将控制器ConfigMap中的
use-proxy-protocol设为"false",real-ip-header设为"X-Forwarded-For",同时删除Service上的Azure代理协议注解,同样可以实现客户端IP透传。
3. 重载控制器配置
执行以下命令重启控制器Pod,强制加载更新后的配置:kubectl rollout restart deployment ingress-nginx-controller -n default
排查步骤
- 检查控制器运行日志:执行
kubectl logs -n default -l app.kubernetes.io/name=ingress-nginx,确认没有配置加载错误、存在Configuration reloaded的成功日志。 - 验证nginx.conf配置:执行
kubectl exec -n default <替换为控制器Pod名称> -- cat /etc/nginx/nginx.conf | grep X-Forwarded-For,确认输出为proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;即为配置生效。 - 功能验证:在后端服务中打印
X-Real-IP、X-Forwarded-For请求头,直接访问服务确认返回的是真实客户端IP,而非Azure负载均衡的内网IP。
内容的提问来源于stack exchange,提问作者Ben Gannaway
相关产品推荐
相关产品推荐

