本文已参与[新人创作礼]活动,一起开启掘金创作之路。
kubernetes网络由于它集群的特性,面对不同的服务器,不同的pod,那么其网络流程就可以分出不同的场景。
首先,在同一个pod的不同容器之间的通信。在kubernetes中每一个pod都会有一个根容器,这个根容器里面就会包含ip、端口等网络信息,每个pod都会有一个单独的根容器,你在后面加的容器都只会添加,不会改变pod的网络内容。官方内容是指在同一个pod当中的不同容器是共享网络命名空间的。所以在同一个pod的不同容器是可以直接通过localhost的方式直接访问的。
其次,在同一台机器的不同pod之间的通信。同一机器的pod网络,以下图为例,pod当中含有container1,container2两个容器和一个pause容器(也就是根容器)。图中有三个网卡设备,eth0是kubernetes集群主机的网卡设备,这个作为服务器之间通信的基本条件一般都会有。docker0是一个虚拟网桥,可以简单理解为一个虚拟交换机,它是支持该节点上的Pod之间进行IP寻址和互通的设备。veth0则是Pod1的虚拟网卡,是支持该Pod内容器互通和对外访问的虚拟设备。docker0网桥和veth0网卡,都是linux支持和创建的虚拟网络设备。Pod的IP是由docker0网桥分配的,例如上图docker0网桥的IP是172.17.0.1,它给第一个Pod1分配IP为172.17.0.2。如果该节点上再启一个Pod2,那么相应的分配IP为172.17.0.3,如果再启动Pod可依次类推。因为这些Pods都连在同一个网桥上,在同一个网段内,它们可以进行IP寻址和互通。
最后,在不同机器之间不同pod的通信。在不同机器之间网络通信时,docker0网桥就不能跨机器了,这个时候我们需要一个桥梁将两者关联起来,也就是cni网络插件,现在比较流行的是flannel和calico。以flannel为例,flannel会在每一台集群主机之中创建一个flannel0,flannel0给创建的pod分配一个和它同网段的ip,flannel0和主机ip做关联,这时不同主机的pod就可以通过flannel0进行通信。