GKE集群中Kong Ingress Controller保留客户端IP异常排查求助
核心问题定位
你现在的配置里踩了个关键坑:ingress.yaml用了kubernetes.io/ingress.class: gce,这等于让流量先过GCE自带的负载均衡器,再转发到Kong的kong-proxy Service。这种双层LB架构下,哪怕给Kong的Service加了externalTrafficPolicy: Local,真实客户端IP也会被GCE LB覆盖掉——因为GCE Ingress转发时会替换请求头,不会把原始IP传给后端的Kong。
另外你直接连Kong Pod也看不到真实IP,说明Kong本身的配置也没开启IP识别功能。
分步解决方案
1. 删掉多余的GCE Ingress,让Kong直接当入口
既然用Kong Ingress Controller,就没必要再套一层GCE Ingress。直接删掉现有kong-ingress,把kong-proxy Service改成直接对外的LoadBalancer:
修改service.yaml,加上必要的GCP配置注解(按需选):
apiVersion: v1 kind: Service metadata: name: kong-proxy namespace: kong annotations: # 绑定你的静态公网IP,替换成实际名称 cloud.google.com/load-balancer-ip: "kong-static-ip" # 如果需要内部LB,解开下面这行注释 # cloud.google.com/load-balancer-type: "Internal" spec: ports: - name: proxy port: 80 protocol: TCP targetPort: 8000 - name: proxy-ssl port: 443 protocol: TCP targetPort: 8443 selector: app: ingress-kong type: LoadBalancer externalTrafficPolicy: Local
应用配置并删除多余Ingress:
kubectl apply -f service.yaml -n kong kubectl delete ingress kong-ingress -n kong
2. 配置Kong识别并传递真实IP
修改deployment.yaml里proxy容器的环境变量,开启Kong的真实IP检测:
- name: KONG_TRUSTED_IPS # 信任GCP LB和集群内部IP段,确保Kong能解析X-Forwarded-For头 value: "0.0.0.0/0, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16" - name: KONG_REAL_IP_HEADER value: "X-Forwarded-For" - name: KONG_REAL_IP_RECURSIVE value: "on"
这些配置会让Kong从GCP LB传递的X-Forwarded-For头里提取真实客户端IP,再把它传给后端服务。
应用修改:
kubectl apply -f deployment.yaml -n kong
3. 验证效果
- 等Kong Pod重启完成,确认Service的外部IP已分配:
kubectl get service kong-proxy -n kong
- 用curl访问Kong的外部IP,查看响应头或者直接看Kong的日志:
curl -v https://<kong-external-ip> # 查看Kong代理容器的访问日志 kubectl logs -n kong -l app=ingress-kong -c proxy
日志里应该能看到你的真实客户端IP,而不是GCE LB的IP。
额外说明
如果确实需要保留GCE Ingress(比如和其他GCP服务集成),得给GCE Ingress配置FrontendConfig资源来开启X-Forwarded-For传递,但这种方式复杂度更高,不如直接用Kong做入口简洁。
内容的提问来源于stack exchange,提问作者Pedro Guilherme

