在开发一个 CNI(Container Network Interface)插件 时,一般需要定义几个关键配置文件,它们共同决定插件的行为、网络配置方式、以及与 Kubernetes 的集成。
一、CNI 网络配置文件
位置:
通常位于/etc/cni/net.d/目录下(可以通过 kubelet 参数--cni-conf-dir修改)。文件名:
一般以.conf、.conflist结尾,例如:1 2/etc/cni/net.d/10-myplugin.conf /etc/cni/net.d/10-myplugin.conflist内容:
JSON 格式,描述网络的类型、IPAM 配置、路由等。
示例:10-simplecni.conf
| |
其中:
type:对应你编译出的插件二进制名,比如/opt/cni/bin/simple-cni。ipam:IP 地址分配方式。可以是host-local、dhcp或你自己实现的插件。.conflist文件可以包含多个 CNI 插件链,用于组合执行(比如 Flannel + Portmap)。
二、CNI 插件的内部配置文件(插件自定义)
除了标准 CNI 配置外,大多数插件都会定义自己独立的配置文件目录,用来保存运行时信息或持久化状态。
常见位置:
| |
常用来存储分配的 IP、子网、网卡信息等。例如:
| |
示例:/var/lib/simple-cni/subnets.json
| |
这个文件在 Flannel、Calico、Canal 等插件中都有类似形式(比如 /run/flannel/subnet.env)。
三、Kubernetes 集成相关配置文件
3.1 CNI 插件二进制路径
路径:
| |
- kubelet 启动参数
--cni-bin-dir控制路径。
例如:
| |
3.2 Kubernetes 节点配置(可选)
某些插件(如 Flannel、Calico)会依赖 Kubernetes 中的 ConfigMap 来传递配置,比如:
| |
插件的安装 DaemonSet 会在容器启动时将该配置写入 /etc/cni/net.d/。
总结
| 类型 | 文件路径 | 作用 | 由谁提供/管理 |
|---|---|---|---|
| CNI 网络配置 | /etc/cni/net.d/*.conf | 定义 CNI 网络行为、插件类型 | 管理员 / DaemonSet |
| 插件二进制 | /opt/cni/bin/* | 可执行插件程序 | 插件安装程序 |
| 状态文件 | /var/lib/<plugin>/... | 存储分配信息、缓存 | 插件自身 |
| 动态配置(可选) | /run/<plugin>/... | 运行时信息(如 Socket、Lock) | 插件自身 |
| K8s ConfigMap(可选) | - | 集群范围配置同步 | 插件控制器 / DaemonSet |
几个配置文件为什么要放不同的目录下:
启动阶段(配置加载)
插件从
/etc/cni/net.d/读取网络配置(例如网段、路由方式等)。运行阶段(状态生成)
插件运行时,会在
/run/simple-cni/写入当前节点或进程级的运行时状态,如:- 当前分配的子网(subnets.json);
- 其他节点同步信息。
这些数据是临时的,重启后可重新计算。子网并不是一成不变的,可能节点重启后或者网络分配时会改变,所以不应该放在
/var/lib/下持久化。分配阶段(状态持久化)
插件每当分配一个 IP,会在
/var/lib/cni/networks/<netname>/中持久化:- 哪个容器用了哪个 IP;
- 最后一个分配的地址(用于下次递增)。
这些数据必须持久化,否则重启后会出现 IP 重复分配冲突。