Kubernetes 中的 CNI 是什么?

在 Kubernetes 中,CNI(Container Network Interface)是容器网络接口标准。它定义了容器运行时与CNI插件之间的接口协议,用于配置容器网络。

CNI的主要功能是:

  • 为容器配置网络:为容器分配 IP、配置路由、DNS 等。
  • 支持多种网络方案:允许同时使用多种 CNI 插件,为不同容器选择不同的网络。
  • 一致的接口:CNI 插件实现统一的接口,使其可以在不同的容器运行时中使用。

CNI 插件包含两部分:

  • CNI 插件二进制文件:由各个 CNI 插件提供,用于配置网络,包含在PATH中,命名格式为cni-plugin-name
  • CNI 网络配置文件:描述要为容器配置什么样的网络,包含插件名称、参数等,通常命名为10-cni.conf

CNI 的工作流程是:

  1. 容器运行时(如 Docker)在创建容器时查找 CNI 网络配置文件,获得要使用的 CNI 插件与配置。
  2. 运行时执行该 CNI 插件对应的二进制文件,传入容器 ID、网络配置等参数。
  3. CNI 插件根据配置为容器分配 IP、配置路由、DNS 等,设置容器网络。
  4. CNI 插件返回容器的网络配置给容器运行时。
  5. 运行时将配置注入到容器,完成容器启动。

以 Docker 为例,整个 CNI 过程是:

  1. Docker 根据 CNI 网络配置文件,得知要为容器 使用 CNI 插件 “bridge” 配置网络。
  2. Docker 执行 CNI bridge 插件的二进制文件,传入容器 ID 与网桥名字参数。
  3. bridge 插件为容器分配 IP、配置路由等,完成容器网络设置。
  4. bridge 插件返回容器的 IP 与网络配置给 Docker。
  5. Docker 将配置写入容器并启动,网络就绪。

一个简单的 CNI 网络配置文件如下:

json
{
  "cniVersion": "0.4.0",
  "name": "mynet",
  "plugins": [
    {
      "type": "bridge",
      "bridge": "mynet0",
      "ipMasq": true,
      "ipam": {
        "type": "host-local",
        "subnet": "10.10.0.0/16"
      }
    }
  ] 
}

这个配置使用 CNI bridge 插件配置名为 “mynet0” 的网桥,为容器分配 “10.10.0.0/16” 子网内的 IP。

所以总结来说,CNI 的主要作用是:

  1. 标准化容器网络接口,使容器运行时可以选择不同的网络方案。
  2. 支持多种网络插件,为不同容器选择不同网络配置。
  3. CNI 插件负责为容器配置网络,包括分配 IP、配置路由等。
  4. 插件与配置分离,使其能够在不同的容器运行时使用。

它定义了容器运行时(如 Docker)与 CNI 插件之间的接口,包含:

  1. CNI 网络配置文件:描述要使用的 CNI 插件与配置。
  2. CNI 插件二进制文件:由插件提供,用于配置网络。