如要診斷 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 客戶服務聯絡,建立支援案件。
- 在 StackOverflow 上提問,並使用
google-kubernetes-engine
標記搜尋類似問題,向社群尋求支援。你也可以加入#kubernetes-engine
Slack 頻道,取得更多社群支援。 - 使用公開問題追蹤工具回報錯誤或提出功能要求。