如何使用 kubernetes 服务从 Google Network Load Balancer 获取客户端 IP

Ram*_*sXu 6 load-balancing google-cloud-platform kubernetes google-kubernetes-engine

我在 GKE 中创建了一个类型为:LoadBalancer 的 kubernetes 服务。

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: LoadBalancer
  ports:
  - name: http
    port: 80
    targetPort: http
  selector:
    app: nginx
Run Code Online (Sandbox Code Playgroud)

这是一个 nginx 服务并尝试获取原始客户端 IP。喜欢

        location / {
            echo $remote_addr;
            echo $http_x_forwarded_for;   
        }
Run Code Online (Sandbox Code Playgroud)

但结果会得到:

10.140.0.97

Run Code Online (Sandbox Code Playgroud)

$remote_addr 就像在 kubernetes IP 中一样。

$http_x_forwarded_for 是空的。

我不知道为什么这不像文件所说的那样。

我读到的

https://cloud.google.com/load-balancing/docs/network

网络负载平衡是一个直通负载平衡器,这意味着您的防火墙规则必须允许来自客户端源 IP 地址的流量。

https://cloud.google.com/kubernetes-engine/docs/concepts/network-overview#ext-lb

如果您的服务需要从集群外部和 VPC 网络外部访问,您可以通过在定义服务时将服务的类型字段设置为 LoadBalancer 将您的服务配置为负载均衡器。然后,GKE 在服务前预置网络负载均衡器。网络负载均衡器了解集群中的所有节点,并配置您的 VPC 网络的防火墙规则,以允许使用服务的外部 IP 地址从 VPC 网络外部连接到服务。您可以为服务分配一个静态外部 IP 地址。有关详细信息,请访问使用静态 IP 地址配置域名。

Ram*_*sXu 11

只需添加 externalTrafficPolicy: Local

spec:
  externalTrafficPolicy: Local
  type: LoadBalancer
Run Code Online (Sandbox Code Playgroud)

默认情况下,发送到 Type=LoadBalancer 的服务的数据包是源 NAT 的,因为处于就绪状态的所有可调度 Kubernetes 节点都符合负载平衡流量的条件。因此,如果数据包到达没有端点的节点,系统会将其代理到具有端点的节点,将数据包上的源 IP 替换为节点的 IP(如上一节所述)。

参考