14. 使用vxlan设备封包@flannel
introduction
在我们讨论如何在 flannel 中使用 vxlan 之前, 简单回顾一下 vxlan 网络中有哪些难点: vxlan 是一个多出口的大隧道, 同一个 vxlan 中不同的宿主机通过不同的 vni 鉴别彼此 , 因为没有 tun 所以不会内核态/用户态切换, 所有的包装工作都是 vtep 在内核态中完成的, 因为是 Linux 原生支持的, 所以即使做了相同的工作也不会产生态的切换, 为了使 vxlan 消息发出我们需要知道对方容器的 mac 地址以及宿主机的 ip 地址, 衍生出了arp表以及fdb表用于完成这个任务
一次跨宿主机的通讯过程如下
同udp模式, 这个包会先发送到 cni0 网桥上, 并根据宿主机A的路由表转发到 flannel.1手上
Flannel.1是一个 vtep, 开始封包, 首先通过etcd得知容器B属于宿主机B, 然后查出宿主机B的IP地址, 有了IP地址以后我们需要宿主机B - vtep的mac地址(你其实可以通过多播查) , 但实际上我们是查表的, 这个表是通过Watch Api Server得到的, 至此封包完成, 我们都还一直在内核态里
flannel.1 经过查表发现这个包应该从 eth0 接口发出. 到达宿主机B的8472端口(flannel.1监听中) , 这个包于是被宿主机B的 flannel.1 (vtep) 拿到
flannel.1 拆包后发现内层ip里写着容器B的ip, 经过检查宿主机B的路由表以后, flannel.1 把这个包丢给 cni0 网桥
cni0 网桥把这个包给容器B 完成通信
vxlan里面那些问题是怎么被搞定的
无论如何, vxlan里面都存在一些比较棘手的问题, 这些问题在 flannel中是怎么搞定的? flannel 相比于裸的vxlan 网络一个最大的特点在于, 我们能通过watch etcd知道现在有哪些节点加入网络了, 这允许我们主动的去添加arp/fdb 等等所有需要的信息. 而不需要多播等vxlan中比较原始的手 .
另一个比较confusing的问题在于fdb到底是干什么的?
我们在裸 vxlan 中学过, 在fdb这一层里, vtep通过容器mac, 查询对端宿主机ip, 接着通过多播查询对端宿主机mac, 这样我们就有 vtep 封装出来的外层所有必要消息了(ip+mac)
但是在 flannel 中, 我们又有了一种新的做法, 就是fdb表中又存上了对端vtep的mac地址+ip地址, 这里真的很tricky的点在于, 最新版的flannel 这下把宿主机的信息也全都存上了, 这样可以避免一次多播查mac地址
想不明白, 先放这儿吧, 蛋疼
Last updated
Was this helpful?