pod 通信机制

如果要说明 pod 的通信机制,要从一个镜像说起,在 kubectl 安装kubernetes 的时候一定会看到 k8s.gcr.io/pause 这个镜像,不知道有没有疑问,这个到底是干嘛的?其它几个镜像顾名思义,但是这个【暂停】是什么?没错,他就是用来 hold 一个 Pod 内部多个 Container 网络通信。

如果在计算节点上运行 docker ps 命令

[root@localhost ~]# docker network ls
NETWORK ID          NAME                 DRIVER              SCOPE
c250329fad3c        bridge               bridge              local
c7c3d1f77969        compose_extnetwork   bridge              local
199b85fbf2fa        host                 host                local
b488be9da3d6        none                 null                local

如上所示,你可以看到在创建 nginx pod 过程中,不仅创建了一个nginx 容器,并附带了一个 pause 容器,而且 pause 容器是在 nginx容器之前创建的,这个被暂停的容器把所有的容器收纳到一起,一个基础容器,唯一目的就是保存所有的命名空间。容器中 pod 共享同一个 IP 地址。故同一个 Pod 中 Container 可以做到直接通过 localhost 直接通信,那么同一个节点多个 Pod 之间如何通信的呢?

iOS 项目跟pod之间连通 pod与pod之间通信_iOS 项目跟pod之间连通

(d)

pause 容器启动之前,会为容器创建虚拟一对 ethernet 接口,一个保留在宿主机 vethxxx(插在网桥上),一个保留在容器网络命名空间内,并重命名为eth0。两个虚拟接口的两端,从一端进入,另一端出来。任何 Pod 连接到该网桥的 Pod 都可以收发数据。如(d)图所示。


4、跨 node pod 通信

跨节点 Pod 通信,相当于创建一个整个集群公用的【 网桥 】然后把集群中所有的 Pod 连接起来,就可以通信了。

iOS 项目跟pod之间连通 pod与pod之间通信_docker_02

(e)

其中跨整个集群的 Pod ip 是唯一的,当报文从一个节点转发到另外一个节点时,报文首先通过 veth,然后通过网桥,转发到物理适配器网卡,最后转发到其它节点的虚拟网桥,进而到达 veth 目标容器。如(e)图所示。

其实现方式有 Flannel、calico、weave 等。

注意 k8s 的网桥跟 docker0  网桥功能类似,但是 k8s 并没有复用 docker0 网桥,其原因是 Kubernetes 为了连接 infra 容器更加方便,而是重新实现了 CNI 网络接口功能,它允许网络插件使用 CNI 接口,比如 flannel,它本身实现也经过几个过程,其本质上来说,是基于「隧道」机制实现。示意图(f)所示:

iOS 项目跟pod之间连通 pod与pod之间通信_docker_03