(一)什么是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 容器的網絡命名空間,獲得網絡連接。