K8S基本操作-48-K8S與容器網路介面(Container Network Interface)
Container Network Interface 容器網路介面
K8S 的 CNI 是指容器網路介面(Container Network Interface),它是一個標準的 API,用於讓 K8S 與不同的網路插件溝通,實現容器的網路配置。CNI 定義了一些規範,要求網路插件必須提供一些執行檔,並且能夠根據配置檔和容器的資訊,完成容器的網路建立和刪除等操作。
CNI 的好處是讓 K8S 的網路功能更加靈活和可擴展,因為它可以支援多種網路模式,例如 Overlay, Underlay, 路由等,並且可以讓使用者自由選擇適合自己環境和需求的網路插件,例如 Calico, Flannel, Weave Net 等。
CNI 的規定有哪些?
CNI 是一個由 Cloud Native Computing Foundation (CNCF) 項目,它定義了一個標準的 API,用於讓不同的容器執行平台溝通,實現容器的網路配置。
CNI 的核心是一個規範 (SPEC),它規定了網路插件必須提供兩個執行檔:ADD 和 DEL,分別用於建立和刪除容器的網路介面。這兩個執行檔會接收一些參數,例如容器的 ID, 名稱, 網路命名空間, 網路配置檔等,並且返回一些資訊,例如容器的 IP, MAC, 網路路由等。³
CNI 還提供了一些函式庫 (LIB) 和工具 (CNITool),用於幫助開發和測試網路插件。函式庫可以讓容器執行平台方便地調用網路插件,而工具可以讓使用者手動執行網路插件,以檢查其功能和效能。
如何實現的? Linux Network Namespaces
Linux Network NS 是 Linux 內核提供的一種實現網路隔離的功能,它能讓不同的網路空間擁有獨立的網路資源,例如網路裝置、IP 協定堆疊、路由表、防火牆規則等。
使用 Linux Network NS 可以在一台主機上模擬多個網路環境,例如容器化技術、核心網路測試等。
K8S 使用的 CNI 就是使用 Linux Network NS 來實踐給每個 Pod 獨立的 IP 的。
細節可以參考:
https://www.man7.org/linux/man-pages/man7/network_namespaces.7.html
CNI 網路中 Pod 可以跨 Node 跟其他 Pod 溝通嗎?
可以,跨越 Node 的 Pod 通訊是可以的,可以視為一定範圍遮罩的網段。
CNI 的運作腳本位置在哪裡?
這是 CNI 的預設配置檔案:
/etc/cni/net.d/net-script.conflist
這是 CNI 的預設腳本:
/opt/cni/bin/net-script.sh
也就是說,具體 CNI 呼叫時類似這樣:
/opt/cni/bin/net-script.sh add <容器ID> <命名空間>
K8S 如何連接 CNI 的?
採用 Kubelete 部件進行連接,也就是說 Kubelete 啟動參數中會有 CNI 的腳本與配置檔案路徑。
可以透過以下指令查詢:
ps aux|grep /usr/bin/kubelet