kubernetes的网络实现
kubernetes的网络设计主要针对以下几种情况实现的:
同一pod下容器与容器的通信;
同一节点下不同的pod之间的容器间通信;
不同节点下容器之间的通信;
集群外部与内部组件的通信;
pod与service之间的通信;
同一pod下容器与容器的通信
同一个pod下的容器之间的通信,其实原理很简单,因为容器都在共用一个linux协议栈,可以
简单的看作在同一个网络里面,所以可以理解为一个容器为web服务,一个容器为mysql。
web服务可以使用宿主机的IP地址+3306端口就可以访问,不需要通过其他组件的处理,这种
访问方式是最简单的。
同一节点下不同的pod之间的容器间通信
这种通信方式就会比前面的复杂一点,至少需要理解pod之间的通信方式。
同一个node上的不同pod之间的通信:
在同一个node上,pod之间都是通过veth链接到docker0网桥上,docker0会动态地分配IP地址给pod。
综上所述:由于它们在同一个节点上,而且共用一个docker0网桥,所以网络地址也是相同点的,也可以直连。
不同节点下容器之间的通信
不同节点的容器通信就复杂点,不过理解还是很容易的。
由于容器分别在不同的容器上,所以她们就会由不同的docker0来分配不同的IP地址,有可能
就不会在同一个网段内,为了实现通信呢,就必须想办法通过IP地址寻址的方式来实现通信。
pod与service之间的通信
kubernetes创建服务时,会为服务分配一个虚拟的IP地址,即为ClusterIP,客户端通过访问这
个虚拟IP地址来访问内部组件。实质上具体访问内部的工作都是kube-proxy来完成的。kube-
proxy担负着透明代理和负载均衡的角色,其实就是将某个访问service的请求,通过一套算法
和规则转发给后端的pod,这里说的算法就是Round Robin负载均衡算法和session粘连规则。
我们还可以通过修改service里面的service.spec.sessionAffinity参数的值来实现会话保持特
的定向转发。
总之,不管是clusterIP+targetPort,还是节点IP+NodePort,都会被Iptables规则重新定向到
kube-proxy监听服务的代理端口。
集群外部与内部组件的通信
集群外部与内部的通信,目前就是两种方式:
(1)NodeIP+NodePort
这种方式就是直接在宿主机上打开一个端口,用来访问集群内部服务。
(2)loadBalance
使用外部云服务提供商的负载均衡器。
其原理也是很简单
外部请求访问内部服务,iptables为设置Nodeport规则,将对Service的访
问转接到kube-proxy作为负载均衡器,然后经过负载均衡算法进入到pod中。
![](https://img.haomeiwen.com/i3764857/a13ccb37ed272df2.jpg)
网友评论