kube-proxy
当service有了port和nodePort之后,就可以对内/外提供服务。那么其具体是通过什么原理来实现的呢?奥妙就在kube-proxy在本地node上创建的iptables规则。
kube-proxy通过配置DNAT规则(从容器出来的访问,从本地主机出来的访问两方面),将到这个服务地址的访问映射到本地的kube-proxy端口(随机端口)。然后kube-proxy会监听在本地的对应端口,将到这个端口的访问给代理到远端真实的Pod地址上去。
Chains
创建Service以后,kube-proxy会自动在集群里的Node上创建以下两条规则:KUBE-PORTALS-CONTAINER、KUBE-PORTALS-HOST。如果是NodePort方式,还会额外生成两条:KUBE-NODEPORT-CONTAINER、KUBE-NODEPORT-HOST
KUBE-PORTALS-CONTAINER
主要将由网络接口到来的通过服务集群入口 <cluster ip>:port
的请求重定向到本地kube-proxy端口(随机端口)的映射,即来自本地容器的服务访问请求。这种情况的网络包不可能来自外部网络,因为cluster ip是个virtual ip,外部网络中不存在这样的路由将该数据包发送到本机;所以该请求只能来自本地容器,从本地容器出来的访问,服务访问请求是通过本地容器虚拟网卡输入到本地网络接口的。
KUBE-NODEPORT-CONTAINER
主要将由网络接口到来的通过服务集群外部入口 <node ip>:nodePort
的请求重定向到本地kube-proxy端口(随机端口)的映射;即来自K8s集群外部网络的服务访问请求,可以来自本机容器,也可以来自其他node的容器,还可以来自其他node的进程。
kube-proxy反向代理
不管是通过集群内部服务入口 <cluster ip>:port
还是通过集群外部服务入口 <node ip>:nodePort
的请求都将重定向到本地kube-proxy端口(随机端口)的映射,然后将到这个kube-proxy端口的访问给代理到远端真实的Pod地址上去。