容器集群ipvs模式
为什么使用ipvs
Kubernetes早期版本中kube-proxy使用节点的iptable维护集群内部服务访问连通性。iptables列表匹配时会通过链表中的匹配规则依次匹配。随着 Kubernetes集群节点及服务不断增长,iptables列表中的规则列表可能会上万条,内核繁忙,严重影响性能。ipvs使用ipset + lvs 大大提高了访问效率。
iptables VS ipset
clusterip 10.104.245.87 在使用传统iptable时的匹配规则:
clusterip 10.104.245.87 在使用ipset时的匹配规则:
从图中可以看到clusterip在多个iptable列表中依次匹配, ipset作为iptables的扩展,可以定义一些列地址的集合。而有了ipset,则只用添加一条规则即可,而且ipset查找使用hash结构效率很高。
lvs工作原理
LVS 是基于 netfilter 框架,工作在 INPUT 链上,在 INPUT 上注册 ip_vs_in HOOK 函数,会根据访问的 vip+port 判断请求是否 IPVS 服务,如果是则调用注册的 IPVS HOOK 函数,进行 IPVS 相关主流程,强行修改数据包的相关数据,并将数据包发往 POSTROUTING 链上大概原理如图所示:
小结:
ipvs通过ipset快速匹配clusterip的数据包,将其转发到到INPUT链路,INPUT链路通过ip_vs_in HOOK完成clusterip相关流量转发。
参考文档:
https://blog.csdn.net/martingpf/article/details/104008565