边缘Pod网络

    如果我们使用flannel作为CNI插件,且后端为VXLAN模式。在节点上会创建一个VTEP设备(通常命名为”: flannel.1),同时VNI和VTEP的信息会被记录到节点的annotations中,供其它节点创建相应的路由和转发规则。

    Flannel的架构如图所示,我们用两个边缘节点来举例说明:

    • node2创建flannel.1设备,MAC地址为”9e:c9:07:f9:b3:8b”,IP地址为”172.30.133.0”,那么node2的annotations中有如下记录。
    • node1 将使用node2的这些信息,在主机上配置fdb、arp以及路由信息
    1. fdb: 9e:c9:07:f9:b3:8b dev flannel.1 dst 10.0.0.20 self permanent
    2. arp: ? (172.30.133.0) at 9e:c9:07:f9:b3:8b [ether] PERM on flannel.1
    3. route: 172.30.133.0/26 via 172.30.133.0 dev flannel.1 onlink

    每次节点重启时,flannel优先读取本节点annotations中MAC地址信息(从apiserver或者yurt-hub的本地缓存中读取),如果存在则使用这个MAC地址作为VTEP的MAC地址。 为了实现这个能力,需要对flannel的代码做改动,参考如下:

    改动之后 flannel 的镜像位置:

    • Dockerhub 镜像地址: docker.io/openyurt/flannel-edge:v0.14.0-1

    在大多数场景中,使用host-local为Pod分配IP地址。host-local从nodecidr中选择空闲的IP地址分配给新的Pod,并将已分配的IP地址信息记录在本地文件中。 例如,如果IPAM的数据目录为/var/lib/cni/networks/cbr0, 它的记录信息如下:

    1. $ ls /var/lib/cni/networks/cbr0
    2. 172.30.132.194 172.30.132.198 172.30.132.201

    为了解决这个问题,需要调整host-local的代码:记录IP地址的格式为{ip}-{pod namespace}-{pod name}。当pod重启时,host-local将优先使用记录中同名Pod的IP地址。 调整后的已分配的Pod IP记录如下:

    host-local的代码修改参考:

    1. git clone https://github.com/containernetworking/plugins.git ;
    2. cd plugins;
    3. git reset --hard 9ebe139e77e82afb122e335328007bca86905ae4;
    4. wget https://raw.githubusercontent.com/openyurtio/openyurt/master/docs/tutorial/0002-ipam-keep-pod-ip.patch;

    使用 rpm 更新修改后的 host-local cni:

    1. kind: ClusterRole
    2. apiVersion: rbac.authorization.k8s.io/v1beta1
    3. metadata:
    4. name: flannel
    5. rules:
    6. - apiGroups:
    7. - ""
    8. resources:
    9. verbs:
    10. - get
    11. - ""
    12. resources:
    13. - nodes
    14. verbs:
    15. + - get
    16. - list
    17. - watch
    18. - apiGroups:
    19. - ""
    20. resources:
    21. - nodes/status