【问题标题】:Kubernetes not preserve source ipKubernetes 不保留源 IP
【发布时间】:2016-05-02 17:41:26
【问题描述】:

我已经安装了 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。我做错了什么?

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

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

    very long Github issue 中围绕该问题进行了大量讨论,但除了在 Kubernetes 集群之外运行前端负载均衡器(例如使用云负载均衡器,它附加 X- FORWARDED-FOR 标头)。

    【讨论】:

    【解决方案2】:

    这是在 Kubernetes 1.5 中作为注释添加的(文档here)。

    在 1.7 中,它已升级为 GA,因此您可以使用 spec.externalTrafficPolicy 字段(文档 here)在 Service 上指定负载均衡策略:

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

    【讨论】:

    • 我使用的是 1.7.3,但如果 externalTrafficPolicy 设置为 Local,则会遇到超时问题。请你看看我的问题here
    • @TanJinfu 当 externalTrafficPolicy 设置为 Local 时,请求仅在同一工作节点中可用时才会转发到 Pod。因此,您必须确保 pod 使用节点关联性在每个工作节点中运行,以避免超时错误。
    猜你喜欢
    • 1970-01-01
    • 2020-12-29
    • 2017-10-02
    • 2018-03-23
    • 1970-01-01
    • 2022-12-20
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多