如何在 Kubernetes 上使用 GKE Ingress 控制器保留客户端 IP 地址?

How to preserve Client IP Address with GKE Ingress controller on Kubernetes?

我想在 GKE Ingress Controller 后面的 .NET 应用程序 运行 中捕获客户端 IP 地址,以确保允许客户端。

var requestIpAddress = request.HttpContext.Connection.RemoteIpAddress.MapToIPv4();

由于 Ingress 应用了一些转发规则,我得到了我的 GKE Ingress IP 地址,而不是获取客户端 IP 地址。

GKE Ingress 控制器指向 NodePort 类型的 Kubernetes 服务。

我尝试将规范添加到 NodePort 服务以保留客户端 IP 地址,但没有帮助。这是因为 NodePort 服务也在 Ingress

后面运行
externalTrafficPolicy: Local

是否可以在 Kubernetes 上使用 GKE Ingress 控制器保留客户端 IP 地址?

入口节点端口服务:

apiVersion: v1
kind: Service
metadata:
  name: api-ingress-service
  labels:
    app/name: ingress.api
spec:
  type: NodePort
  externalTrafficPolicy: Local
  selector:
    app/template: api
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: http

入口:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress
  namespace: default
  labels:
    kind: ingress
    app: ingress
  annotations:
    networking.gke.io/v1beta1.FrontendConfig: frontend-config
spec:
  tls:
  - hosts:
    - '*.mydomain.com'
    secretName: tls-secret
  rules:
  - host: mydomain.com
    http:
      paths:
      - path: /*
        pathType: ImplementationSpecific
        backend:
          service:
            name: api-ingress-service
            port:
              number: 80

已发布社区 wiki 以提高知名度。随意扩展它。


目前在 GKE Ingress 中获取客户端源 IP 地址的唯一方法是 use X-Forwarded-For header. It's known limitation 所有 GCP HTTP(s) 负载均衡器(GKE Ingress 使用外部 HTTP(s) LB)。

如果它不适合您的需求,请考虑迁移到使用外部 TCP/UDP 网络 LoadBalancer 的 third-party Ingress Controller,例如 NGINX Ingress Controller.