在开发一个CNI插件时需要定义的几个配置文件

在开发一个 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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
{
  "cniVersion": "0.4.0",
  "name": "simple-network",
  "type": "simple-cni",
  "ipam": {
    "type": "host-local",
    "subnet": "10.10.0.0/16",
    "rangeStart": "10.10.0.10",
    "rangeEnd": "10.10.255.254",
    "routes": [
      { "dst": "0.0.0.0/0" }
    ],
    "gateway": "10.10.0.1"
  }
}

其中:

  • type:对应你编译出的插件二进制名,比如 /opt/cni/bin/simple-cni
  • ipam:IP 地址分配方式。可以是 host-localdhcp 或你自己实现的插件。
  • .conflist 文件可以包含多个 CNI 插件链,用于组合执行(比如 Flannel + Portmap)。

二、CNI 插件的内部配置文件(插件自定义)

除了标准 CNI 配置外,大多数插件都会定义自己独立的配置文件目录,用来保存运行时信息或持久化状态

常见位置:

1
/var/lib/simple-cni/

常用来存储分配的 IP、子网、网卡信息等。例如:

1
2
/var/lib/simple-cni/subnets.json
/var/lib/simple-cni/allocations.json

示例:/var/lib/simple-cni/subnets.json

1
2
3
4
5
6
7
8
9
{
  "subnets": [
    {
      "name": "default",
      "range": "10.10.0.0/16",
      "allocated": ["10.10.0.10", "10.10.0.11"]
    }
  ]
}

这个文件在 Flannel、Calico、Canal 等插件中都有类似形式(比如 /run/flannel/subnet.env)。

三、Kubernetes 集成相关配置文件

3.1 CNI 插件二进制路径

路径:

1
/opt/cni/bin/
  • kubelet 启动参数 --cni-bin-dir 控制路径。

例如:

1
2
3
/opt/cni/bin/simple-cni
/opt/cni/bin/host-local
/opt/cni/bin/loopback

3.2 Kubernetes 节点配置(可选)

某些插件(如 Flannel、Calico)会依赖 Kubernetes 中的 ConfigMap 来传递配置,比如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
apiVersion: v1
kind: ConfigMap
metadata:
  name: simple-cni-config
  namespace: kube-system
data:
  cni-conf.json: |
    {
      "name": "simple-network",
      "type": "simple-cni",
      "ipam": {
        "type": "simple-ipam",
        "subnet": "10.10.0.0/16"
      }
    }

插件的安装 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

几个配置文件为什么要放不同的目录下:

  1. 启动阶段(配置加载)

    插件从 /etc/cni/net.d/ 读取网络配置(例如网段、路由方式等)。

  2. 运行阶段(状态生成)

    插件运行时,会在 /run/simple-cni/ 写入当前节点或进程级的运行时状态,如:

    • 当前分配的子网(subnets.json);
    • 其他节点同步信息。

    这些数据是临时的,重启后可重新计算。子网并不是一成不变的,可能节点重启后或者网络分配时会改变,所以不应该放在 /var/lib/ 下持久化。

  3. 分配阶段(状态持久化)

    插件每当分配一个 IP,会在 /var/lib/cni/networks/<netname>/ 中持久化:

    • 哪个容器用了哪个 IP;
    • 最后一个分配的地址(用于下次递增)。

    这些数据必须持久化,否则重启后会出现 IP 重复分配冲突。

Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计