Flannel

Flannel

FlannelCoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。FlannelOpenVSwitch思路基本一致,就是当Docker在宿主机上创建一个网桥的时候,用自己的网桥替代它。在默认的Docker配置中,每个节点上的Docker服务会分别负责所在节点容器的IP分配。这样导致的一个问题是,不同节点上容器可能获得相同的内外IP地址。并使这些容器之间能够之间通过IP地址相互找到,也就是相互ping通。

Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得“同属一个内网”且”不重复的”IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。Flannel实质上是一种“覆盖网络(overlaynetwork)”,也就是将TCP数据包装在另一种网络包里面进行路由转发和通信,目前已经支持udp、vxlan、host-gw、aws-vpc、gcealloc路由等数据转发方式,默认的节点间数据通信方式是UDP转发。

Flannel 网络模型解析

数据请求从容器1(10.0.46.2:2379)中发出后,首先经由所在主机的docker0虚拟网卡(10.0.46.1)转发到flannel0虚拟网卡(10.0.46.0),这是个P2P虚拟网卡,Flannel通过修改Node路由表的方式实现flanneld服务监听flannel0虚拟网卡数据。接着flannel服务将原本的数据内容UDP封装后根据自己的路由表投递给目的节点的flanneld服务。在此包中,包含有outer-ip(source:192.168.8.227, dest:192.168.8.228),inner-ip(source:10.0.46.2:2379, dest:10.0.90.2:8080)。

数据到达node2以后被解包,直接进入目的节点的flannel0虚拟网卡中(10.0.90.0),且被转发到目的主机的docker0虚拟网卡(10.0.90.1),最后就像本机容器通信一样由docker0路由到达目标容器2(10.0.90.2:8080)。为使每个结点上的容器分配的地址不冲突。Flannel通过Etcd分配了每个节点可用的IP地址段后,再修改Docker的启动参数“–bip=X.X.X.X/X”这个参数,它限制了所在节点容器获得的IP范围。