Flannel
最后更新于
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).
参考文档