浅析flannel与docker结合的机制和原理(2)

接下来我们在看宿主机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

容器ip
A   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。

[root@localhost calico]# etcdctl get /coreos.com/network/subnets/4.0.32.0-24 {"PublicIP":"10.8.65.53"}

然后将数据封包,发送到10.8.65.53的对应端口,由10.8.65.53的flanneld接收,解包,并转发到对应的容器中。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/c2520fcf5518df41bace815790b0f152.html