使用 kubectl 檢查叢集狀態


如要診斷 Google Kubernetes Engine (GKE) 問題的根本原因,通常需要詳細檢查 Kubernetes 資源的即時狀態、設定和事件。如要深入瞭解表面症狀,您需要直接查詢及與叢集控制層互動的工具。

請參閱本頁面,瞭解調查叢集即時狀態時必備的 kubectl 指令。瞭解這些指令後,您就能直接從 Kubernetes 控制平面收集詳細資訊,進而瞭解問題發生原因

對於需要執行深入叢集健康狀態檢查、管理資源,以及細部分析基礎架構問題的平台管理員和營運人員來說,這項資訊非常重要。此外,應用程式開發人員也必須使用這項工具,才能偵錯應用程式行為、檢查 Pod 記錄和事件,以及驗證 Kubernetes 環境中部署作業的確切狀態。如要進一步瞭解 Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。

事前準備

開始之前,請先執行下列工作:

  • 安裝 kubectl
  • 設定 kubectl 指令列工具,與叢集通訊:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=LOCATION
    

    更改下列內容:

    • CLUSTER_NAME:叢集名稱。
    • LOCATION:叢集控制層的 Compute Engine位置。為地區叢集提供區域,或為區域叢集提供可用區。
  • 檢查權限。如要查看您是否具備執行 kubectl 指令的必要權限,請使用 kubectl auth can-i 指令。舉例來說,如要查看您是否有權執行 kubectl get nodes,請執行 kubectl auth can-i get nodes 指令。

    如果您具備必要權限,指令會傳回 yes;否則,指令會傳回 no

    如果沒有執行 kubectl 指令的權限,可能會看到類似下列內容的錯誤訊息:

    Error from server (Forbidden): pods "POD_NAME" is forbidden: User
    "USERNAME@DOMAIN.com" cannot list resource "pods" in API group "" in the
    namespace "default"
    

    如果您沒有必要權限,請要求叢集管理員指派必要角色。

查看目前執行的項目

kubectl get 指令可協助您查看叢集中的整體動態。使用下列指令查看叢集中兩個最重要的元件 (節點和 Pod) 的狀態:

  1. 如要檢查節點是否正常運作,請查看所有節點及其狀態的詳細資料:

    kubectl get nodes
    

    輸出結果會與下列內容相似:

    NAME                                        STATUS   ROLES    AGE     VERSION
    
    gke-cs-cluster-default-pool-8b8a777f-224a   Ready    <none>   4d23h   v1.32.3-gke.1785003
    gke-cs-cluster-default-pool-8b8a777f-egb2   Ready    <none>   4d22h   v1.32.3-gke.1785003
    gke-cs-cluster-default-pool-8b8a777f-p5bn   Ready    <none>   4d22h   v1.32.3-gke.1785003
    

    如果狀態不是 Ready,則需要進一步調查。

  2. 如要檢查 Pod 是否正常運作,請查看所有 Pod 的詳細資料和狀態:

    kubectl get pods --all-namespaces
    

    輸出結果會與下列內容相似:

    NAMESPACE   NAME       READY   STATUS      RESTARTS   AGE
    kube-system netd-6nbsq 3/3     Running     0          4d23h
    kube-system netd-g7tpl 3/3     Running     0          4d23h
    

    如果狀態不是 Running,則需要進一步調查。以下列出您可能會看到的常見狀態:

    • Running:正常運作狀態。
    • Pending:Pod 正在等待排程到節點上。
    • CrashLoopBackOff:Pod 中的容器不斷在迴圈中當機,因為應用程式啟動後會因錯誤而結束,然後由 Kubernetes 重新啟動。
    • ImagePullBackOff:Pod 無法提取容器映像檔。

上述指令只是使用 kubectl get 指令的兩個範例。您也可以使用這個指令,進一步瞭解許多類型的 Kubernetes 資源。如需可探索的資源完整清單,請參閱 Kubernetes 說明文件中的 kubectl get

進一步瞭解特定資源

找出問題後,您需要取得更多詳細資料。舉例來說,如果 Pod 的狀態不是 Running,就可能發生問題。如要取得更多詳細資料,請使用 kubectl describe 指令。

舉例來說,如要說明特定 Pod,請執行下列指令:

kubectl describe pod POD_NAME -n NAMESPACE_NAME

更改下列內容:

  • POD_NAME:發生問題的 Pod 名稱。
  • NAMESPACE_NAME:Pod 所在的命名空間。 如果不確定命名空間為何,請查看 kubectl get pods 指令輸出內容中的 Namespace 欄。

kubectl describe 指令的輸出內容包含資源的詳細資訊。以下是排解 Pod 問題時,最實用的幾個部分:

  • Status:Pod 的目前狀態。
  • Conditions:Pod 的整體健康狀態和完備程度。
  • Restart Count:Pod 中的容器重新啟動次數。如果數量過高,可能需要留意。
  • Events:記錄這個 Pod 發生過的重要事項,例如排定節點、提取容器映像檔,以及是否發生任何錯誤。通常可以在 Events 區段中,直接找到 Pod 失敗的原因。

kubectl get 指令類似,您可以使用 kubectl describe 指令進一步瞭解多種資源。如需可探索的資源完整清單,請參閱 Kubernetes 說明文件中的「kubectl describe」。

後續步驟