Kubernetes k8s:使用iptables从公共VIP转发到clusterIP
我试图深入了解从公开的负载平衡器的第2层VIP到服务的群集IP的转发是如何工作的。我已经阅读了一篇高级概述,并尝试通过设置keepalived/ucarp VIP和iptables规则手动复制它。但是,我肯定错过了什么,因为它不起作用;-] 我采取的步骤:Kubernetes k8s:使用iptables从公共VIP转发到clusterIP,kubernetes,iptables,kube-proxy,metallb,Kubernetes,Iptables,Kube Proxy,Metallb,我试图深入了解从公开的负载平衡器的第2层VIP到服务的群集IP的转发是如何工作的。我已经阅读了一篇高级概述,并尝试通过设置keepalived/ucarp VIP和iptables规则手动复制它。但是,我肯定错过了什么,因为它不起作用;-] 我采取的步骤: 使用kubeadm创建了一个群集,该群集由一台主机+3个节点组成,在一台计算机上的libvirt/KVM上运行k8s-1.17.2+calico-3.12。所有虚拟机都位于192.168.122.0/24虚拟网络中 创建了一个简单的2站部署,
kubeadm
创建了一个群集,该群集由一台主机+3个节点组成,在一台计算机上的libvirt/KVM上运行k8s-1.17.2+calico-3.12。所有虚拟机都位于192.168.122.0/24
虚拟网络中节点端口
服务公开,其中外部流量策略
设置为集群
:$kubectl获取svc转储请求
名称类型CLUSTER-IP外部IP端口年龄
转储请求节点端口10.100.234.120 80:32292/TCP 65s
我已经验证了我可以在32292端口的每个节点的IP上从主机访问它
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的示例)我已验证我可以ping
192.168.122.71
VIP。我甚至可以通过ssh连接到当前持有VIP的VM。现在,如果kube proxy处于
iptables
模式,我也可以通过VIP到达其节点端口上的服务http://192.168.122.71:32292
。然而,令我惊讶的是,在ipvs
模式下,这总是导致连接超时192.168.122.71
的数据包转发到服务的群集IP10.100.234.120
:iptables-tnat-A预路由-d192.168.122.71-jdnat-到目的地10.100.234.120
(稍后,我还尝试将规则仅限于相关端口,但它没有以任何方式改变结果:
iptables-tnat-A预路由-d192.168.122.71-ptcp-dport 80-jdnat-到目的地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%(可能被送到花药节上的豆荚)正在超时。如果VIP由没有POD的节点持有,则所有请求都超时 我还检查了始终在所有节点上保留规则与仅在持有VIP的节点上保留规则并在VIP发布时删除规则是否会影响结果:两种情况下的结果相同
有人知道它为什么不工作以及如何修复它吗?我将非常感谢您的帮助:)还需要添加
伪装规则,以便相应地更改源代码。例如:
iptables-tnat-A后路由-j伪装
使用IPV测试