kubernetes中Pod网络的创建原理

Pod的概念

Pod是kubernetes中最重要的概念,无论是deployment、daemonSet还是job等等各种容器编排方式,都是围绕着pod进行的。

其实pod从根本上讲只是一个逻辑概念,和其他的资源对象一样,pod只是k8s中声明式定义的一个yaml文件。最终由调度到的k8s节点上的kubelet服务调用linux操作系统namespace、cgroup、docker等等底层原理来实现。

Pod共享网络

我们每创建一个pod,k8s都会首先创建一个pause容器,这个pause容器非常小,只有100多kB,是一个汇编语言实现的容器,和名字一样,它永远处于暂停状态。

kubernetes中Pod网络的创建原理_第1张图片

这个容器的作用就是给这个pod创建network namespace,之后这个pod中的其他容器都通过join namespace的方式加入到pod的network namespace中。

我们通在nginx的pod的namespace中新增一个busybox容器,模拟一下业务容器join到pause容器的network namespace的现象。

docker run -itd --name=test --network=container:k8s_POD_nginx-85b98978db-jnpp8_default_b0bd5a02-454c-4049-b7d3-166ef3618c9d_0  busybox

718c9e92f9bef15d96db42dfa367bc5e.png

进入新建立的busybox容器中,查看容器的网络设备和ip地址,可以发现和nginx容器的网络设备和ip地址完全相同。

kubernetes中Pod网络的创建原理_第2张图片

这也说明,为什么pod中的业务容器重启,pod ip并不会发生变化。

一个pod中的所有容器是共享网络的,容器的网络设备、ip、mac地址等都是一份,从pod中调用本pod中的其他容器时可以直接使用localhost调用。

我们在busybox容器中连接localhost的80端口,可以直接连接到nginx上。

kubernetes中Pod网络的创建原理_第3张图片

Pod与主机连接

从网络的角度看,一个pod就是一个独立的namespace。在Pod的namespace与主机的namespace建立一个linux虚拟网络设备veth网卡对,虚拟网卡veth peer,可以理解为两张网卡中间连着一根网线,从一端的网卡发送数据包可以从另一端的网卡接收到。

如果使用flannel网络插件,连接到主机namespace的虚拟网卡会连接到虚拟网桥cni0上,主机路由将本节点子网网段的流量转给cni0网桥,再由网桥转给对应pod的namespace。

flannel虚拟网络设备截图如下图所示。本机子网网段10.244.1.0/24的流量全部转给cni0网桥,veth连在cni0网桥上。

kubernetes中Pod网络的创建原理_第4张图片

Pod的整体网络示意图如下所示。

kubernetes中Pod网络的创建原理_第5张图片

如果使用calico网络插件,则没有虚拟网桥,每有一个pod的namespace ip,就在主机新增一条路由,直接将pod ip的流量通过veth转到pod namespace中。

如果你对linux 、kubernetes 感兴趣,欢迎关注~

kubernetes中Pod网络的创建原理_第6张图片​​​​​​​

 

你可能感兴趣的:(kubernetes,网络,kubernetes,运维,云原生,云计算)