Flannel

    控制平面上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 创建路由,适用于阿里云上运行的容器

    Docker集成

    会被cni flannel插件转换为

    1. {
    2. "name": "mynet",
    3. "type": "bridge",
    4. "mtu": 1472,
    5. "ipMasq": false,
    6. "isGateway": true,
    7. "ipam": {
    8. "subnet": "10.1.17.0/24"
    9. }
    10. }

    Kubernetes集成

    使用flannel前需要配置kube-controller-manager --allocate-node-cidrs=true --cluster-cidr=10.244.0.0/16

    这会启动flanneld容器,并配置CNI网络插件:

    1. $ ps -ef | grep flannel | grep -v grep
    2. root 3625 3610 0 13:57 ? 00:00:00 /opt/bin/flanneld --ip-masq --kube-subnet-mgr
    3. {
    4. "name": "cbr0",
    5. "type": "flannel",
    6. "delegate": {
    7. "isDefaultGateway": true
    8. }
    9. }

    flanneld自动连接kubernetes API,根据node.Spec.PodCIDR配置本地的flannel网络子网,并为容器创建vxlan和相关的子网路由。

    Flannel - 图3

    • 配置安装简单,使用方便
    • 与云平台集成较好,VPC的方式没有额外的性能损失

    缺点

    • VXLAN模式对zero-downtime restarts支持不好