接下来我们在看宿主机host上的路由信息。
[root@localhost ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.8.65.1 0.0.0.0 UG 100 0 0 enp0s3 4.0.0.0 0.0.0.0 255.255.0.0 U 0 0 0 flannel0 4.0.100.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0 10.8.64.10 10.8.65.1 255.255.255.255 UGH 100 0 0 enp0s3 10.8.65.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s3现在有三个容器分别是A/B/C
容器ipA 4.0.100.3
B 4.0.100.5
C 4.0.32.3
当容器A发送到同一个subnet的容器B时,因为二者处于同一个子网,所以容器A/B位于同一个宿主机host上,而容器A/B也均桥接在docker0上。
[root@localhost ~]# brctl show bridge name bridge id STP enabled interfaces docker0 8000.02422e5ecd90 no veth2d1c803 veth916067e借助于网桥docker0,容器A/B即可实现通信。
那么位于不同宿主机的容器A和C如何通信呢?这个时候就要用到了flannel0这个设备了。
容器A想要发送给容器C,查路由表,可以知道需要使用flannel0接口,因此将数据发送到flannel0。
flanneld进程接收到flannel0接收的数据,然后从etcd中查询出4.0.32.0/24的子网的宿主机host的ip10.8.65.53。
然后将数据封包,发送到10.8.65.53的对应端口,由10.8.65.53的flanneld接收,解包,并转发到对应的容器中。