【问题标题】:How to configure kube-proxy to serve from local node only如何将 kube-proxy 配置为仅从本地节点提供服务
【发布时间】:2018-11-06 00:20:55
【问题描述】:

我只需要从当前节点上运行的 Pod 配置 kube-proxy 到服务器,并避免连接在不同节点之间反弹。

【问题讨论】:

    标签: kubernetes kube-proxy


    【解决方案1】:

    在文档中找到解决方案:

    从 Kubernetes 1.5 开始,发送到 Type=NodePort 的服务的数据包默认经过源 NAT。您可以通过创建 NodePort 服务来测试:

    $ kubectl expose deployment source-ip-app --name=nodeport --port=80 --target-port=8080 --type=NodePort
    service/nodeport exposed
    
    $ NODEPORT=$(kubectl get -o jsonpath="{.spec.ports[0].nodePort}" services nodeport)
    $ NODES=$(kubectl get nodes -o jsonpath='{ $.items[*].status.addresses[?(@.type=="ExternalIP")].address }')
    

    如果您在云提供商上运行,您可能需要为上面报告的节点打开防火墙规则:nodeport。现在您可以尝试通过上面分配的节点端口从集群外部访问服务。

    $ for node in $NODES; do curl -s $node:$NODEPORT | grep -i client_address; done
    client_address=10.180.1.1
    client_address=10.240.0.5
    client_address=10.240.0.3
    

    请注意,这些不是正确的客户端 IP,它们是集群内部 IP。这就是发生的事情: 客户端发送数据包到 node2:nodePort node2用自己的IP地址替换数据包中的源IP地址(SNAT) node2 将数据包上的目标 IP 替换为 pod IP 数据包被路由到节点 1,然后到端点 pod 的回复被路由回 node2 pod 的回复被发送回客户端

    视觉上:

              client
                 \ ^
                  \ \
                   v \
       node 1 <--- node 2
        | ^   SNAT
        | |   --->
        v |
     endpoint
    

    为避免这种情况,Kubernetes 具有保留客户端源 IP 的功能(请在此处查看功能可用性)。将 service.spec.externalTrafficPolicy 设置为值 Local 只会将请求代理到本地端点,从不将流量转发到其他节点,从而保留原始源 IP 地址。如果没有本地端点,则发送到节点的数据包将被丢弃,因此您可以在任何数据包处理规则中依赖正确的源 IP,您可能会应用可以通过该端点的数据包。 如下设置 service.spec.externalTrafficPolicy 字段:

    $ kubectl patch svc nodeport -p '{"spec":{"externalTrafficPolicy":"Local"}}'
    service/nodeport patched
    

    现在,重新运行测试:

    $ for node in $NODES; do curl --connect-timeout 1 -s $node:$NODEPORT | grep -i client_address; done
    client_address=104.132.1.79
    

    请注意,您只能从运行端点 pod 的一个节点收到一条回复,其中包含正确的客户端 IP。 这就是发生的事情: 客户端将数据包发送到没有任何端点的 node2:nodePort 数据包被丢弃 客户端将数据包发送到 node1:nodePort,它确实有端点 node1 使用正确的源 IP 将数据包路由到端点

    视觉上:

            client
           ^ /   \
          / /     \
         / v       X
       node 1     node 2
        ^ |
        | |
        | v
     endpoint
    

    【讨论】:

      【解决方案2】:

      参考documentation,使用标志:

      --bind-address 127.0.0.1
      

      对于这个标志,你需要添加 kube-proxy 的运行脚本。 对于systemd,它存储在这里:

      /etc/systemd/system/kube-proxy.service
      

      然后重启kube-proxy的服务:

      systemctl restart kube-proxy
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-24
        • 2021-04-24
        • 2015-07-25
        • 1970-01-01
        • 2019-09-19
        • 1970-01-01
        • 1970-01-01
        • 2018-11-09
        相关资源
        最近更新 更多