首页 文章

Kubernetes不保留源IP

提问于
浏览
1

我已经使用以下配置安装了kubernetes 1.2.0

export nodes="user@10.0.0.30 user@10.0.0.32"
export role="ai i"
export NUM_NODES=2
export SERVICE_CLUSTER_IP_RANGE=192.168.3.0/24
export FLANNEL_NET=172.16.0.0/16
export KUBE_PROXY_EXTRA_OPTS="--proxy-mode=iptables"

我已经创建了一个nginx pod,并使用负载均衡器和外部IP地址进行公开

kubectl expose pod my-nginx-3800858182-6qhap --external-ip=10.0.0.50 --port=80 --target-port=80

我在裸机上使用kubernetes所以我已经将10.0.0.50 ip分配给主节点 .

如果我尝试curl 10.0.0.50(来自kubernetes外)并在nginx pod上使用tcpdump我看到流量,源ip始终来自kubernetes主节点

17:30:55.470230 IP 172.16.60.1.43030 > 172.16.60.2.80: ...
17:30:55.470343 IP 172.16.60.2.80 > 172.16.60.1.43030: ...

我正在使用mode-proxy = iptables . 并需要获得实际的源IP . 我究竟做错了什么 ?

2 回答

  • 0

    这是作为Kubernetes 1.5(docs here)中的注释添加的 .

    在1.7中,它已经毕业到GA,因此您可以使用 spec.externalTrafficPolicy 字段(docs here)在服务上指定负载 balancer 策略:

    {
      "kind": "Service",
      "apiVersion": "v1",
      "metadata": {
        "name": "example-service",
      },
      "spec": {
        "ports": [{
          "port": 8765,
          "targetPort": 9376
        }],
        "selector": {
          "app": "example"
        },
        "type": "LoadBalancer",
        "externalTrafficPolicy": "Local"
      }
    }
    
  • 1

    不幸的是,你没有做错任何事 . 它是如何从接收它们到目标容器的机器代理数据包的工件 .

    very long Github issue中围绕该问题进行了大量讨论,但除了在Kubernetes集群之外运行前端负载均衡器之外,还没有找到解决方案(例如使用附加X-FORWARDED-FOR标头的 Cloud 负载均衡器) .

相关问题