文章目录
前言
flannel是专为容器设计的虚拟网络层。由CoreOS开源的针对k8s的网络服务,其目的为解决k8s集群中各主机上的pod相互通信的问题,其借助于etcd维护网络IP地址分配,并为每一个node服务器分配一个不同的IP地址段。
工作原理
在host-gw模式下运行flannel,它将路由从容器映射到容器。网络中的每个主机都运行一个名为 flanneld的代理,它负责:
在每台主机上管理唯一的子网
将IP地址分配给其主机上的每个容器
将路由从一个容器映射到另一个容器,即使在不同的主机上
每个flannel代理将这些信息提供给一个集中的etcd存储,以便主机上的其他代理可以将数据包路由到 flannel网络中的其他容器。

节点1将包含以下路由:
default via 192.168.0.100 dev eth0 proto static metric 100
10.1.15.0/24 dev docker0 proto kernel scope link src 10.1.15.1
10.1.20.0/24 via 192.168.0.200 dev eth0
节点2将包含以下路由:
default via 192.168.0.200 dev eth0 proto static metric 100
10.1.20.0/24 dev docker0 proto kernel scope link src 10.1.20.1
10.1.15.0/24 via 192.168.0.100 dev eth0
网络模式
Flannel 网络模型 (后端模型),Flannel目前有三种方式实现 UDP/VXLAN/host-gw:
UDP:早期版本的Flannel使用UDP封装完成报文的跨越主机转发,其安全性及性能略有不足。
VXLAN:Linux 内核在在2012年底的v3.7.0之后加入了VXLAN协议支持,因此新版本的Flannel也有UDP转换为VXLAN,VXLAN本质上是一种tunnel(隧道)协议,用来基于3层网络实现虚拟的2层网络,目前flannel 的网络模型已经是基于VXLAN的叠加(覆盖)网络,目前推荐使用vxlan作为其网络模型。
Host-gw:也就是Host GateWay,通过在node节点上创建到达各目标容器地址的路由表而完成报文的转发,因此这种方式要求各node节点本身必须处于同一个局域网(二层网络)中,因此不适用于网络变动频繁或比较大型的网络环境,但是其性能较好。
Flannel 组件
Cni0:网桥设备,每创建一个pod都会创建一对 veth pair,其中一端是pod中的eth0,另一端是Cni0网桥中的端口(网卡),Pod中从网卡eth0发出的流量都会发送到Cni0网桥设备的端口(网卡)上,Cni0 设备获得的ip地址是该节点分配到的网段的第一个地址。
Flannel.1: overlay网络的设备,用来进行vxlan报文的处理(封包和解包),不同node之间的pod数据流量都从overlay设备以隧道的形式发送到对端。
网络转发

- VETP:这是vxlan中最重要的部分,他负责拆包和封包。
- VNI:类似于vlan,每个vlan都有一个ID。每个vxlan也需要有个ID进行标识。
- 隧道:这是一个虚拟概念,实际上并没有一个设备对于这个概念,隧道屏蔽了底层的网络,通信双方都以为自己和对方直接通信。
上图所示为 VXLAN 的工作模型,它创建在原来的 IP 网络(三层)上,只要是三层可达(能够通过 IP 相互通信)的网络就能部署 VXLAN。在 VXLAN 网络的每个端点都有一个 VTEP 设备,负责 VXLAN 协议报文的解包和封包,也就是在虚拟报文上封装 VTEP 通信的报文头部。
物理网络上可以创建多个 VXLAN 网络,可以将这些 VXLAN 网络看成一个隧道,不同节点上的虚拟机/容器能够通过隧道直连。通过 VNI 标识不同的 VXLAN 网络,使得不同的 VXLAN 可以相互隔离。