🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ### **数据平面** ![](https://img.kancloud.cn/0f/7c/0f7c49caedf6142c018c5a17eb97cfdc_733x422.png) 1、容器中有两个网卡,eth0是主机物理网卡ens33的一个ipvlan子设备,eth1与主机上的flatxxxx互为veth-pair 2、容器里的eth0有IP,eth1无IP 3、主机上的flatxxxx的IP都是ens33的IP ### **流程说明** 1、当安装高可用的K8S集群时,Keepalived还是把VIP绑定到ens33上,所以容器与VIP是无法进行通信的 2、网络插件flat-plugin负责设置容器的两个网卡及容器与主机上的路由 ### **StaticIP设计** 首先,只有StatefulSet的Pod支持StaticIP,单独的Pod及其他工作负载的Pod不支持StaticIP。 在创建StatefulSet时,可以在Pod中添加Annotation `staticip: "true"`,如下: ``` apiVersion: apps/v1 kind: StatefulSet metadata: name: xxx spec: replicas: 2 selector: matchLabels: xxx template: metadata: annotations: staticip: "true" ``` 如果Pod是第一次创建,那么flat-ipam随机给它分配一个IP,并且将这个IP与Pod的对象关系记录下来。 只有当StatefulSet被删除时,它的Pod的静态IP才会被释放。如果只是对StatefulSet进行缩容或者对它的Pod进行重启,那么静态IP是不会被释放的。 ### **模块** 根据上面的流程及StaticIP的设计,网络插件总共分为三个模块 * flat-plugin:负责设置Pod的网络,基于开源的ipvlan与ptp或进行改造 * flat-ipam:负责IP的分配,以及staticIP的分配 * flat-staticip-recycle:负责监听statefulset,回收staticip ### **CNI接口** `/etc/cni/net.d/flatcni.conflist`文件内容如下: ``` { "name": "k8s-pod-network", "cniVersion": "1.0.0", "plugins": [ { "type": "flat-plugin", "master": "ens33", "secondifacename": "eth1", "ipam": { "type": "flat-ipam" }, "kubeconfig": "/etc/cni/net.d/flatcni-kubeconfig" } ] } ``` CRI传给flat-plugin以及flat-plugin传给flat-ipam的参数如下: ``` { "name": "k8s-pod-network", "cniVersion": "1.0.0", "type": "flat-plugin", "master": "ens33", "secondifacename": "eth1", "ipam": { "type": "flat-ipam" }, "kubeconfig": "/etc/cni/net.d/flatcni-kubeconfig" } ``` flat-ipam的返回如下: ``` { "cniVersion": "1.0.0", "ips": [ { "address": "192.168.92.xxx/24", } ], "routes": [ { "dst": "0.0.0.0/0", "gw": "192.168.92.254" } ] } ``` flat-pluing返回给cri的结果如下: ``` { "cniVersion": "1.0.0", "interfaces": [ { "name": "eth0", "mac": "xx:xx:xx:xx:xx:xx", "sandbox": "/var/run/netns/xxx" }, { "name": "eth1", "mac": "xx:xx:xx:xx:xx:xx", "sandbox": "/var/run/netns/xxx" }, { "name": "flatxxxxxx", "mac": "ab:cd:ef:11:22:33" } ], "ips": [ { "address": "192.168.92.xx/24", "interface": 0 # 代表上面的interfaces[0],即eth0 } ], "routes": [ { "dst": "0.0.0.0/0", "gw": "192.168.92.254" } ] } ``` ### **FAQ** **Q:flat-plugin为什么基于ipvlan+ptp进行改造,而不是在`/etc/cni/net.d/flatcni.conflist`中直接在plugins中使用ipvlan+ptp?** A:因为从ptp的源码看,它不能从PreResult中获取已分配的IP地址;它必须指定IPAM分配IP。简单说,就是ptp是不能作为第二个plugin。 ****Q:Pod的双网卡名称eth0和eth1如何获取?**** A:eth0由cri传入,eth1在install-cni镜像通过环境变量配置,然后由install-cni配置到flatcni.conflist中指定