如要診斷 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) 的狀態:
如要檢查節點是否正常運作,請查看所有節點的詳細資料和狀態:
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,則需要進一步調查。如要檢查 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。
後續步驟
請閱讀「使用 Cloud Logging 進行歷史記錄分析」(本系列文章的下一頁)。
請參閱疑難排解情境範例,瞭解如何應用這些概念。
如需解決特定問題的建議,請參閱 GKE 的疑難排解指南。
如果無法在文件中找到問題的解決方案,請參閱「取得支援」一文,取得進一步協助,包括下列主題的建議:
- 向 Cloud Customer Care 團隊申請開立支援案件。
- 在 StackOverflow 上提問,並使用
google-kubernetes-engine標記搜尋類似問題,向社群尋求支援。您也可以加入#kubernetes-engineSlack 頻道,取得更多社群支援。 - 使用公開 Issue Tracker 開啟問題或功能要求。