天天看點

Kubernetes必備知識: CNI

所屬技術領域:

K8s

|名詞定義|

CNI的全稱是 Container Network Interface,即容器網絡的 API 接口。

它是 K8s 中标準的一個調用網絡實作的接口。Kubelet 通過這個标準的 API 來調用不同的網絡插件以實作不同的網絡配置方式。實作了這個接口的就是 CNI 插件,它實作了一系列的 CNI API 接口。常見的 CNI 插件包括 Calico、flannel、Terway、Weave Net 以及 Contiv。

|技術特點|

 CNI基本的使用方法為:

  1. 首先在每個結點上配置 CNI 配置檔案(/etc/cni/net.d/xxnet.conf),其中 xxnet.conf 是某一個網絡配置檔案的名稱;
  2. 安裝 CNI 配置檔案中所對應的二進制插件;
  3. 在這個節點上建立 Pod 之後,Kubelet 就會根據 CNI 配置檔案執行前兩步所安裝的 CNI 插件;
  4. 上步執行完之後,Pod 的網絡就配置完成了。

    具體的流程如下圖所示:

Kubernetes必備知識: CNI

在叢集裡面建立一個 Pod 的時候,首先會通過 apiserver 将 Pod 的配置寫入。apiserver 的一些管控元件(比如 Scheduler)會排程到某個具體的節點上去。Kubelet 監聽到這個 Pod 的建立之後,會在本地進行一些建立的操作。當執行到建立網絡這一步驟時,首先它會讀取剛才我們所說的配置目錄中的配置檔案,配置檔案裡面會聲明所使用的是哪一個插件,然後去執行具體的 CNI 插件的二進制檔案,再由 CNI 插件進入 Pod 的網絡空間去配置 Pod 的網絡。配置完成之後,Kuberlet 也就完成了整個 Pod 的建立過程,這個 Pod 就線上了。

大家可能會覺得上述流程有很多步(比如要對 CNI 配置檔案進行配置、安裝二進制插件等等),看起來比較複雜。

但如果我們隻是作為一個使用者去使用 CNI 插件的話就比較簡單,因為很多 CNI 插件都已提供了一鍵安裝的能力。以我們常用的 Flannel 為例,如下圖所示:隻需要我們使用 kubectl apply Flannel 的一個 Deploying 模闆,它就能自動地将配置、二進制檔案安裝到每一個節點上去。

Kubernetes必備知識: CNI

安裝完之後,整個叢集的 CNI 插件就安裝完成了。

是以,如果我們隻是去使用 CNI 插件的話,那麼其實很多 CNI 插件已經提供了一鍵安裝的腳本,無需大家關心 Kubernetes 内部是如何配置的以及如何調用 API 的。

 Kubelet對CNI的實作

kubelet對CNI的實作的主要代碼在:pkg/kubelet/network/cni/cni.go SetUpPod/TearDownPod(建立Pod和銷毀Pod)

Kubernetes必備知識: CNI

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;

Kubernetes必備知識: CNI

network.InitNetworkPlugin(pkg/kubelet/network/plugins.go)

InitNetworkPlugin時,會根據NetworkPluginName來選擇需要的Network Plugin,然後調用plugin的Init進行初始化

Kubernetes必備知識: CNI

networkPlugin初始化好後,會傳遞到containerRuntime,在Pod的生命周期中負責管理網絡。

|資料來源|

名詞定義:

https://www.jianshu.com/p/1919fb8a48ea

繼續閱讀