Service 拥有一个稳定的 IP 和端口,对应的 Endpoint 资源包含了一组 service 对应 pod 的 IP 端口。向 service 的 IP 端口发送请求,会被发到对应的 Endpoint 下的一个 IP 端口。
Service 的这种能力是通过 kube-proxy 实现的。kube-proxy 有几种 工作模式。
User space proxy mode
每台 node 上的 kube-proxy 会为每个 service 在本机 bind 一个单独的端口。Pod 发出到 service 的请求包后,由 iptables 将包转发到 kube-proxy bind 的这个端口,再由 kube-proxy 作为代理转发到目标 pod 中。这种模式 性能相较其他方式差,因为涉及了内核态和用户态的转换。负载均衡的方式是 round-robin。
iptables proxy mode
kube-proxy 监视 service 和 endpoint 的变化,以此为基础维护它所在的 node 的 iptables。Node 上的 pod 发起的请求,会直接被 iptables 修改后发到目标 pod 中。
这种模式 性能好,纯内核态。负载均衡的方式是 随机转发。
IPVS proxy mode
这是在 k8s 1.11 版本 stable 下来的一种模式。IPVS 是 kernel 提供的一种能力,可以看作是 iptables 的升级版。它的性能要比 iptables 更好,而且能指定负载均衡的方式。