flannel
是coreos
开源的Kubernetes CNI
实现。它使用etcd
或者Kubernetes API
存储整个集群的网络配置。每个kubernetes
节点上运行flanneld
组件,它从etcd
或者Kubernetes API
获取集群的网络地址空间,并在空间内获取一个subnet
,该节点上的容器IP
都从这个subnet
中分配,从而保证不同节点上的IP
不会冲突。flannel
通过不同的backend
来实现跨主机的容器网络通信,目前支持udp
,vxlan
,host-gw
等一系列backend
实现。本文介绍vxlan backend
下的容器通信过程。
flannel
在v0.9.0
版本上对vxlan
的实现作了改动。源码中有一段非常详细的注释介绍了不同版本的设计与实现:
1 | // Some design notes and history: |
v0.9.0
之前版本的实现主要依赖vxlan
内核模块的L2MISS
和L3MISS
消息机制。L2MISS
是指vxlan
设备在ARP
表中找不到内层IP
对应的MAC
地址时会给用户态程序发送netlink
消息。L3MISS
是指vxlan
设备在FDB
表中找不到VXLAN
协议内层MAC
地址所属的VTEP
的IP
地址时会给用户态程序发送netlink
消息。之前的文章<<动态维护FDB表项实现VXLAN通信>>介绍过相关概念和操作。本文主要分析v0.9.0
版本上的实现方式。