在 Kubernetes 中,CNI(Container Network Interface)是容器网络接口标准。它定义了容器运行时与CNI插件之间的接口协议,用于配置容器网络。
CNI的主要功能是:
- 为容器配置网络:为容器分配 IP、配置路由、DNS 等。
- 支持多种网络方案:允许同时使用多种 CNI 插件,为不同容器选择不同的网络。
- 一致的接口:CNI 插件实现统一的接口,使其可以在不同的容器运行时中使用。
CNI 插件包含两部分:
- CNI 插件二进制文件:由各个 CNI 插件提供,用于配置网络,包含在PATH中,命名格式为
cni-plugin-name
。 - CNI 网络配置文件:描述要为容器配置什么样的网络,包含插件名称、参数等,通常命名为
10-cni.conf
。
CNI 的工作流程是:
- 容器运行时(如 Docker)在创建容器时查找 CNI 网络配置文件,获得要使用的 CNI 插件与配置。
- 运行时执行该 CNI 插件对应的二进制文件,传入容器 ID、网络配置等参数。
- CNI 插件根据配置为容器分配 IP、配置路由、DNS 等,设置容器网络。
- CNI 插件返回容器的网络配置给容器运行时。
- 运行时将配置注入到容器,完成容器启动。
以 Docker 为例,整个 CNI 过程是:
- Docker 根据 CNI 网络配置文件,得知要为容器 使用 CNI 插件 “bridge” 配置网络。
- Docker 执行 CNI bridge 插件的二进制文件,传入容器 ID 与网桥名字参数。
- bridge 插件为容器分配 IP、配置路由等,完成容器网络设置。
- bridge 插件返回容器的 IP 与网络配置给 Docker。
- 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 的主要作用是:
- 标准化容器网络接口,使容器运行时可以选择不同的网络方案。
- 支持多种网络插件,为不同容器选择不同网络配置。
- CNI 插件负责为容器配置网络,包括分配 IP、配置路由等。
- 插件与配置分离,使其能够在不同的容器运行时使用。
它定义了容器运行时(如 Docker)与 CNI 插件之间的接口,包含:
- CNI 网络配置文件:描述要使用的 CNI 插件与配置。
- CNI 插件二进制文件:由插件提供,用于配置网络。