為什麼我的儲存器不啟動?
您注意到下列一或多個問題:
-
工作者節點無法建立新的 Pod。 Pod 已順利部署至工作者節點,但容器停留在
ContainerCreating狀態。 -
針對處於
ContainerCreating狀態的 Pod 執行oc describe pod <pod>時,您會看到類似於下列其中一個事件的事件。Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "XXX": failed to request 1 IPv4 addresses. IPAM allocated only 0desc = failed to create pod network sandbox ... error adding container to network "k8s-pod-network": cannot allocate new block due to per host block limit -
當您執行下列指令時,一個以上
calico-nodePod 無法在工作者節點上啟動,且處於CrashLoopBackOff狀態。oc logs -n calico-system <calico-node_pod>日誌的最後幾行包含下列訊息:
Unable to autoassign an address - pools are likely exhausted. type="ipipTunnelAddress"
如果您未看到症狀中列出的任一 IP 位址相關訊息,則容器可能不會啟動,因為已達到登錄配額。
如果您看到症狀中列出的任一 IP 位址相關訊息,則容器可能不會啟動,因為 Calico 外掛程式的「IP 位址管理程式 (IPAM)」錯誤地偵測到叢集裡的所有 Pod IP 位址都在使用中。 因為 Calico IPAM 偵測不到可用的 IP 位址,所以不會將 IP 位址指派給叢集裡的新 Pod,且 Pod 無法啟動。
修正登錄配額問題
虛擬私有雲 經典基礎設施
為解決登錄檔配額問題 ,請釋放. IBM Cloud Container Registry 中的儲存空間。
修正 IP 位址問題
虛擬私有雲 經典基礎設施
為解決 IP 位址問題,請釋放那些未從 IPAM Calico 記錄中完整移除的個別及整組 IP 位址,以便叢集內的 pod 能夠重複使用這些位址。
您的叢集必須執行 支援的版本。 如果叢集執行已淘汰或不受支援的版本,請先 更新叢集。
步驟 1: 釋放個別 IP 位址
首先,檢查並釋放那些未從 IPAM Calico 記錄中完整移除的個別 IP 位址,以便叢集內的 pod 能夠重複使用這些位址。
-
遵循 安裝及配置 Calico CLI 中的步驟,以下載
calicoctl用戶端 3.18 版或更新版本,使用適用於您叢集的正確 Calico 配置,並驗證 Calico 配置是否針對您的目標叢集正確地運作。 請注意,即使叢集執行舊版 Calico,您仍可以在下列步驟中使用calicoctl3.18 版來執行指令。 -
檢查是否有任何未正確偵測到 Calico IPAM 正在使用的 IP 位址。
calicoctl ipam check -
在輸出中,尋找包含
Scanning for IPs that are allocated but not actually in use...這一行的區段。 如果已在 IPAM 中配置 IP 位址,但未實際使用,請繼續下一步以釋放 IP 位址。 在此範例輸出中,可以釋放 181 個 IP 位址。... Scanning for IPs that are allocated but not actually in use... Found 181 IPs that are allocated in IPAM but not actually in use. Scanning for IPs that are in use by a workload or node but not allocated in IPAM... Found 0 in-use IPs that are not in active IP pools. Found 0 in-use IPs that are in active IP pools but have no corresponding IPAM allocation. Check complete; found 181 problems. -
從先前指派給 Pod 端點的 Calico IPAM 中釋放 IP 位址。 請注意,在下列步驟中鎖定資料儲存庫之後,現有 Pod 會繼續執行,但所建立的任何 Pod 都會保持
ContainerCreating狀態,且在您解除鎖定資料儲存庫之前無法啟動。 此資料儲存庫鎖定可確保在釋放 IP 位址時不會修改 IPAM 記錄。 如需相關資訊,請參閱 Calico 開放程式碼文件。- 鎖定 Calico IPAM 記錄的資料儲存庫。
calicoctl datastore migrate lock ``` 2. 儲存 IPAM 檢查結果。 ```sh {: pre} calicoctl ipam check -o report.json ``` 3. 釋放未用的 IP 位址。 此處理程序最多可以執行 20 分鐘,視必須釋放的 IP 位址數目而定。 ```sh {: pre} calicoctl ipam release --from-report=report.json ``` 4. 解除鎖定資料儲存庫。 ```sh {: pre} calicoctl datastore migrate unlock ``` 5. 驗證已釋放所有未用的 IP 位址。 ```sh {: pre} calicoctl ipam check ``` 輸出範例 ```sh {: screen} Check complete; found 0 problems. ``` -
選用項目: 若要驗證資料儲存庫已順利解除鎖定,且 IP 位址現在可供指派,請建立 Pod 並檢查它是否正確啟動。
- 例如,建立一個簡單的 NGINX Pod。
oc run test --image=nginx --generator=run-pod/v1 ``` 2. 驗證 Pod 具有 IP 位址且正在順利執行。 ```sh {: pre} oc get po test ``` 3. 刪除測試 Pod。 ```sh {: pre} oc delete pod test ``` -
繼續下一個區段,以檢查未使用的 IP 位址區塊。
步驟 2: 釋放 IP 位址區塊
接下來,檢查並清除指派給工作者節點但該工作者節點未使用的整個 IP 位址區塊。
有時,當工作者節點獲指派第二個或第三個 IP 位址區塊時,工作者節點先前使用的整個 IP 位址區塊稍後可能會完全未用。 此外,當您移除或取代工作者節點時,Calico IPAM 清除 IP 位址區塊可能會失敗,因為缺少要暫時執行 calico-kube-controllers 的工作者節點,或因為移除或取代工作者節點時 CNI 外掛程式或 containerd 執行時期發生問題。
確保 IP 區塊免費對於執行 Kubernetes 1.19 版或更新版本的所有標準叢集以及所有 VPC 叢集尤其重要。 在這些叢集裡,strictAffinity Calico 設定設為 true,這會強制工作者節點使用僅來自其已指派 IP 區塊的 IP 位址,而不是使用來自指派給其他工作者節點之區塊的 IP 位址。 在一段時間之後,指派給節點但未用的區塊會累計,直到無法再將 IP 位址區塊指派給工作者節點為止。
-
遵循 釋放個別 IP 位址 的步驟。
-
選擇是否鎖定 Calico IPAM 記錄的資料儲存庫。
- 如果您鎖定資料儲存庫,則現有 Pod 會繼續執行,但任何建立的 Pod 都會保持
ContainerCreating狀態,且在您解除鎖定資料儲存庫之前無法啟動。 此資料儲存庫鎖定可確保在您檢查未使用的區塊之後,但在釋放區塊之前,無法建立 Pod。 - 如果您未鎖定資料儲存庫,則必須立即驗證沒有新的 Pod 使用您所刪除的已釋放區塊中的 IP 位址。
calicoctl datastore migrate lock - 如果您鎖定資料儲存庫,則現有 Pod 會繼續執行,但任何建立的 Pod 都會保持
-
列出 Calico IPAM 記錄。 在輸出中,尋找具有 0
IPS IN USE的區塊,這表示其指派的工作者節點未使用該區塊。calicoctl ipam show --show-blocks在此範例輸出中,
172.24.10.64/26區塊沒有使用中的 IP 位址。... Block | 172.24.10.64/26 | 64 | 0 (0%) | 64 (100%) | ... -
對於其中每一個區塊,請完成下列步驟來釋放區塊。
- 驗證目前沒有 Pod 使用區塊中的 IP 位址。
oc get pods -A ``` 2. 取得區塊的 `BlockAffinity`。 以連字號 (-) 取代區塊中的句點和正斜線。例如,對於區塊 `172.24.10.64/26`,下列指令的格式為 `172-24-10-64-26`。 ```sh {: pre} oc get blockaffinity | grep <block> ``` 3. 刪除 `BlockAffinity`。 ```sh {: pre} oc delete blockaffinity <block_affinity> ``` 4. 取得區塊的 `IPAMBlock`。 以連字號 (-) 取代區塊中的句點和正斜線。例如,對於區塊 `172.24.10.64/26`,下列指令的格式為 `172-24-10-64-26`。 ```sh {: pre} oc get ipamblock | grep <block> ``` 5. 刪除 `IPAMBlock`。 ```sh {: pre} oc delete ipamblock <ipam_block> ``` 6. 如果您未在步驟 2 中鎖定資料儲存庫: 請確認在您刪除 `BlockAffinity` 及 `IPAMBlock` 之前,未直接建立任何 Pod。 如果已建立 Pod,則必須再次刪除此區塊的 `BlockAffinity` 及 `IPAMBlock`。 然後,執行 `oc delete pod <pod>`,以刪除在此區塊中使用 IP 位址的任何 Pod,以便使用來自不同區塊的 IP 位址來重建 Pod。 ```sh {: pre} oc get pods -A ``` 7. 對於其他任何 `IPS IN USE` 為 0 的區塊,請重複上述步驟。 -
如果您在「步驟 2: 解除鎖定資料儲存庫」中鎖定資料儲存庫。
calicoctl datastore migrate unlock