多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ### **网络配置文件** 网络配置文件说的就是`/etc/cni/net.d/`目录下的配置文件的格式,详细的字段可以查阅文末的参考文献。以下为一个示例(**需要特别注意的是,该文件的后缀一定要为`.conflist`,实验中发现如果后缀为`.conf`,runtime会以pluginConf去解析该文件内容)** ``` { "cniVersion": "1.0.0", # required "name": "mynet", # required "disableCheck": false, # optional, default "false" "plugins": [ # required { "type": "myplugin", # required "myplugin-key1": "value", # myplugin所需要的参数 "capabilities": {}, # optional, dictionary "ipMasq": false, # optional, 当myplugin支持ipMasq时才需要设置 "dns": { # optional "nameservers": ["114.114.114.114"], "search": ["cn"], "options": ["ndots:5"] }, "ipam": { # optional,一般都需会设置 "type": "myipam", # required "myipam-key1": "value" # myipam所需要的参数 } } ] } ``` ### **ADD** ##### **CRI调用Plugin** 调用命令如下: ``` $ CNI_COMMAND="ADD" CNI_CONTAINERID="<containerid>" CNI_NETNS="<netns>" CNI_IFNAME="eth0" CNI_PATH="/opt/cni/bin" /opt/cni/bin/myplugin < myplugin.conf ``` myplugin.conf文件内容如下,在上面的myplugin配置的基础上,增加和删除了一些字段。增加的字段有`cniVersion`、`name`,删除的字段有`capabilities`,参考[此处](https://www.cni.dev/docs/spec/#deriving-execution-configuration-from-plugin-configuration): ``` { "cniVersion": "1.0.0", "name": "mynet", "type": "myplugin", "myplugin-key1": "value", "dns": { "nameservers": ["114.114.114.114"], "search": ["cn"], "options": ["ndots:5"] }, "ipMasq": false, "ipam": { "type": "myipam", "myipam-key1": "value" } } ``` ##### **Plugin调用IPAM** plugin在调用ipam时,环境变量和配置文件是一模一样的(已使用shell脚本模拟ipam验证),如下: ``` $ CNI_COMMAND="ADD" CNI_CONTAINERID="<containerid>" CNI_NETNS="<netns>" CNI_IFNAME="eth0" CNI_PATH="/opt/cni/bin" /opt/cni/bin/myipam < myplugin.conf ``` ##### **返回** 当ipam调用成功后,应该返回0,然后把结果输出到stdout中,json如下(带有空白符): ``` { "cniVersion": "1.0.0", # required "ips": [ # required { "address": "192.168.1.3/24", # required "gateway": "192.168.1.1/24" # optional } ], "routes": [ # optinal { "dst": "0.0.0.0/0", # required "gw": "x.x.x.x" # optinal, 如果为空,则使用ips[]当中的gateway } ], "dns": { "nameservers": ["114.114.114.114"], "search": ["cn"], "options": ["ndots:5"] } } ``` 接着plugin会设置容器的网络,然后返回0,并把结果输出到stdout中,json如下(相比ipam的输出,多了interfaces字段,以及ips当中的interface字段): ``` { "cniVersion": "1.0.0", "interfaces": [ { "name": "eth0", "mac": "xx:xx:xx:xx:xx:xx", "sandbox": "/var/run/netns/pod1" # interface所在的网络命名空间,空则表示在主机网络命名空间 }, { "name": "vethxxxxxx", "mac": "ab:cd:ef:11:22:33" } ], "ips": [ { "address": "192.168.1.3/24", "gateway": "x.x.x.x", "interface": 0 # 该IP应该设置在哪个interface上,0表示应该设置在上面的interfaces[0]网卡上 } ], "routes": [ { "dst": "x.x.x.x/xx", "gw": "x.x.x.x" } ], "dns": { "nameservers": ["114.114.114.114"], "search": ["cn"], "options": ["ndots:5"] } } ``` ### **CHECK** ##### **CRI调用Plugin** 首先,环境变量和ADD操作一样(除了`CNI_COMMAND`),标准输入参数和ADD操作一样(除了多了prevResult字段,该字段的值就是上面plugin的返回),调用如下: ``` $ CNI_COMMAND="CHECK" CNI_CONTAINERID="<containerid>" CNI_NETNS="<netns>" CNI_IFNAME="eth0" CNI_PATH="/opt/cni/bin" /opt/cni/bin/myplugin < myplugin.conf ``` myplugin.conf的内容如下: ``` { "cniVersion": "1.0.0", "name": "mynet", "type": "myplugin", "myplugin-key1": "value", "dns": { "nameservers": ["114.114.114.114"], "search": ["cn"], "options": ["ndots:5"] }, "ipMasq": false, "ipam": { "type": "myipam", "myipam-key1": "value" }, "prevResult": { "interfaces": [ { "name": "eth0", "mac": "xx:xx:xx:xx:xx:xx", "sandbox": "/var/run/netns/pod1" }, { "name": "vethxxxxxx", "mac": "ab:cd:ef:11:22:33" } ], "ips": [ { "address": "192.168.1.3/24", "gateway": "x.x.x.x", "interface": "eth0" } ], "routes": [ { "dst": "x.x.x.x/xx", "gw": "x.x.x.x" } ], "dns": { "nameservers": ["114.114.114.114"], "search": ["cn"], "options": ["ndots:5"] } } } ``` ##### **Plugin调用IPAM** 调用命令如下(标准输入中已经有iface等信息,还需要`CNI_IFNAME`等参数吗?待验证): ``` $ CNI_COMMAND="CHECK" CNI_CONTAINERID="<containerid>" CNI_NETNS="<netns>" CNI_IFNAME="eth0" CNI_PATH="/opt/cni/bin" /opt/cni/bin/myipam < myipam.conf ``` 标准输入参数myipam.conf和上面的myplugin.conf是一模一样的(**待验证**)。 ##### **返回** 如果IPAM插件CHECK正常,则应该返回0,无须往STDOUT中打印任何信息;然后Plugin再CHECK,如果也检查正常,则返回0,无须往STDOUT中打印任何信息。 ### **DELETE** ##### **CRI调用Plugin** 调用如下: ``` $ CNI_COMMAND="DELETE" CNI_CONTAINERID="<containerid>" CNI_NETNS="<netns>" CNI_IFNAME="eth0" CNI_PATH="/opt/cni/bin" /opt/cni/bin/myplugin < myplugin.conf ``` 标准输入myplugin.conf与CHECK操作的标准输入是一样的 ##### **Plugin调用IPAM** 调用如下: ``` $ CNI_COMMAND="DELETE" CNI_CONTAINERID="<containerid>" CNI_NETNS="<netns>" CNI_IFNAME="eth0" CNI_PATH="/opt/cni/bin" /opt/cni/bin/myipam < myipam.conf ``` 标准输入myipam.conf与CHECK操作的标准输入是一样的 ##### **返回** 返回的规则与CHECK是一样的 ### **参考文献** * https://www.cni.dev * https://github.com/containernetworking/cni