CNI 外掛相關錯誤的故障排除
為了避免 CNI 外掛相關錯誤,請驗證你使用的容器執行時是否與你的 Kubernetes 版本相容,或升級到已測試確認相容的容器執行時。
關於“不相容的 CNI 版本”和“未能銷燬沙箱網路”錯誤
當 CNI 外掛未升級和/或 CNI 配置檔案中未宣告 CNI 配置版本時,containerd v1.6.0-v1.6.3 中存在 Pod CNI 網路設定和拆除的服務問題。containerd 團隊報告稱,“這些問題已在 containerd v1.6.4 中解決。”
對於 containerd v1.6.0-v1.6.3,如果你不升級 CNI 外掛和/或宣告 CNI 配置版本,你可能會遇到以下“不相容的 CNI 版本”或“未能銷燬沙箱網路”錯誤情況。
不相容的 CNI 版本錯誤
如果你的 CNI 外掛版本與配置中的外掛版本不匹配(因為配置版本晚於外掛版本),那麼 containerd 日誌在 Pod 啟動時可能會顯示類似以下內容的錯誤訊息:
incompatible CNI versions; config is \"1.0.0\", plugin supports [\"0.1.0\" \"0.2.0\" \"0.3.0\" \"0.3.1\" \"0.4.0\"]"
要解決此問題,請更新你的 CNI 外掛和 CNI 配置檔案。
未能銷燬沙箱網路錯誤
如果 CNI 外掛配置中缺少外掛版本,Pod 可能會執行。但是,停止 Pod 會生成類似以下內容的錯誤:
ERROR[2022-04-26T00:43:24.518165483Z] StopPodSandbox for "b" failed
error="failed to destroy network for sandbox \"bbc85f891eaf060c5a879e27bba9b6b06450210161dfdecfbb2732959fb6500a\": invalid version \"\": the version is empty"
此錯誤會使 Pod 處於未就緒狀態,並且網路名稱空間仍然附加。要從這個問題中恢復,請編輯 CNI 配置檔案以新增缺失的版本資訊。下一次嘗試停止 Pod 應該會成功。
更新你的 CNI 外掛和 CNI 配置檔案
如果你正在使用 containerd v1.6.0-v1.6.3 並遇到“不相容的 CNI 版本”或“未能銷燬沙箱網路”錯誤,請考慮更新你的 CNI 外掛並編輯 CNI 配置檔案。
以下是每個節點通常的步驟概述:
停止容器執行時和 kubelet 服務後,執行以下升級操作:
- 如果你正在執行 CNI 外掛,請將其升級到最新版本。
- 如果你正在使用非 CNI 外掛,請將其替換為 CNI 外掛。使用最新版本的外掛。
- 更新外掛配置檔案,以指定或匹配外掛支援的 CNI 規範版本,如以下“containerd 配置檔案示例”一節所示。
- 對於
containerd
,請確保你已安裝最新版本(v1.0.0 或更高版本)的 CNI loopback 外掛。 - 將節點元件(例如 kubelet)升級到 Kubernetes v1.24
- 升級到或安裝最新版本的容器執行時。
透過重啟容器執行時和 kubelet 將節點重新加入叢集。取消封鎖節點(
kubectl uncordon <nodename>
)。
containerd 配置檔案示例
以下示例顯示了 containerd
執行時 v1.6.x 的配置,它支援最新版本的 CNI 規範(v1.0.0)。
有關配置系統的進一步說明,請參閱你的外掛和網路提供商的文件。
在 Kubernetes 上,containerd 執行時預設將一個迴環介面 lo
新增到 Pod。containerd 執行時透過 CNI 外掛 loopback
配置迴環介面。loopback
外掛作為帶有 cni
標識的 containerd
釋出包的一部分進行分發。containerd
v1.6.0 及更高版本包含相容 CNI v1.0.0 的迴環外掛以及其他預設 CNI 外掛。迴環外掛的配置由 containerd 內部完成,並設定為使用 CNI v1.0.0。這也意味著當啟動這個新版本的 containerd
時,loopback
外掛的版本必須是 v1.0.0 或更高版本。
以下 bash 命令生成了一個 CNI 配置示例。在此處,配置版本 1.0.0 的值被分配給 cniVersion
欄位,用於 containerd
呼叫 CNI 橋接外掛時使用。
cat << EOF | tee /etc/cni/net.d/10-containerd-net.conflist
{
"cniVersion": "1.0.0",
"name": "containerd-net",
"plugins": [
{
"type": "bridge",
"bridge": "cni0",
"isGateway": true,
"ipMasq": true,
"promiscMode": true,
"ipam": {
"type": "host-local",
"ranges": [
[{
"subnet": "10.88.0.0/16"
}],
[{
"subnet": "2001:db8:4860::/64"
}]
],
"routes": [
{ "dst": "0.0.0.0/0" },
{ "dst": "::/0" }
]
}
},
{
"type": "portmap",
"capabilities": {"portMappings": true},
"externalSetMarkChain": "KUBE-MARK-MASQ"
}
]
}
EOF
將前面示例中的 IP 地址範圍更新為基於你的用例和網路定址計劃的範圍。