无需设置externalTrafficPolicy=Local,在AKS中通过NGINX Ingress保留客户端IP用于白名单
AKS中NGINX Ingress保留客户端真实IP并兼顾负载均衡的解决方案
核心逻辑
AKS的Azure Load Balancer会自动将客户端真实IP注入到X-Forwarded-For请求头中,无需设置externalTrafficPolicy=Local(该配置会导致负载不均),只需通过Helm配置NGINX Ingress的Service和ConfigMap,让NGINX正确识别并使用这个真实IP完成白名单校验。
具体配置步骤
1. Helm安装/升级NGINX Ingress
通过Helm参数配置Service和控制器,保持默认负载均衡能力的同时,让NGINX正确识别代理传递的真实IP:
helm upgrade --install nginx-ingress ingress-nginx/ingress-nginx \ --namespace ingress-nginx \ --set service.externalTrafficPolicy=Cluster \ --set service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz \ --set controller.config.use-forwarded-headers="true" \ --set controller.config.proxy-real-ip-cidr="<AKS集群LB的IP/网段>" \ --set controller.config.trust-forwarded-headers="true"
proxy-real-ip-cidr需替换为你的AKS集群对应Azure LB的IP或网段(可通过Azure门户查看LB的前端IP范围),确保NGINX信任该代理来源,从而提取X-Forwarded-For中的真实IP。
2. 配置Ingress白名单规则
在需要限制访问的Ingress路径上添加白名单注解,此时NGINX会自动基于真实IP校验:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: target-ingress annotations: nginx.ingress.kubernetes.io/whitelist-source-range: "192.168.1.0/24,10.0.0.0/8" spec: ingressClassName: nginx rules: - host: your-domain.com http: paths: - path: /restricted-path pathType: Prefix backend: service: name: target-service port: number: 80
3. 验证配置有效性
- 查看NGINX控制器Pod日志,确认请求的
X-Forwarded-For头部包含客户端真实IP:
kubectl logs -n ingress-nginx <nginx-controller-pod-name> | grep "X-Forwarded-For"
- 使用不同IP访问受限路径,验证白名单规则是否生效。
常见问题排查
- 若白名单不生效,检查
proxy-real-ip-cidr是否正确配置,确保NGINX信任Azure LB的代理身份。 - 确认
use-forwarded-headers和trust-forwarded-headers均设为true,否则NGINX会忽略X-Forwarded-For头部。 - 若使用内部LB,需将Service注解改为
service.beta.kubernetes.io/azure-load-balancer-internal: "true",同时调整proxy-real-ip-cidr为内部LB的IP范围。
内容的提问来源于stack exchange,提问作者Jonáš Kowalczyk
相关产品推荐
相关产品推荐

