疑難排解 CNI 外掛程式相關錯誤
為避免 CNI 外掛程式相關錯誤,請確認您正在使用或升級到已測試可與您的 Kubernetes 版本正確搭配運作的容器執行期。
關於「Incompatible CNI versions」與「Failed to destroy network for sandbox」錯誤
當 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 組態版本,您可能會遇到以下「Incompatible CNI versions」或「Failed to destroy network for sandbox」錯誤情況。
Incompatible CNI versions 錯誤
如果您的 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 組態檔。
Failed to destroy network for sandbox 錯誤
如果 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 並遇到「Incompatible CNI versions」或「Failed to destroy network for sandbox」錯誤,請考慮更新您的 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 執行期會將 loopback 介面 lo
作為預設行為新增至 Pod。containerd 執行期透過 CNI 外掛程式 loopback
設定 loopback 介面。loopback
外掛程式作為具有 cni
指定的 containerd
發行套件的一部分發佈。containerd
v1.6.0 及更高版本包含與 CNI v1.0.0 相容的 loopback 外掛程式以及其他預設 CNI 外掛程式。loopback 外掛程式的組態由 containerd 在內部完成,並設定為使用 CNI v1.0.0。這也表示當啟動此較新版本的 containerd
時,loopback
外掛程式的版本必須為 v1.0.0 或更高版本。
以下 bash 命令會產生 CNI 組態範例。在此,組態版本的 1.0.0 值會指派給 cniVersion
欄位,以在 containerd
叫用 CNI bridge 外掛程式時使用。
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 位址範圍。