在上一篇文章中我们主要介绍了集群内cluster ip service的实现原理,当然是基于iptable的nat的模式,也就是说利用OS的网络内核来完成负载均衡。在这里我们主要介绍node port的实现原理,当然我们这里的k8s容器网络还是基于iptable的,不是基于ipvs的。我们以之前文章中的nginx-ingress-controller-service为实际例子来介绍,nginx-ingress-controller-service在以前文章里我们以node port类型的service暴露给外界提供服务。
查看以前文章中部署的nginx-ingress-controller的service我们可以看到:
kubectl describe service service-nginx-ingress -n kube-system
对node port类型的service来说,访问host的port就访问到了这个服务。所以从host网络角度来看,当host收到数据包的时候应该是进入host network namespace的PREROUTING chain中,我们查看host network namespace的PREROUTING chain。
iptables -nvL -t nat
根据规则,对于PREROUTING chain中,所有的流量都走到了KUBE-SERVICES这个target中。
查看KUBE-SERVICES target:
iptables -nvL -t nat | grep KUBE-SVC
在KUBE-SERVICES target中我们可以看到当访问nginx-ingress-controller-service在host上的8080或者8443port的时候,根据规则匹配到了KUBE-NODEPORTS这个target。
查看KUBE-NODEPORTS target:
iptables -nvL -t nat
在KUBE-NODEPORTS target中我们可以看到当访问8080和8443时:
查看KUBE-MARK-MASQ target:
这里只是做了一下标记,并没有nat target。
iptables -nvL -t nat
查看KUBE-SVC-QY5PTWKILTPBPDCE和KUBE-SVC-SQYXO6PN7K55YEZU两个target:
iptables -nvL -t nat
我们可以看到
查看KUBE-SEP-WM2TRROMQQXWNW4W和KUBE-SEP-7XLQX5JZL77UC7RY两个target:
iptables -nvL -t nat
我们可以看到
所以综合上面的例子,对于ipable方式的k8s集群内node port类型的service总结为: