Kubernetes相关的名词解释CNI插件(1)
(一)什么是CNI插件?
在 Kubernetes 中,CNI 插件(Container Network Interface Plugin) 是一种用于配置容器网络接口的标准工具,负责为 Pod 分配网络资源(如 IP 地址)并建立网络连接。它是 Kubernetes 网络模型的核心组件之一。
CNI 定义了一组规范和插件,使得容器运行时(如 Docker、containerd、CRI-O 等)能够与第三方网络插件(CNI 插件)通信,从而实现容器网络的配置和管理。
(二)CNI 的工作原理
CNI 的核心思想是将容器的网络配置与容器运行时解耦,通过插件机制实现网络配置的灵活性。CNI 的工作流程可以分为以下几个步骤:
容器运行时创建网络命名空间:当 Kubernetes 调度一个 Pod 到某个节点时,容器运行时(如 containerd 或 Docker)会为该 Pod 创建一个新的网络命名空间。
CNI 插件进行网络配置:容器运行时会调用 CNI 插件,执行网络配置操作。CNI 插件负责以下任务:
为容器分配 IP 地址。
设置网络接口(如虚拟网卡)。
配置路由表和网络策略。
IPAM 插件分配 IP 地址:CNI 插件通常会使用 IPAM(IP Address Management)插件来为容器分配 IP 地址。IPAM 插件负责管理 IP 地址池,并为每个容器分配唯一的 IP 地址。
启动容器:网络配置完成后,容器运行时启动容器,并将其加入到已配置的网络命名空间中。
(三)CNI 的核心作用
-
Pod 网络配置
-
当 Pod 被创建时,CNI 插件会自动为 Pod 分配 IP 地址、配置网络接口(如
veth pair
),并确保 Pod 能与集群内其他 Pod、节点或外部网络通信。 -
当 Pod 被删除时,CNI 插件会释放资源。
-
-
实现 Kubernetes 网络要求
-
Kubernetes 要求所有 Pod 必须能直接通过 IP 地址相互通信(无需 NAT),无论它们是否在同一节点上。CNI 插件负责实现这一目标。
-
(四)CNI的配置方式
-
CNI 插件通过 JSON 配置文件(通常位于
/etc/cni/net.d/
)定义网络规则,例如子网、路由、插件类型等。
(五)常见的常见的 CNI 插件有哪些?
-
Calico
-
基于 BGP 协议实现高性能网络,支持网络策略(NetworkPolicy)。
-
-
Flannel
-
简单的 Overlay 网络,使用 VXLAN 或 host-gw 模式。
-
-
Cilium
-
基于 eBPF 技术,提供高性能和高级网络策略。
-
-
Weave Net
-
自动创建 Mesh 网络,支持加密通信。
-
-
Amazon VPC CNI
-
在 AWS EKS 中直接为 Pod 分配 VPC IP 地址。
-
(六)那么安装Kubernetes 后自带了CNI插件吗?
Kubernetes 本身不提供任何内置的 CNI 插件,但它的网络模型依赖于 CNI 标准。安装 Kubernetes 后,你需要手动安装和配置一个 CNI 插件,否则 Pod 可能无法正常分配 IP 地址或通信。
Kubernetes 默认网络模式(kubenet
)
-
如果未安装 CNI 插件,Kubernetes 会使用内置的
kubenet
网络插件,但它的功能非常有限:-
仅提供基本的网络连接(依赖节点上的
bridge
和host-local
CNI 插件)。 -
需要手动配置节点路由,且不支持跨节点网络策略(NetworkPolicy)。
-
大多数生产环境不会使用
kubenet
。
-
(七)Microk8s安装后自带了CNI插件吗?
MicroK8s 默认会自带一个 CNI 插件(具体取决于安装方式和版本),通常是 Flannel 或 Calico,以确保 Pod 网络能正常工作。不过,它的行为可能因不同的安装模式(如 strict
或 classic
)而有所不同。
默认情况(非严格模式 / classic
)
-
MicroK8s 默认启用
flannel
作为 CNI 插件,提供简单的 Overlay 网络(基于 VXLAN)。 -
安装后,Pod 会自动获得 IP 并支持跨节点通信。
严格模式(strict
)
-
如果以
strict
模式安装(如 Ubuntu Core 环境),MicroK8s 默认使用calico
(因其支持网络策略NetworkPolicy
)。
MicroK8s 允许动态启用/禁用不同的 CNI 插件:
# 切换到 Calico
microk8s enable calico# 切换到 Flannel
microk8s enable flannel# 禁用当前插件
microk8s disable <cni-name>
(八)CNI 插件安装在哪儿?
CNI 插件安装在 Node(节点)的主机上,而不是容器内部。它的作用是为主机上的 Pod(容器组)配置网络接口、分配 IP 地址并管理网络连接。
为什么 CNI 插件必须安装在主机上?
-
直接操作主机网络
-
CNI 插件需要创建
veth pair
、配置网桥(如cni0
)、管理 iptables 规则等,这些操作需在主机网络栈中完成。
-
-
Pod 网络初始化时机
-
当 Pod 启动时,容器运行时(containerd/CRI-O) 会调用 CNI 插件,而容器运行时本身运行在主机上。
-
-
跨节点通信需求
-
CNI 插件需处理节点间的路由(如 Calico 的 BGP 或 Flannel 的 VXLAN),这些功能依赖主机级配置。
-
CNI 插件的工作流程(以 Pod 创建为例)
-
kubelet 收到创建 Pod 的请求,通过 CRI 接口通知容器运行时(如 containerd)。
-
容器运行时 先创建 Pod 的沙箱环境(pause 容器),然后调用 CNI 插件。
-
CNI 插件(如 Calico)从
/etc/cni/net.d/
读取配置,执行以下操作:-
创建
veth pair
(一端在 Pod 内,一端在主机上)。 -
为主机端的
veth
分配 IP 并添加到网桥或路由表。 -
更新 iptables/ebpf 规则(如需网络策略)。
-
-
网络配置完成后,Pod 内的容器共享 pause 容器的网络命名空间,获得网络连接。