Edge Pod Network
如果我们使用flannel作为CNI插件,且后端为VXLAN模式。在节点上会创建一个VTEP设备(通常命名为”: flannel.1),同时VNI和VTEP的信息会被记录到节点的annotations中,供其它节点创建相应的路由和转发规则。
- node2创建flannel.1设备,MAC地址为”9e:c9:07:f9:b3:8b”,IP地址为”172.30.133.0”,那么node2的annotations中有如下记录。
- node1 将使用node2的这些信息,在主机上配置fdb、arp以及路由信息
fdb: 9e:c9:07:f9:b3:8b dev flannel.1 dst 10.0.0.20 self permanent
arp: ? (172.30.133.0) at 9e:c9:07:f9:b3:8b [ether] PERM on flannel.1
每当node2重启之后,flannel会重新创建VTEP设备,VTEP的MAC地址也发生变化,并更新到node2的annotations中。然而,如果此时node2或者node1与云端的网络断开,node1将不能感知到node2的MAC地址的变化,这将导致node1与node2上的Pod无法正常通信。
每次节点重启时,flannel优先读取本节点annotations中MAC地址信息(从apiserver或者yurt-hub的本地缓存中读取),如果存在则使用这个MAC地址作为VTEP的MAC地址。 为了实现这个能力,需要对flannel的代码做改动,参考如下:
$ ls /var/lib/cni/networks/cbr0
172.30.132.194 172.30.132.198 172.30.132.201
当云边断网时,Pod重启会导致host-local重新分配IP地址,且Pod IP地址的变化无法同步到云端,其它边缘节点上的kube-proxy等组件无法感知到Pod IP的变化,则无法使用Cluster IP地址访问业务Pod。
为了解决这个问题,需要调整host-local的代码:记录IP地址的格式为{ip}-{pod namespace}-{pod name}。当pod重启时,host-local将优先使用记录中同名Pod的IP地址。 调整后的已分配的Pod IP记录如下:
cd plugins;
git reset --hard 9ebe139e77e82afb122e335328007bca86905ae4;
flannel调整之后,需要在原有的RBAC之后,提供 “get node”的权限。参考: