Flannel解读

概念

由我上篇博文Docker网络解读可知,flannel主要用来解决容器的跨主机通信问题,同时也是kubernetes主要实现网络互通的方式,那么flannel是如何实现容器间跨主机通信的呢,下面我们引入flannel github上的一张原理图来解读:
Flannel解读
要完整解读此图,在此之前,我们首先要了解下flannel关联的一个重要组件"Etcd”的概念。

什么是Etcd?

我们引用下Etcd的基本概念:etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现。etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper 和 Doozer,它使用Go语言编写,并通过Raft一致性算法处理日志复制以保证强一致性。Raft是一个来自Stanford的新的一致性算法,适用于分布式系统的日志复制,Raft通过选举的方式来实现一致性,在Raft中,任何一个节点都可能成为Leader。Google的容器集群管理系统Kubernetes、开源PaaS平台Cloud Foundry和CoreOS的Fleet都广泛使用了etcd。

在上面这一大段话中,我们可以了解到etcd是一个基于服务发现的系统。服务发现可理解为在一个Cluster集群内记录各node信息的数据库,其他node可通过该数据库获取该Cluster集群内各node的信息。

Flannel实现原理

了解了以上概念之后,我们就能说明flannel的实现原理了,为了解释清楚,我们把实现原理分为以下几个步骤:

  1. 数据从Web App Frontend1这个容器发出经veth0网桥转发到宿主机的docker0网桥上
  2. docker0网桥根据数据包的目的地址进行转发,若为非本机容器地址则转发给Flannel0网卡处理
  3. Flannel0网卡交给flanneld这个进程处理,flanneld通过查询etcd,找到目的容器地址,并进行转发
  4. 数据包到达目的主机,经flanneld解包,最后由docker0转发到目的容器

这样整个数据包发送过程就解释完成了。

当然仅仅是这样还不够,flannel为每个在它管理下的容器赋予了一个独立的不会重复的ip地址,这样跨主机容器的ip地址就不会重复了,在这个前提下才能实现以上步骤的精确转发。

总结

flannel为集群内每个容器分配一个独立的ip地址,通过etcd的服务发现功能存储各node容器的ip信息,实现数据包的精确转发,解决了各容器间的跨主机通信问题。

相关推荐