Flannel
Last updated
Last updated
Flannel通過給每臺宿主機分配一個子網的方式爲容器提供虛擬網絡,它基於Linux TUN/TAP,使用UDP封裝IP包來創建overlay網絡,並藉助etcd維護網絡的分配情況。
控制平面上host本地的flanneld負責從遠端的ETCD集群同步本地和其它host上的subnet信息,併爲POD分配IP地址。數據平面flannel通過Backend(比如UDP封裝)來實現L3 Overlay,既可以選擇一般的TUN設備又可以選擇VxLAN設備。
除了UDP,Flannel還支持很多其他的Backend:
udp:使用用戶態udp封裝,默認使用8285端口。由於是在用戶態封裝和解包,性能上有較大的損失
vxlan:vxlan封裝,需要配置VNI,Port(默認8472)和GBP
host-gw:直接路由的方式,將容器網絡的路由信息直接更新到主機的路由表中,僅適用於二層直接可達的網絡
aws-vpc:使用 Amazon VPC route table 創建路由,適用於AWS上運行的容器
gce:使用Google Compute Engine Network創建路由,所有instance需要開啓IP forwarding,適用於GCE上運行的容器
ali-vpc:使用阿里雲VPC route table 創建路由,適用於阿里雲上運行的容器
CNI flannel插件會將flannel網絡配置轉換爲bridge插件配置,並調用bridge插件給容器netns配置網絡。比如下面的flannel配置
會被cni flannel插件轉換爲
使用flannel前需要配置kube-controller-manager --allocate-node-cidrs=true --cluster-cidr=10.244.0.0/16
。
這會啓動flanneld容器,並配置CNI網絡插件:
flanneld自動連接kubernetes API,根據node.Spec.PodCIDR
配置本地的flannel網絡子網,併爲容器創建vxlan和相關的子網路由。
配置安裝簡單,使用方便
與雲平臺集成較好,VPC的方式沒有額外的性能損失
VXLAN模式對zero-downtime restarts支持不好
When running with a backend other than udp, the kernel is providing the data path with flanneld acting as the control plane. As such, flanneld can be restarted (even to do an upgrade) without disturbing existing flows. However in the case of vxlan backend, this needs to be done within a few seconds as ARP entries can start to timeout requiring the flannel daemon to refresh them. Also, to avoid interruptions during restart, the configuration must not be changed (e.g. VNI, --iface values).
參考文檔