# flannel-doc **Repository Path**: cncfstack/flannel-doc ## Basic Information - **Project Name**: flannel-doc - **Description**: flannel 资料文档 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-04-22 - **Last Updated**: 2023-05-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Flannel ‘社区提供的几个基本的CNI ,是对容器的网络最细粒度的配置,基于不同的linux网络虚拟化方式(vethpair、macvlan等),生成容器内的网卡,打通了节点和节点上的容器的网络,而要实现跨节点的容器之间的网络,有几种可能的办法: 容器的IP、node的IP都是同一个二层网络里分配的IP,这样容器相当于二层网络里的node,那么就可以直接二层互联; 容器的IP与node的IP不属于同一个网段,node上配置个到各个网段的路由(指向对应容器网段所部属的node IP),通过路由实现互访[flannel host-gw, calico bgp均是通过此方案实现]; 容器的IP与node的IP不属于同一个网段,node上有服务对容器发出的包进行封装,对发给容器的包进行解封。封装后的包通过node所在的网络进行传输。解封后的包通过网桥或路由直接发给容器,即overlay网络。[flannel udp/vxlan,calico ipip,openshift-sdn均通过此方案实现] 本文我们将介绍一下几个主流的集群网络方案。 ## flannel flannel是一个简单的容器网络方案,基于一个名为flanneld的网桥,以及绑定在网桥上的vethpair作为节点上的容器网络架构,在flannel方案下,每个k8s node都支持一段cidr,node上的非hostNetwork的pod,必须属于这段cidr,并提供了几种方式,实现容器的跨节点互联: host-gw ,将node的IP视为node上pod网段的网关。只要node彼此之间属于一个“二层”,那么容器访问另一个node上的对端容器时,直接找到对端node的网卡。对端node的网卡与对端容器的veth都绑在flanneld上,所以直接转发到对端容器。 udp/vxlan, flannel的overlay方案。每个node节点上都有一个flanneld进程,和flannel0网桥,容器网络会与flannel0网桥互联,并经由flannel0发出,所以flanneld可以捕获到容器发出的包进行封装。udp方案下会包装一个udp的头部,vxlan下会包装一个vxlan协议的头部(配置了相同VNI的node,就能进行互联)。封装后的包源IP为源node的IP,目标IP为对端node的IP,这个包可以直接经过node的网络到达对端。 如下图: 云厂商的vpc backends, flannel支持了aliVPC、gce、aws等云厂商的vpc网络。原理都是一样的,就是当flanneld在某云厂商的机器上运行时,根据机器自身的vpc网络IP,和flanneld分配在该机器上的cidr,调用云厂商的api创建对应的自定义路由。 flannel的部署非常简单,可以直接参考官方提供的模板 . 版本选择上,v0.10.0以后的版本均可,但还是建议使用最新版本。 flannel要求用户对集群的网段做好提前规划,否则,后续扩展会变得麻烦。在官方文档中,提供了一个范例: ``` { "Network": "10.0.0.0/8", "SubnetLen": 20, "SubnetMin": "10.10.0.0", "SubnetMax": "10.99.0.0", "Backend": { "Type": "udp", "Port": 7890 } } ``` 我们建议,用户可以在部署集群时设置整个集群pod的网段为一个/16(这样集群能支持6w多个IP),SubnetLen决定了每个node的网段多大,我们建议设置为24(这样每个node可以分配256个IP,集群能支持256个node,理论上是绝对够的)。 用户可以基于自己预期的集群规模,在集群部署之初提出需求。 注意这个配置无法在集群交付后再做修改。 --- Flannel是cereos开源的CNI网络插件,下图flannel官网提供的一个数据包经过封包、传输以及拆包的示意图,从这个图片中可以看出两台机器的docker0分别处于不同的段:10.1.20.1/24 和 10.1.15.1/24 ,如果从Web App Frontend1 pod(10.1.15.2)去连接另一台主机上的Backend Service2 pod(10.1.20.3),网络包从宿主机192.168.0.100发往192.168.0.200,内层容器的数据包被封装到宿主机的UDP里面,并且在外层包装了宿主机的IP和mac地址。这就是一个经典的overlay网络,因为容器的IP是一个内部IP,无法从跨宿主机通信,所以容器的网络互通,需要承载到宿主机的网络之上。 flannel支持多种网络模式,常用的是vxlan、UDP、hostgw、ipip以及gce和阿里云等,vxlan和UDP的区别是:vxlan是内核封包,而UDP是flanneld用户态程序封包,所以UDP的方式性能会稍差;hostgw模式是一种主机网关模式,容器到另外一个主机上容器的网关设置成所在主机的网卡地址,这个和calico非常相似,只不过calico是通过BGP声明,而hostgw是通过中心的etcd分发,所以hostgw是直连模式,不需要通过overlay封包和拆包,性能比较高,但hostgw模式最大的缺点是必须是在一个二层网络中,毕竟下一跳的路由需要在邻居表中,否则无法通行。 在实际的生产环境中,最常用的还是vxlan模式,我们先看工作原理,然后通过源码解析实现过程。