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模式,我们先看工作原理,然后通过源码解析实现过程。
安装的过程非常简单,主要分为两步:
第一步安装flannel,
yum install flannel 或者通过kubernetes的daemonset方式启动,配置flannel用的etcd地址
第二步是配置集群网络,
curl -L http://etcdurl:2379/v2/keys/flannel/network/config -XPUT -d value="
{
\"Network\":\"172.16.0.0/16\",\"SubnetLen\":24,\"Backend\":
{
\"Type\":\"vxlan\",\"VNI\":1
}
}"
然后启动每个节点的flanned程序。
工作原理:
1、容器的地址如何分配:
Docker容器启动时候通过docker0分配IP地址,flannel为每个机器分配一个IP段,配置在docker0上面,容器启动后就在本段内选择一个未占用的IP,那么flannel如何修改docker0网段的呢?
先看一下 flannel的启动文件 /usr/lib/systemd/system/flanneld.service
[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/flanneld
ExecStart=/usr/bin/flanneld