本章主要是因为我之前不太理解这几个与负载均衡相关的名词之间的关系和区别,查阅资料后做了解释。
一、lvs与ipvs
LVS:Linux Virtual Server
IPVS:IP Virtual Server
维基百科用很简单的一句话介绍了LVS是什么:LVS是Linux操作系统中的负载均衡软件
。
LVS到底本身就是一个软件?还是说LVS代表了一个项目?
经过对官网提供的文档的阅读以及对LVS历史的了解,可以给出结论:
LVS是一个项目,这个项目的目的是给Linux集群提供一个高性能、高可用的负载均衡服务器。
因此,LVS项目有许多产物,例如四层代理——IPVS,七层代理——KTCPVS,此外,集群高可用常用的工具——Keepalived也用到了LVS项目中的IPVS技术。
LVS项目中包含的组件,也就是说LVS项目中有四层代理--ipvs这个技术。
四层代理和七层代理的区别
四层代理:四层代理拆解报文至传输层,根据请求的服务器IP+端口号进行转发;四层代理是由后端服务器进行处理,包括报文的封装都是后端服务器进行封装;四层代理相当于是一个路由器。
七层代理:七层代理拆解报文至应用层,分析用户请求的资源,然后负载均衡器会代替用户请求后端服务器的资源;后端服务器把资源返回给负载均衡器,负载均衡器对资源再次进行封装,然后返还给客户端;在此过程中,需要建立两次TCP连接,一次是客户端,一次是后端的服务器。
七层负载均衡的CPU密集程度比基于包的四层负载均衡更高。七层负载均衡能够让均衡器做更小粒度的负载均衡决定,并且会根据消息的内容( 比如压缩和加密 )利用最优化方式做出改变。它运用缓存的方式来卸载上游服务较慢的连接,并显著地提高了性能。
二、iptables、ipvs和netfilter
iptables其实是用于给负载均衡器进行传参,真正进行负载均衡的是netfilter ,它是真正的防火墙框架,位于内核空间中,iptables 用于操作 netfilter这个内核框架 ,netfilter / iptables 组成了Linux下的包过滤防火墙。
ipvs现在也已经成为内核的一部分,内置在了Netfilter框架中。它的工作原理是:IPVS通过在Netfilter框架中的不同位置注册自己的处理函数来捕获数据包,并根据与IPVS相关的信息表
对数据包进行处理,按照IPVS规则中定义的不同的包转发模式
,对数据包进行不同的转发处理。 对于上面这个概念,有两个部分需要作说明:
- IPVS相关的信息表由谁维护?毫无疑问是由用户维护,IPVS对应用户空间的管理工具
ipvsadm
为用户提供了写入规则的入口。没错,ipvsadm / ipvs 和 iptables / netfilter之间的关系是非常类似的。- IPVS有哪些包转发模式:
NAT
、IP tunneling
和Direct Routing
。
iptables也存在比较明显的缺点:
- iptables规则特别乱,一旦出现问题非常难以排查
- 由于iptables规则是串行执行,算法复杂度为O(n),一旦iptables规则多了后,性能将非常差。
- iptables规则提供的负载均衡功能非常有限,不支持较为复杂的负载均衡算法。
所以有了IPVS来对这些缺点进行弥补。
- ipvs采用了hash table来存储规则,因此在规则较多的情况下,Ipvs 相对iptables转发效率更高因此当service数量达到一定规模时,hash查表的速度优势就会显现出来,从而提高service的服务性能。
- IPVS 为大型集群提供了更好的可扩展性和性能。
- IPVS 支持比 IPTABLES 更复杂的负载平衡算法(最小负载、最少连接、局部性、加权等)。
- IPVS支持服务器健康检查、连接重试等。
kube-proxy中的iptables
为了避免增加内核和用户空间的数据拷贝操作,提高转发效率,Kube-proxy提供了iptables模式。
在该模式下,Kube-proxy为service后端的每个Pod创建对应的iptables规则,直接将发向
Cluster IP的请求重定向到一个Pod IP。该模式下Kube-proxy不承担四层代理的角色,只负责创建iptables规则。该模式的优点是
较userspace模式效率更高,但不能提供灵活的LB策略,当后端Pod不可用时也无法进行重试。
kube-proxy中的ipvs
kube-proxy监控Pod的变化并创建相应的ipvs rules。ipvs也是在kernel模式下通过
netfilter实现的,但采用了hash table来存储规则,因此在规则较多的情况下,Ipvs
相对iptables转发效率更高。除此以外,ipvs支持更多的LB算法。从k8s的1.8版本开始,kube-proxy引入了IPVS模式,IPVS模式与iptables同样基于
Netfilter,但是采用的hash表,因此当service数量达到一定规模时,hash查表的
速度优势就会显现出来,从而提高service的服务性能。如果要设置kube-proxy为ipvs模式,必须在操作系统中安装IPVS内核模块。
三、userspace
该模式下kube-proxy会为每一个Service创建一个监听端口。发向Cluster IP的请求被Iptables
规则重定向到Kube-proxy监听的端口上,Kube-proxy根据LB算法选择一个提供服务的Pod并和其建立链接,以将请求转发到Pod上。该模式下,Kube-proxy充当了一个四层Load balancer的角色。由于kube-proxy运行在
userspace中,在进行转发处理时会增加两次内核和用户空间之间的数据拷贝,效率较另外两种模式低一些;但好处是后端pod不可用时,可以进行重试。