前言:Flannel是 CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(Overlay Network)工具,其目的在于帮助每一个使用 Kuberentes 的 CoreOS 主机拥有一个完整的子网
- 在之前已经部署完etcd群集,下面将基于前面的操作,部署Flannel,使不同的节点主机创建的docker容器实现互连互通
一、概述
1.Flannel简介
- Flannel 是由 CoreOS 维护的一个虚拟网络方案。CoreOS团队针对Kubernetes设计的一个网络规划服务,目前是kubernetes默认的网络,它由golang编写
- Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得“同属一个内网”且”不重复的”IP地址,并让属于不同节点上的容器能够直接通过内网IP通信
- 简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址
- 这里不得不提一下kubernetes网络约束:
- 所有容器之间都可以无须SNAT即可相互直接以IP通信
- 所有主机与容器之间都可以无须SNAT即可相互直接以IP通信
- 容器看到的自身IP与其他容器看到的容器IP相同
- flannel的网络就符合这三点约束
- 容器跨宿主机网络是无法联通,需要一些技术如vxlan、端口映射、SDN等
2.Flannel工作原理
- Flannel实质上是一种“覆盖网络(overlay network)”,也就是将TCP数据包装在另一种网络包里面进行路由转发和通信,目前已经支持UDP、VxLAN、AWS VPC和GCE路由等数据转发方式
- 默认的节点间数据通信方式是UDP转发
- 数据从源容器中发出后,经由所在主机的docker0虚拟网卡转发到flannel0虚拟网卡,这是个P2P的虚拟网卡,flanneld服务监听在网卡的另外一端
- Flannel通过Etcd服务维护了一张节点间的路由表,详细记录了各节点子网网段
- 源主机的flanneld服务将原本的数据内容UDP封装后根据自己的路由表投递给目的节点的flanneld服务,数据到达以后被解包,然后直接进入目的节点的flannel0虚拟网卡,然后被转发到目的主机的docker0虚拟网卡,最后就像本机容器通信一下的有docker0路由到达目标容器