在 Kubernetes 集群中,每个 Node 会运行一个 kube-proxy 进程, 负责为 Service 实现一种 VIP(虚拟 IP,即 clusterIP)的代理形式,默认使用 iptables 模式。

iptables

此模式 kube-proxy 会监视 apiserver 对 Service 对象和 Endpoints 对象的添加和移除。对每个 Service,它会添加上 iptables 规则,从而捕获到达该 Service 的 clusterIP(虚拟 IP)和端口的请求,进而将请求重定向到 Service 的一组 backend 中的某一个 Pod 上面。
image.png

缺点:
iptables 因为它纯粹是为防火墙而设计的,并且基于内核规则列表,集群数量越多,可能使得内核繁忙,导致性能越差。

ipvs

在 ipvs 模式下,kube-proxy 监视 Kubernetes 服务和端点,调用 netlink 接口相应地创建 IPVS 规则, 并定期将 IPVS 规则与 Kubernetes 服务和端点同步。访问服务时,IPVS 将流量定向到后端 Pod 之一。

IPVS 代理模式基于类似 iptables 模式的 netfilter 钩子函数,但是使用哈希表作为基础数据结构,并且在内核空间中工作。 所以相对于iptables 模式而言,IPVS 模式下的 kube-proxy 重定向通信的延迟要短,同步代理规则时具有更好的性能。

IPVS 模式还支持更高的网络流量吞吐量。所以对于较大规模的集群会使用 ipvs 模式的 kube-proxy。如果不满足运行条件会自动降级为 iptables 模式。现在都推荐使用 ipvs 模式,可以大幅度提高 Service 性能。
image.png

IPVS 提供的流量策略(默认是rr):

  • rr: round-robin 轮询调度
  • lc: least connection (smallest number of open connections) 最小连接数
  • dh: destination hashing 目标哈希
  • sh: source hashing 源哈希
  • sed: shortest expected delay 最短期望延迟
  • nq: never queue 不排队调度