所屬技術領域:
K8s
|名詞定義|
CNI的全稱是 Container Network Interface,即容器網絡的 API 接口。
它是 K8s 中标準的一個調用網絡實作的接口。Kubelet 通過這個标準的 API 來調用不同的網絡插件以實作不同的網絡配置方式。實作了這個接口的就是 CNI 插件,它實作了一系列的 CNI API 接口。常見的 CNI 插件包括 Calico、flannel、Terway、Weave Net 以及 Contiv。
|技術特點|
CNI基本的使用方法為:
- 首先在每個結點上配置 CNI 配置檔案(/etc/cni/net.d/xxnet.conf),其中 xxnet.conf 是某一個網絡配置檔案的名稱;
- 安裝 CNI 配置檔案中所對應的二進制插件;
- 在這個節點上建立 Pod 之後,Kubelet 就會根據 CNI 配置檔案執行前兩步所安裝的 CNI 插件;
-
上步執行完之後,Pod 的網絡就配置完成了。
具體的流程如下圖所示:

在叢集裡面建立一個 Pod 的時候,首先會通過 apiserver 将 Pod 的配置寫入。apiserver 的一些管控元件(比如 Scheduler)會排程到某個具體的節點上去。Kubelet 監聽到這個 Pod 的建立之後,會在本地進行一些建立的操作。當執行到建立網絡這一步驟時,首先它會讀取剛才我們所說的配置目錄中的配置檔案,配置檔案裡面會聲明所使用的是哪一個插件,然後去執行具體的 CNI 插件的二進制檔案,再由 CNI 插件進入 Pod 的網絡空間去配置 Pod 的網絡。配置完成之後,Kuberlet 也就完成了整個 Pod 的建立過程,這個 Pod 就線上了。
大家可能會覺得上述流程有很多步(比如要對 CNI 配置檔案進行配置、安裝二進制插件等等),看起來比較複雜。
但如果我們隻是作為一個使用者去使用 CNI 插件的話就比較簡單,因為很多 CNI 插件都已提供了一鍵安裝的能力。以我們常用的 Flannel 為例,如下圖所示:隻需要我們使用 kubectl apply Flannel 的一個 Deploying 模闆,它就能自動地将配置、二進制檔案安裝到每一個節點上去。
安裝完之後,整個叢集的 CNI 插件就安裝完成了。
是以,如果我們隻是去使用 CNI 插件的話,那麼其實很多 CNI 插件已經提供了一鍵安裝的腳本,無需大家關心 Kubernetes 内部是如何配置的以及如何調用 API 的。
Kubelet對CNI的實作
kubelet對CNI的實作的主要代碼在:pkg/kubelet/network/cni/cni.go SetUpPod/TearDownPod(建立Pod和銷毀Pod)
CNI插件是可執行檔案,會被kubelet調用。啟動kubelet時,指定--network-plugin=cni,同時--cni-conf-dir 指定networkconfig配置,預設路徑是:/etc/cni/net.d,并且,--cni-bin-dir 指定plugin可執行檔案路徑,預設路徑是:/opt/cni/bin;
kubeDeps對象的資料結構NetworkPlugins是調用方法ProbeNetworkPlugins收集所有Network Plugin;
network.InitNetworkPlugin(pkg/kubelet/network/plugins.go)
InitNetworkPlugin時,會根據NetworkPluginName來選擇需要的Network Plugin,然後調用plugin的Init進行初始化
networkPlugin初始化好後,會傳遞到containerRuntime,在Pod的生命周期中負責管理網絡。
|資料來源|
名詞定義:
https://www.jianshu.com/p/1919fb8a48ea