k8s:使用iptables从公共VIP转发到clusterIP

问题描述 投票:1回答:1

我试图深入了解从公开的负载平衡器的第2层VIP到服务的群集IP的转发方式。我已经阅读了高级概述MetalLB does it,并且尝试通过设置keepalived / ucarp VIP和iptables规则来手动复制它。我必须丢失一些东西,但是因为它不起作用;-]

我采取的步骤:

  1. 在单个计算机上的libvirt / KVM VM上创建了一个由kubeadm组成的群集,该群集由一个主节点+ 3个运行k8s-1.17.2 + calico-3.12的节点组成。所有VM都位于192.168.122.0/24虚拟网络中。

  2. 创建了一个简单的2单元部署,并将其作为NodePort服务公开,并且externalTrafficPolicy设置为cluster$ kubectl get svc dump-request NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE dump-request NodePort 10.100.234.120 <none> 80:32292/TCP 65s我已经验证可以从主机上的每个节点IP的32292端口访问它。

  3. 在所有3个节点上都创建了一个ucarp的VIP:ucarp -i ens3 -s 192.168.122.21 -k 21 -a 192.168.122.71 -v 71 -x 71 -p dump -z -n -u /usr/local/sbin/vip-up.sh -d /usr/local/sbin/vip-down.sh(来自knode1的示例)我已经确认可以ping192.168.122.71VIP。我什至可以将其切换到当前持有VIP的VM。现在,如果kube-proxy处于iptables模式,我还可以通过http://192.168.122.71:32292处的VIP在其节点端口上访问该服务。但是,令我惊讶的是,在ipvs模式下,这总是导致连接超时。

  4. 在每个节点上添加了一个iptables规则,用于将传入192.168.122.71的数据包转发到服务的群集IP 10.100.234.120iptables -t nat -A PREROUTING -d 192.168.122.71 -j DNAT --to-destination 10.100.234.120(后来,我也尝试将规则范围缩小到相关端口,但是它并没有以任何方式改变结果:iptables -t nat -A PREROUTING -d 192.168.122.71 -p tcp --dport 80 -j DNAT --to-destination 10.100.234.120:80

结果:

iptables模式下,对http://192.168.122.71:80/的所有请求导致连接超时。

ipvs模式下,它部分起作用:如果192.168.122.71 VIP由其上有Pod的节点持有,则大约有50%的请求成功,并且本地Pod始终为它们提供服务。该应用程序还获得了主机的真实远程IP(192.168.122.1)。其他50%(大概是发送到另一个节点上的Pod)正在超时。如果VIP由一个没有Pod的节点持有,则所有请求都将超时。我还检查了规则是否会始终影响结果,始终将规则保留在所有节点上,而仅在拥有VIP的节点上保留规则,并在VIP发行时将其删除:结果相同在两种情况下。

有人知道为什么它不起作用以及如何解决?我将不胜感激:)

我试图深入了解从公开的负载平衡器的第2层VIP到服务的群集IP的转发方式。我已经阅读了MetalLB的概述,并且尝试了...

kubernetes iptables kube-proxy metallb
1个回答
0
投票
还需要添加MASQUERADE规则,以便相应地更改源。例如:iptables -t nat -A POSTROUTING -s 192.168.122.1 -j MASQUERADE
© www.soinside.com 2019 - 2024. All rights reserved.