kubernetes每个节点上运行着kube-proxy,当访问服务ClusterIP时,由kube-proxy负责将流量负载均衡到每个Pod上面去,负载均衡的实现方式有三种:

  • user namespace(legacy)

  • iptables

  • ipvs

user namespace

流量转发流程

  1. 客户端访问服务的ClusterIP

  2. 根据iptables规则, 将其转发到kube-proxy进程监控的端口

  3. kube-proxy查找服务注册中心将请求转发给某个实例

  • 评估

优势:当请求某个实例失败时,因为在用户空间,可以进行重试其它实例

劣势:效率低,因为第二步涉及到内核空间和用户空间的切换

kube-proxy1.jpg

iptables

流量转发流程

  1. 客户端访问服务的ClusterIP

  2. 根据iptables规则直接写成转发包到服务实例

  • 评估

优势: 不涉及内核用户态切换,效率更高。因为不用将包从内核转到kube-proxy进程处理,然后再切回来

劣势: 比较难debug,不像第一种方式那样可以直接看kube-proxy访问日志/var/log/kube-proxy,不得不去看内核处理iptables规则的日志

kube-proxy2.jpg

ipvs

流量转发流程

  1. 客户端访问服务的ClusterIP

  2. 根据ipvs规则直接写成转发包到服务实例(和第二种唯一区别是将iptables换成ipvs)

  • 评估

优势:IPVS基于netfilter钩子函数实现类似iptables功能,但使用hash表作为底层数据结构来查找路由规则,ipvs是一个内核模块,且也在内核态工作,iptables使用数组遍历方式处理规则,因此效率和路由规则数量呈正比,当服务增加到1000+, 效率比用hash表处理规则的ipvs差了

劣势:需要高版本内核,低版本内核没有ipvs模块,这个时候如果设置ipvs模式,kube-proxy会自动降级到iptables模式

kube-proxy3.jpg

总结

IPVS (IP Virtual Server,IP虚拟服务器)是基于Netfilter的、作为linux内核的一部分实现传输层负载均衡的技术,通常称为第4层LAN交换。IPVS集成在LVS(Linux Virtual Server)中,它在主机中运行,并在真实服务器集群前充当负载均衡器。IPVS可以将对TCP/UDP服务的请求转发给后端的真实服务器,并使真实服务器的服务在单个IP地址上显示为虚拟服务。因此IPVS天然支持Kubernetes Service

  • 随着kubernetes使用量的增长,其资源的可扩展性变得越来越重要。特别是对于使用kubernetes运行大型工作负载的开发人员或者公司来说,service的可扩展性至关重要。kube-proxy是为service构建路由规则的模块,之前依赖iptables来实现主要service类型的支持,比如(ClusterIP和NodePort)。但是iptables很难支持上万级的service,因为iptables纯粹是为防火墙而设计的,并且底层数据结构是内核规则的列表。

  • 而相比于 iptables,IPVS 在内核中的实现其实也是基于 Netfilter 的 NAT 模式,所以在转发这一层上,理论上 IPVS 并没有显著的性能提升。但是,IPVS 并不需要在宿主机上为每个 Pod 设置 iptables 规则,而是把对这些“规则”的处理放到了内核态,从而极大地降低了维护这些规则的代价。

  • kubernetes早在1.6版本就已经有能力支持5000多节点,这样基于iptables的kube-proxy就成为集群扩容到5000节点的瓶颈。举例来说,如果在一个5000节点的集群,我们创建2000个service,并且每个service有10个pod,那么我们就会在每个节点上有至少20000条iptables规则,这会导致内核非常繁忙。基于IPVS的集群内负载均衡就可以完美的解决这个问题。IPVS是专门为负载均衡设计的,并且底层使用哈希表这种非常高效的数据结构,几乎可以允许无限扩容。不过需要注意的是,IPVS 模块只负责上述的负载均衡和代理功能。而一个完整的 Service 流程正常工作所需要的包过滤、SNAT 等操作,还是要靠 iptables 来实现。只不过,这些辅助性的 iptables 规则数量有限,也不会随着 Pod 数量的增加而增加。

IPVS模式在Kubernetes v1.8中引入,并在v1.9中进入了beta。1.11中实现了GA(General Availability)。IPTABLES模式在v1.1中添加,并成为自v1.2以来的默认操作模式。IPVS和IPTABLES都基于netfilter。IPVS模式和IPTABLES模式之间的差异如下:

  • IPVS为大型集群提供了更好的可扩展性和性能。(规则的存储方式使用的数据结构更高效)

  • IPVS支持比iptables更复杂的负载平衡算法(rr:循环,lc:最少连接,dh:目标散列,sh:源哈希,sed:最短的预期延迟,nq:从不排队)。

  • IPVS支持服务器健康检查和连接重试等。

在集群中不超过1000个服务的时候,iptables 和 ipvs 并无太大的差异。而且由于iptables 与网络策略实现的良好兼容性,iptables 是个非常好的选择。当你的集群服务超过1000个时,而且服务之间链接大多没有开启keepalive,IPVS模式可能是一个不错的选择

文章作者: 鲜花的主人
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 爱吃可爱多
Kubernetes Kubernetes
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝