Flannel通过Etcd服务维护了一张节点间的路由。
源主机的flanneld服务将原本的数据内容UDP封装后根据自己的路由表投递给目的节点的flanneld服
务,数据到达以后被解包,然后直接进入目的节点的flannel0虚拟网卡,然后被转发到目的主机的
Docker0虚拟网卡,最后就像本机容器通信一下的有Docker0路由到达目标容 器。
这样整个数据包的传递就完成了,这里需要解释三个问题。
第一个问题,UDP封装是怎么一回事?
我们来看下面这个图,这是在其中一个通信节点上抓取到的ping命令通信数据包。可以看到在UDP的数
据内容部分其实是另一个ICMP(也就是ping命令)的数据包。
原始数据是在起始节点的Flannel服务上进行UDP封装的,投递到目的节点后就被另一端的Flannel服务
还原成了原始的数据包,两边的Docker服务都感觉不到这个过程的存在。
第二个问题,为什么每个节点上的Docker会使用不同的IP地址段?
这个事情看起来很诡异,但真相十分简单。其实只是单纯的因为Flannel通过Etcd分配了每个节点可用的
IP地址段后,偷偷的修改了Docker的启动参数,见下图。
这个是在运行了Flannel服务的节点上查看到的Docker服务进程运行参数。
注意其中的“ --bip=172.17.18.1/24 ”这个参数,它限制了所在节点容器获得的IP范围。
这个IP范围是由Flannel自动分配的,由Flannel通过保存在Etcd服务中的记录确保它们不会重复。
评论