service cluster IP是一个虚拟IP,是由kubernetes节点上的iptables规则管理的
通过iptables-save | grep 10.105.215.156看到与cluster IP 10.105.215.156相关的的信息:
这两条规则的含义是:
1.如果 Cluster 内的 Pod(源地址来自 10.244.0.0/16)要访问 httpd-svc
,则允许
2.其他源地址访问 httpd-svc
,跳转到规则 KUBE-SVC-RL3JAE4GN7VOGDGP
。
我们查看一下KUBE-SVC-RL3JAE4GN7VOGDGP的规则
1.1/3的概率跳转到规则KUBE-SEP-743ZVF7RHRJGVII6
2.1/3的概率跳转到规则 KUBE-SEP-GXPZJNJOCY6I42DY
3.1/3的概率跳转到规则KUBE-SEP-ZRTKM6VWDCK7UAPS
上面三个的跳转规则如下:
将请求分别转发到后端三个pod
结论:
iptables将访问service的流量转发到后端pod,使用的是类似轮询的负载均衡策略。Cluster 的每一个节点都配置了相同的 iptables 规则,这样就确保了整个 Cluster 都能够通过 Service 的 Cluster IP 访问 Service。
Service 默认轮询,也可以使用 spec.sessionAffinity: ClientIP 保持回话