繁体   English   中英

如何配置kube-proxy仅从本地节点服务

[英]How to configure kube-proxy to serve from local node only

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

参考文档 ,使用标志:

--bind-address 127.0.0.1

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

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

而不是重新启动kube-proxy的服务:

systemctl restart kube-proxy

在文档中找到了一个解决方案:

从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 }')

如果您在cloudprovider上运行,则可能需要为上面报告的node: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地址(SNAT)替换为其自己的IP地址node2将数据包上的目标IP替换为Pod IP数据包,然后路由到节点1到端点,pod的答复被路由回node2,pod的答复被发送回客户端

视觉:

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

为避免这种情况,Kubernetes具有保留客户端源IP的功能(请在此处查看功能可用性)。 将service.spec.externalTrafficPolicy设置为Local值将仅将请求代理到本地终结点,而不将流量转发到其他节点,从而保留原始源IP地址。 如果没有本地端点,则将丢弃发送到该节点的数据包,因此您可以在任何数据包处理规则中依赖正确的source-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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM