Flannel是kubernetes的网络插件之一,通过构建k8s集群节点之间的overlay网络,实现跨节点通信等功能。flannel常用的网络转发模式有hostgw、udp、vxlan等,在实际生产中常用的是vxlan模式。
子网划分
k8s会为每个集群节点划分子网,这样pod调度到某节点时,就会按照该节点的子网网段分配ip,保障pod ip的集群唯一性。
我们可以查看/run/flannel/subnet.env 文件,里面主要包括当前节点的子网信息。例如本机集群192.168.249.10节点子网网段是10.244.0.0/24,192.168.249.12节点子网网段是10.244.1.0/24
Flannel通过daemonset的方式在每个k8s节点上运行了一个flanneld的服务,通过flanneld进程对节点进行创建隧道,添加路由信息,修改iptables等操作。
跨节点Pod通信
我们以vxlan模式为例看一下flannel如何实现的pod间的通信。
Flannel创建名为flannel.1的vxlan设备(nolearning),设备ip是子网的第一个IP 10.244.1.0,并把设备的mac和ip和本节点的ip记录到etcd中。还会创建名为cni0的网桥,网桥的ip是子网的第二个ip 10.244.1.1,起到docker0网桥的作用。