ipvs

发布时间 2023-07-16 10:25:36作者: 王景迁

iptables的缺点和ipvs的优点

当宿主机上有大量Pod时,大量iptables规则不断被刷新,占用大量CPU。
ipvs采用了hash数据结构,比iptables更加高效。
当创建了Service后,kube-proxy在每个宿主机上创建一个虚拟网卡(名字是kube-ipvs0),每个网卡上配置所有service的ip,每个IP地址上设置多个IPVS虚拟主机即Pod,使用轮询模式来作为负载均衡策略。
LVS由ipvs(工作在内核空间,实现负载均衡)和ipvsadm(工作在用户空间,编写规则)组成。
iptables是为防火墙而设计的,IPVS用于高性能负载均衡。

PREROUTING链确定目标IP是本机IP,将数据包发往INPUT链。
IPVS是工作在INPUT链上的,如果用户请求的是自定义集群服务,那么IPVS修改数据包里的目标IP地址和端口,把新的数据包发往POSTROUTING链。
POSTROUTING链把数据包发送给后端服务器。

IPVS用于负载均衡,不能实现包过滤和源地址转换等,使用iptables来实现。
通过ipset来减少iptables规则。
下面四种场景使用iptables
1. kube-proxy启动参数中带有--masquerade-all=true,即所有流量作源地址转换。
2. kube-proxy启动参数中指定CIDR。
3. 支持LoadBalancer类型的service。
4. 支持NodePort类型的service。

安装ipvs

yum install -y ipvsadm
默认没有集群服务
ipvsadm -ln

模拟创建service和pod

# 创建dummy类型的虚拟网卡,绑定service的ClusterIP
ip link add ipvs0 type dummy
ip addr add 10.247.0.1/24 dev ipvs0

本机ping通10.247.0.1,是否ping通与ipvs0的down或者up无关。

其他节点ping不通该IP,因为缺少路由。

ipvs0上既有同网段IP又有10.247.0.1

ipvs0网卡IP与虚拟机网卡IP同网段时,其他节点ping通同网段IP。

dummy类型网卡默认设置了NOARP,是否设置NOARP与网卡down和up无关。
NOARP在网卡up时生效,down时返回同属于内核协议栈的虚拟机网卡mac地址。

在其他节点上查看arp结果

docker run -itd nginx
docker run -itd nginx

# 创建集群服务
ipvsadm -A -t 10.247.0.1:2080 -s rr
# 在集群服务中添加后端服务,轮询负载均衡DNAT转发
ipvsadm -a -t 10.247.0.1:2080 -r 172.17.0.2:80 -m
ipvsadm -a -t 10.247.0.1:2080 -r 172.17.0.3:80 -m

ipvsadm -ln

抓包验证流量发送给容器

for ((i=0; i<10; i++)) do curl 10.247.0.1:2080 >/dev/null; sleep 2; done

tcpdump -i docker0 port 80 -nevvv

清空ipvs

# 不影响dummy类型网卡ipvs0
ipvsadm -C

参考资料

深入理解 Kubernetes 网络模型:自己实现 Kube-Proxy 的功能

基于IPVS的集群内负载均衡深入解读

ipvs之ipvs0网卡