在同一个k8s pod当中,有pause进程还有一个或多个容器共享一个网络命名空间,pause之间进行通信主要依赖2个设备,一个是虚拟网络设备,它的一端接在pod网络命名空间里面,另外一端接在宿主机的网络命名空间里面,这是一个全局的网络命名空间,然后在宿主机的这一端又接在了网桥设备,这个网桥设备又会把报文发送到相连的另外一个pod上的虚拟网络设备,从而通过虚拟网络设备发送到另外的一个pod当中,也就是说这个虚拟网络设备就是虚线的圈,类似于一个网线的2端。
以宿主机的网络命名空间当中的网桥作为中介,实现pod之间的互联,有多少个pod就会有多少个虚拟网络设备,是成对出现的,无论有多少个pod都通过网络设备把它们连接起来。
首先看下宿主机上面这些网络设备,
cni0是网桥,veth开头的都是虚拟网络设备的一端,
cni0这个网桥连接了一共有5个虚拟网络设备,
这个是cni0网桥连接的每个虚拟网络设备在宿主机上的某一个网络命名空间的id。
这个虚拟网络设备是连接在这个网络命名空间,在这个网络命名空间下就有它的另外一端与它相连,
从而实现了把这个网络命名空间下的报文发到宿主机上并且通过cni0与另外的虚拟网络设备相连,从而再把报文转发到另外的pod当中。
当前k8s node上有多少的网络命名空间?
当前宿主机上有5个网络命名空间。
指定的pod是属于哪个网络命名空间?
这个ip依然在这5个网络命名空间中的某一个中,怎么知道哪个命名空间中有这个地址呢?
一个一个试,看这个网络命名空间下的网络设备,
在u1这个pod中它有2个网络设备,一个是回环设备,在这个pod中的容器可以使用这个设备进行通信;
eth0是这个pod对外的,也就是虚拟网络设备2端中的一端。
通过ip知道u1这个pod使用的网络命名空间是哪个,
f7a9这个pod的网络命名空间对接的宿主机上的虚拟网络设备是vethbab5..这个。
在这个网络命名空间下,这个虚拟网络设备的一端同时也连接着宿主机上的
这个虚拟网络设备。
在u1的pod中发送网络的数据包,然后在宿主机上监听这个虚拟网络设备的接口,看是否可以拿到网络的数据包?
进入pod1中ping u2 pod的ip,ping协议是通过icmp协议(internet控制报文协议)来发送网络数据包,
已经知道了网络另外一端是这个,监听下宿主机上的这个网络设备,
pod1 发送3次ping请求,
还可以进一步监听下网桥的这个设备。
在现有的pod中再创建一对虚拟网络设备,一端放在u1的pod中,另外一端接在宿主机当中实现简单的通信。
首先创建一对虚拟网络设备,
veth类型、成对出现、一个是vethtest、另一个是vethtest-pair。
由于是在宿主机上创建的,所以应该是在宿主机的网络命名空间里,
需要把其中的一端接入到u1的pod当中,
u1的网络命名空间的id是这个,
把pair端放到u1的网络命名空间当中,宿主机的网络命名空间中就看不到pair这个网络设备了,到u1 pod中看下,
为了使得这两端是可以通信的,需要在u1给pair这个网络设备设置一个ip地址,然后把2个设备都启动起来,
在宿主机上执行这个命令,表示在这个网络命名空间下给pair这个虚拟网络设备设置ip地址,其中24表示这个ip地址的网段是24位的,dev是device设备。
回到pod u1中可以看到pair这个虚拟网络设备已经有了ip地址。
在宿主机中把pair这个设备启动起来,
回到pod中可以看到pair设备已经起来了。
同时把宿主机这一端的网络设备也启动起来,
在pod u1中看下路由信息,
默认路由通过eth0发送出去,但由于给vethtest-pair有了一个新的网段,ping这个网段的ip地址,
其实这个ip地址在当前的网络里面是不存在的,所以在宿主机上监听下arp的报文即监听的这一端,
看报文能不能从pod里面流入宿主机当中,
可以看到收到了arp的请求,问谁是172.16.1.101,从而证明了通过命令创建的这样一对虚拟网络设备是可以在不同的网络命名空间下进行通信的。