全部產品
Search
文件中心

Container Compute Service:Pod異常問題排查

更新時間:Dec 11, 2024

本文介紹關於Pod異常問題的診斷流程、排查方法、常見問題及解決方案。

本文目錄

類別

內容

診斷流程

診斷流程

常見排查方法

常見問題及解決方案

診斷流程

診斷流程2

  1. 查看Pod是否處於異常狀態,具體操作,請參見檢查Pod的狀態

    1. 如果Pod狀態異常,可通過查看Pod的事件、Pod的日誌、Pod的配置等資訊確定異常原因。具體操作,請參見常見排查方法。關於Pod異常狀態及處理方式,請參見常見的Pod異常狀態及處理方式

    2. 如果Pod狀態為Running但未正常工作,請參見Pod狀態為Running但沒正常工作

  2. 若確認是Pod OOM異常問題,請參見Pod OOM異常問題處理

  3. 如果問題仍未解決,請提交工單

常見的Pod異常狀態及處理方式

Pod狀態

Pod含義

解決方案

Pending

Pod未被調度。

Pod狀態為Pending

Init:N/M

Pod包含M個Init容器,其中N個已經啟動完成。

Pod狀態為Init:N/M(Init:Error和Init:CrashLoopBackOff)

Init:Error

Init容器已啟動失敗。

Pod狀態為Init:N/M(Init:Error和Init:CrashLoopBackOff)

Init:CrashLoopBackOff

Init容器啟動失敗,反覆重啟。

Pod狀態為Init:N/M(Init:Error和Init:CrashLoopBackOff)

Completed

Pod的啟動命令已執行完畢。

Pod狀態為Completed

CrashLoopBackOff

Pod啟動失敗,反覆重啟。

Pod狀態為CrashLoopBackOff

ImagePullBackOff

Pod鏡像拉取失敗。

Pod狀態為ImagePullBackOff

Running

  1. Pod運行正常。

  2. Pod Running但是未正常工作。

  1. 無需處理

  2. Pod狀態為Running但沒正常工作

Terminating

Pod正在關閉中。

Pod狀態為Terminating

常見排查方法

檢查Pod的狀態

  1. 登入容器計算服務控制台,在左側導覽列選擇叢集

  2. 叢集頁面,單擊目的地組群ID,然後在左側導覽列,選擇工作負載 > 容器組

  3. 容器組頁面左上方選擇Pod所在的命名空間,查看Pod狀態。

檢查Pod的詳情

  1. 登入容器計算服務控制台,在左側導覽列選擇叢集

  2. 叢集頁面,單擊目的地組群ID,然後在左側導覽列,選擇工作負載 > 容器組

  3. 容器組頁面左上方選擇Pod所在的命名空間,然後單擊目標Pod名稱或者目標Pod右側操作列下的詳情,查看Pod的名稱、鏡像、Pod IP等詳細資料。

檢查Pod的配置

  1. 登入容器計算服務控制台,在左側導覽列選擇叢集

  2. 叢集頁面,單擊目的地組群ID,然後在左側導覽列,選擇工作負載 > 容器組

  3. 容器組頁面左上方選擇Pod所在的命名空間,然後單擊目標Pod名稱或者目標Pod右側操作列下的詳情。

  4. 在Pod詳情頁面右上方單擊編輯,查看Pod的YAML檔案和詳細配置。

檢查Pod的事件

  1. 登入容器計算服務控制台,在左側導覽列選擇叢集

  2. 叢集頁面,單擊目的地組群ID,然後在左側導覽列,選擇工作負載 > 容器組

  3. 容器組頁面左上方選擇Pod所在的命名空間,然後單擊目標Pod名稱或者目標Pod右側操作列下的詳情。

  4. 在Pod詳情頁面右上方單擊編輯,查看Pod的YAML檔案和詳細配置。

  5. 在Pod詳情頁面下方單擊事件頁簽,查看Pod的事件。

    說明

    Kubernetes預設保留最近1小時的事件,若需儲存更長時間的事件,請參見建立並使用K8s事件中心

檢查Pod的日誌

  1. 登入容器計算服務控制台,在左側導覽列選擇叢集

  2. 叢集頁面,單擊目的地組群ID,然後在左側導覽列,選擇工作負載 > 容器組

  3. 容器組頁面左上方選擇Pod所在的命名空間,然後單擊目標Pod名稱或者目標Pod右側操作列下的詳情。

  4. 在Pod詳情頁面下方單擊日誌頁簽,查看Pod的日誌。

    說明

    阿里雲容器計算服務ACS叢集整合了Log Service,您可以在建立叢集時啟用Log Service,快速採集叢集的容器日誌,包括容器的標準輸出及容器內的文字檔。更多資訊,請參見通過Pod環境變數配置應用日誌採集

檢查Pod的監控

  1. 登入容器計算服務控制台,在左側導覽列選擇叢集

  2. 叢集頁面,單擊目的地組群ID,然後在左側導覽列,選擇工作負載 > Prometheus 監控

  3. Prometheus監控頁面,單擊叢集監控概覽頁簽,選擇查看Pod的CPU、記憶體、網路I/O等監控大盤。

使用終端進入容器

  1. 登入容器計算服務控制台,在左側導覽列選擇叢集

  2. 叢集頁面,單擊目的地組群ID,然後在左側導覽列,選擇工作負載 > 容器組

  3. 容器組頁面,單擊目標容器組右側操作列下的終端

    說明

    可通過終端進入容器,在容器內查看本地檔案等資訊。

Pod故障診斷

  1. 登入容器計算服務控制台,在左側導覽列選擇叢集

  2. 叢集頁面,單擊目的地組群ID,然後在左側導覽列,選擇工作負載 > 容器組

  3. 容器組頁面左上方選擇Pod所在的命名空間,然後單擊目標Pod名稱或者目標Pod右側操作列下的詳情,查看Pod的名稱、鏡像、Pod IP等詳細資料。

  4. 容器組頁面,單擊目標容器組右側操作列下的診斷

    說明

    對該容器組進行故障診斷,根據診斷結果解決問題。更多資訊,請參見使用叢集診斷

Pod狀態為Pending

問題原因

若Pod停留在Pending狀態,說明該Pod不能被調度。通常是由於資源依賴、quota不合理等原因導致叢集中缺乏需要的資源。

問題現象

Pod的狀態為Pending。

解決方案

查看Pod的事件,根據事件描述,定位Pod不能被調度的原因。主要原因有以下幾類:

  • 資源依賴

    建立Pod時,需要依賴於叢集中ConfigMap、PVC等資源。例如,Pod添加儲存卷聲明前,儲存卷聲明需要先與儲存卷綁定。

  • quota不合理

    在事件和審計日誌查看。

Pod狀態為Init:N/M(Init:Error和Init:CrashLoopBackOff)

問題原因

  • 若Pod停留在Init:N/M狀態,說明該Pod包含M個Init容器,其中N個已經啟動完成,但仍有M-N個Init容器未啟動成功。

  • 若Pod停留在Init:Error狀態,說明Pod中的Init容器啟動失敗。

  • 若Pod停留在Init:CrashLoopBackOff狀態,說明Pod中的Init容器啟動失敗並處於反覆重啟狀態。

問題現象

  • Pod的狀態為Init:N/M。

  • Pod的狀態為Init:Error。

  • Pod的狀態為Init:CrashLoopBackOff。

解決方案

  1. 查看Pod的事件,確認當前Pod中未啟動的Init容器是否存在異常。具體操作,請參見檢查Pod的事件

  2. 查看Pod中未啟動的Init容器的日誌,通過日誌內容排查問題。具體操作,請參見檢查Pod的日誌

  3. 查看Pod的配置,確認未啟動的Init容器配置是否正常。具體操作,請參見檢查Pod的配置。關於Init容器的更多資訊,請參見調試Init容器

Pod狀態為ImagePullBackOff

問題原因

若Pod停留在ImagePullBackOff狀態,說明此Pod已被後台調度,但拉取鏡像失敗。

問題現象

Pod的狀態為ImagePullBackOff。

解決方案

通過查看該Pod的事件描述,查看具體拉取失敗的鏡像名稱。

  1. 確認容器鏡像名稱是否正確。

  2. 如果您使用的是私人鏡像倉庫,請參見使用在鏡像倉庫中存放的鏡像來建立ACS工作負載解決。

Pod狀態為CrashLoopBackOff

問題原因

若Pod停留在CrashLoopBackOff狀態,說明容器中應用程式有問題。

問題現象

Pod的狀態為CrashLoopBackOff。

解決方案

  1. 查看Pod的事件,確認當前Pod是否存在異常。具體操作,請參見檢查Pod的事件

  2. 查看Pod的日誌,通過日誌內容排查問題。具體操作,請參見檢查Pod的日誌

  3. 查看Pod的配置,確認容器中的健全狀態檢查配置是否正常。具體操作,請參見檢查Pod的配置。關於Pod健全狀態檢查的更多資訊,請參見配置存活、就緒和啟動探測器

Pod狀態為Completed

問題原因

若Pod出現Completed狀態,說明容器中的啟動命令已執行完畢,容器中的所有進程都已退出。

問題現象

Pod的狀態為Completed。

解決方案

  1. 查看Pod的配置,確定Pod中容器的啟動命令。具體操作,請參見檢查Pod的配置

  2. 查看Pod的日誌,通過日誌內容排查問題。具體操作,請參見檢查Pod的日誌

Pod狀態為Running但沒正常工作

問題原因

部署使用的YAML檔案有問題。

問題現象

Pod狀態為Running但沒正常工作。

解決方案

  1. 查看Pod的配置,確定Pod中容器的配置是否符合預期。具體操作,請參見檢查Pod的配置

  2. 使用以下方法,排查環境變數中的某一個Key是否存在拼字錯誤。

    以command拼字成commnd為例,說明拼字問題排查方法。

    說明

    建立Pod時,環境變數中的某一個Key拼字錯誤的問題會被叢集忽略,如Command拼字為Commnd,您仍能夠使用該YAML檔案建立資源。但容器運行時,不會執行有拼字問題的YAML檔案,而是執行鏡像中的預設命令。

    1. 在執行kubectl apply -f命令前為其添加--validate,然後執行kubectl apply --validate -f XXX.yaml命令。

      如果您將command拼字成commnd,將看到錯誤資訊XXX] unknown field: commnd XXX] this may be a false alarm, see https://gXXXb.XXX/6842pods/test

    2. 執行以下命令,將輸出結果的pod.yaml檔案與您建立Pod使用的檔案進行對比。

        kubectl get pods [$Pod] -o yaml > pod.yaml
      說明

      [$Pod]為異常Pod的名稱,您可以通過kubectl get pods命令查看。

      • pod.yaml檔案比您建立Pod所使用的檔案多幾行,說明已建立的Pod符合預期。

      • 如果您建立Pod所使用檔案裡的程式碼在pod.yaml檔案中沒有,說明您建立Pod使用的檔案存在拼字問題。

  3. 查看Pod的日誌,通過日誌內容排查問題。具體操作,請參見檢查Pod的日誌

  4. 可通過終端進入容器查看容器內的本地檔案是否符合預期。具體操作,請參見使用終端進入容器

Pod狀態為Terminating

問題原因

若Pod的狀態為Terminating,則說明此Pod正處於關閉狀態。

問題現象

Pod狀態為Terminating。

解決方案

Pod停留在Terminating狀態一段時間後會被自動刪除。若Pod一直停留在Terminating狀態,可執行如下命令強制移除:

kubectl delete pod [$Pod] -n [$namespace] --grace-period=0 --force

Pod OOM異常問題處理

問題原因

當叢集中的容器使用超過其限制的記憶體,容器可能會被終止,觸發OOM(Out Of Memory)事件,導致容器異常退出。關於OOM事件,請參見為容器和Pod分配記憶體資源

問題現象

  • 若被終止的進程為容器的阻塞進程,可能會導致容器異常重啟。

  • 若出現OOM異常問題,在控制台的Pod詳情頁面單擊事件頁簽將展示OOM事件pod was OOM killed

解決方案

  1. 通過Pod記憶體監控查看記憶體增長曲線,確定異常出現時間。具體操作,請參見檢查Pod的監控

  2. 根據監控、記憶體增長時間點、日誌、進程名等資訊,排查Pod內對應進程是否存在記憶體流失。

    • 若OOM是進程記憶體流失導致,請您自行排查泄露原因。

    • 若進程運行狀態正常,則根據實際運行需要,適當增大Pod的記憶體限制,建議Pod的記憶體實際使用量不超過記憶體限制值的80%。具體操作,請參見管理容器組