Service Cluster IP 是一个虚拟 IP,是由 Kubernetes 节点上的 iptables 规则管理的。
可以通过 <code>iptables-save</code> 命令打印出当前节点的 iptables 规则,因为输出较多,这里只截取与 <code>httpd-svc</code> Cluster IP <code>10.99.229.179</code> 相关的信息:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CN0YzM0YTOxYTMtUTNxIDNzEjNwQDMzADOxAjMtUjNzUzN38CXzADOxAjMvwVN2MTN3czLcd2bsJ2Lc12bj5ycn9Gbi52YugTMwIzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
这两条规则的含义是:
如果 Cluster 内的 Pod(源地址来自 10.244.0.0/16)要访问 <code>httpd-svc</code>,则允许。
其他源地址访问 <code>httpd-svc</code>,跳转到规则 <code>KUBE-SVC-RL3JAE4GN7VOGDGP</code>。
<code>KUBE-SVC-RL3JAE4GN7VOGDGP</code> 规则如下:
1/3 的概率跳转到规则 <code>KUBE-SEP-C5KB52P4BBJQ35PH</code>。
1/3 的概率(剩下 2/3 的一半)跳转到规则 <code>KUBE-SEP-HGVKQQZZCF7RV4IT</code>。
1/3 的概率跳转到规则 <code>KUBE-SEP-XE25WGVXLHEIRVO5</code>。
上面三个跳转的规则如下:
即将请求分别转发到后端的三个 Pod。通过上面的分析,我们得到如下结论:
iptables 将访问 Service 的流量转发到后端 Pod,而且使用类似轮询的负载均衡策略。
另外需要补充一点:Cluster 的每一个节点都配置了相同的 iptables 规则,这样就确保了整个 Cluster 都能够通过 Service 的 Cluster IP 访问 Service。
除了直接通过 Cluster IP 访问到 Service,DNS 是更加便捷的方式,下一节我们讨论。
书籍:
1.《每天5分钟玩转Docker容器技术》
<a href="https://item.jd.com/16936307278.html" target="_blank">https://item.jd.com/16936307278.html</a>
2.《每天5分钟玩转OpenStack》
<a href="https://item.jd.com/12086376.html" target="_blank">https://item.jd.com/12086376.html</a>