iptables与IPVS如何选择
kube-proxy是Kubernetes集群的关键组件,负责Service和其后端容器Pod之间进行负载均衡转发。
CCE当前支持iptables和IPVS两种服务转发模式,各有优缺点。
- IPVS:吞吐更高,速度更快的转发模式。适用于集群规模较大或Service数量较多的场景。
- iptables:社区传统的kube-proxy模式。适用于Service数量较少或客户端会出现大量并发短连接的场景。当集群中超过1000个Service时,可能会出现网络延迟的情况。
约束与限制
- IPVS模式集群下,Ingress和Service使用相同ELB实例时,无法在集群内的节点和容器中访问Ingress,因为kube-proxy会在ipvs-0的网桥上挂载LB类型的Service地址,Ingress对接的ELB的流量会被ipvs-0网桥劫持。建议Ingress和Service使用不同ELB实例。
- iptables模式下,集群内部CluterIP地址无法ping通;IPVS模式下,集群内部CluterIP地址可以正常ping通。
iptables
iptables是一个Linux内核功能,提供了大量的数据包处理和过滤方面的能力。它可以在核心数据包处理管线上用Hook挂接一系列的规则。iptables模式中kube-proxy 在NAT pre-routing Hook中实现它的NAT和负载均衡功能。
kube-proxy的用法是一种O(n) 算法,其中的n随集群规模同步增长,这里的集群规模,更明确的说就是服务和后端Pod的数量。
IPVS
IPVS(IP Virtual Server)是在Netfilter上层构建的,并作为Linux内核的一部分,实现传输层负载均衡。IPVS可以将基于TCP和UDP服务的请求定向到真实服务器,并使真实服务器的服务在单个IP地址上显示为虚拟服务。
IPVS模式下,kube-proxy使用IPVS负载均衡代替了iptables。这种模式同样有效,IPVS的设计就是用来为大量服务进行负载均衡的,它有一套优化过的API,使用优化的查找算法,而不是简单的从列表中查找规则。
kube-proxy在IPVS模式下,其连接过程的复杂度为O(1)。换句话说,多数情况下,IPVS的连接处理效率是和集群规模无关的。
IPVS包含了多种不同的负载均衡算法,例如轮询、最短期望延迟、最少连接以及各种哈希方法等。而iptables就只有一种随机平等的选择算法。
IPVS相较于iptables的优势大致如下:
- 为大型集群提供了更好的可扩展性和性能
- 支持比iptables更好的负载均衡算法
- 支持服务器健康检查和连接重试等功能