使用 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。

後續步驟