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

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站部署,

我试图深入了解从公开的负载平衡器的第2层VIP到服务的群集IP的转发是如何工作的。我已经阅读了一篇高级概述,并尝试通过设置keepalived/ucarp VIP和iptables规则手动复制它。但是,我肯定错过了什么,因为它不起作用;-]

我采取的步骤:

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

  • 创建了一个简单的2站部署,并将其作为
    节点端口
    服务公开,其中
    外部流量策略
    设置为
    集群

    $kubectl获取svc转储请求
    名称类型CLUSTER-IP外部IP端口年龄
    转储请求节点端口10.100.234.120 80:32292/TCP 65s

    我已经验证了我可以在32292端口的每个节点的IP上从主机访问它

  • 在所有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的示例)
    我已验证我可以ping
    192.168.122.71
    VIP。我甚至可以通过ssh连接到当前持有VIP的VM。
    现在,如果kube proxy处于
    iptables
    模式,我也可以通过
    VIP到达其节点端口上的服务http://192.168.122.71:32292
    。然而,令我惊讶的是,在
    ipvs
    模式下,这总是导致连接超时

  • 在每个节点上添加了一个iptables规则,用于将传入到
    192.168.122.71
    的数据包转发到服务的群集IP
    10.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测试