為什麼 Pod 會反覆無法重新啟動,或是被意外移除?

針對反覆無法重新啟動、卡在「CrashLoopBackOff」迴圈中,或從叢集中意外移除的 Pod 進行疑難排解。

虛擬私有雲 傳統基礎設施

您的 Pod 性能良好,但非預期地被移除或停滯在重新啟動迴圈中。 有時容器會顯示 CrashLoopBackOff 狀態。

您的容器可能超出其資源限制,或您的 Pod 可能被取代為較高優先順序的 Pod。 當 Kubernetes 容器反覆無法啟動時,它會進入「CrashLoopBackOff」狀態,這表示該 Pod 內存在持續的重新啟動迴圈。 此錯誤經常因各種問題導致容器無法正常啟動而發生。 常見的原因可能包括記憶體不足、資源超載、部署錯誤、第三方服務問題 (例如 DNS 錯誤)、遺失依賴項目或因連接埠衝突而導致容器故障。

請參閱下列小節:

修正儲存器資源限制

  1. 取得 Pod 的名稱。 如果您已使用標籤,則可以包括它來過濾結果。
    kubectl get pods --selector='app=wasliberty'
    
  2. 說明 Pod,並尋找重新啟動計數
    kubectl describe pod
    
  3. 如果 Pod 在短期間內重新啟動多次,則會提取其狀態。
    kubectl get pod <pod_name> -n <namespace> -o go-template='{{range.status.containerStatuses}}{{"Container Name: "}}{{.name}}{{"\r\nLastState: "}}{{.lastState}}{{end}}'
    
  4. 檢閱原因。 例如,OOM Killed 表示記憶體不足,這表示容器因資源限制而發生當機。
  5. 將容量新增至叢集,例如重新調整工作者節點儲存區的大小,以便可以履行資源。 如需相關資訊,請參閱 調整標準工作者節點儲存區的大小調整 VPC 工作者節點儲存區的大小

以較高優先順序 Pod 來修正 Pod 取代

若要查看是否將 Pod 取代為較高優先順序的 Pod,請執行下列動作:

  1. 取得 Pod 的名稱。

    kubectl get pods
    
  2. 說明 Pod YAML。

    kubectl get pod <pod_name> -o yaml
    
  3. 檢查 priorityClassName 欄位。

    1. 如果沒有 priorityClassName 欄位值,則 Pod 會有 globalDefault 優先順序類別。 如果您的叢集管理者未設定 globalDefault 優先順序類別,則預設值為零 (0) 或最低優先順序。 任何具有較高優先順序類別的 Pod 都可以先占或移除您的 Pod。

    2. 如果有 priorityClassName 欄位值,則請取得優先順序類別。

        kubectl get priorityclass <priority_class_name> -o yaml
        ```
    3. 記下 `value` 欄位,以檢查您的 Pod 優先順序。
    
    
  4. 列出叢集裡的現有優先順序類別。

    kubectl get priorityclasses
    
  5. 對於每個優先順序類別,取得 YAML 檔案,並記下 value 欄位。

    kubectl get priorityclass <priority_class_name> -o yaml
    
  6. 將 Pod 的優先順序類別值與其他優先順序類別值比較,以查看其優先順序較高或較低。

  7. 對於叢集裡的其他 Pod 重複步驟 1 到 3,以檢查它們使用的優先順序類別。 如果這些其他 Pod 的優先順序類別高於您的 Pod,則未佈建您 Pod,除非您的 Pod 有足夠的資源而且每個 Pod 都有較高的優先順序。

  8. 請聯絡您的叢集管理員,為您的叢集增加更多容量,並確認已指派正確的優先級類別。