本頁面說明如何解決 Google Kubernetes Engine (GKE) 叢集上的系統指標相關問題。
叢集的指標未顯示於 Cloud Monitoring 中
確認您已在專案中啟用 Monitoring API 和 Logging API。此外,請確認您可以在Google Cloud 控制台的 Cloud Monitoring 總覽中查看專案。
如果問題持續發生,請檢查下列可能原因:
您是否已在叢集上啟用監控功能?
使用 Google Cloud 控制台和 Google Cloud CLI 建立的叢集預設會啟用監控功能,但您仍可點選控制台 Google Cloud 中的叢集詳細資料,或執行下列指令來進行確認:
gcloud container clusters describe CLUSTER_NAME
這項指令的輸出內容應包含
monitoringConfig
區段中enableComponents
清單的SYSTEM_COMPONENTS
,如下列範例所示:monitoringConfig: componentConfig: enableComponents: - SYSTEM_COMPONENTS
如果監控功能未啟用,請執行以下指令進行啟用:
gcloud container clusters update CLUSTER_NAME --monitoring=SYSTEM
距離上次建立叢集或啟用監控功能過了多少時間?
新叢集的指標最多需要一小時的作業時間才會顯示於 Cloud Monitoring 中。
叢集中的
kube-system
命名空間是否正在執行heapster
或gke-metrics-agent
(OpenTelemetry Collector)?這個 Pod 無法排程工作負載的原因可能是叢集資源不足。執行
kubectl get pods --namespace=kube-system
並檢查名稱中含有heapster
或gke-metrics-agent
的 Pod,確認 Heapster 或 OpenTelemetry 是否正在執行。叢集的控制層是否能與節點通訊?
Cloud Monitoring 需要這項通訊能力才能運作。您可以執行下列指令,檢查控制層是否與節點通訊:
kubectl logs POD_NAME
如果此指令傳回錯誤,則問題可能是 SSH 通道引起的。如需疑難排解步驟,請參閱「排解 SSH 問題」。
找出並修正寫入指標的權限問題
GKE 會使用附加至節點的 IAM 服務帳戶,執行記錄和監控等系統工作。這些節點服務帳戶至少必須具備專案的「Kubernetes Engine 預設節點服務帳戶」(roles/container.defaultNodeServiceAccount
) 角色。根據預設,GKE 會使用專案中自動建立的 Compute Engine 預設服務帳戶做為節點服務帳戶。
如果貴機構強制執行 iam.automaticIamGrantsForDefaultServiceAccounts
機構政策限制,專案中的預設 Compute Engine 服務帳戶可能不會自動取得 GKE 的必要權限。
如要找出問題,請在叢集的系統監控工作負載中檢查
401
錯誤:[[ $(kubectl logs -l k8s-app=gke-metrics-agent -n kube-system -c gke-metrics-agent | grep -cw "Received 401") -gt 0 ]] && echo "true" || echo "false"
如果輸出內容為
true
,表示系統工作負載發生 401 錯誤,這表示缺少權限。如果輸出內容為false
, 請略過其餘步驟,並嘗試其他疑難排解程序。
如要將 roles/container.defaultNodeServiceAccount
角色授予 Compute Engine 預設服務帳戶,請完成下列步驟:
主控台
- 前往「歡迎」頁面:
- 在「專案編號」欄位中,按一下 「複製到剪貼簿」。
- 前往「IAM」(身分與存取權管理)IAM 頁面:
- 按一下「授予存取權」 。
- 在「New principals」(新增主體) 欄位中,指定下列值:
將PROJECT_NUMBER-compute@developer.gserviceaccount.com
PROJECT_NUMBER
替換為您複製的專案編號。 - 在「Select a role」(選取角色) 選單中,選取「Kubernetes Engine Default Node Service Account」(Kubernetes Engine 預設節點服務帳戶) 角色。
- 按一下 [儲存]。
gcloud
- 找出 Google Cloud 專案編號:
gcloud projects describe PROJECT_ID \ --format="value(projectNumber)"
將
PROJECT_ID
替換為您的專案 ID。輸出結果會與下列內容相似:
12345678901
- 將
roles/container.defaultNodeServiceAccount
角色指派給 Compute Engine 預設服務帳戶:gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --role="roles/container.defaultNodeServiceAccount"
將
PROJECT_NUMBER
替換為上一步的專案編號。
確認指標代理程式有足夠的記憶體
如果嘗試上述疑難排解步驟後,指標仍未顯示,可能是指標代理程式的記憶體不足。
在大多數情況下,預設分配給 GKE 指標代理程式的資源就已足夠。不過,如果 DaemonSet 持續當機,您可以按照下列指示檢查終止原因:
取得 GKE 指標代理程式 Pod 的名稱:
kubectl get pods -n kube-system -l component=gke-metrics-agent
找出狀態為
CrashLoopBackOff
的 Pod。輸出結果會與下列內容相似:
NAME READY STATUS RESTARTS AGE gke-metrics-agent-5857x 0/1 CrashLoopBackOff 6 12m
說明狀態為
CrashLoopBackOff
的 Pod:kubectl describe pod POD_NAME -n kube-system
將
POD_NAME
替換為上一步的 Pod 名稱。如果 Pod 的終止原因是
OOMKilled
,表示代理程式需要額外記憶體。輸出結果會與下列內容相似:
containerStatuses: ... lastState: terminated: ... exitCode: 1 finishedAt: "2021-11-22T23:36:32Z" reason: OOMKilled startedAt: "2021-11-22T23:35:54Z"
為指標代理程式失敗的節點新增節點標籤。您可以使用永久或暫時節點標籤。建議您嘗試再增加 20 MB。如果代理程式持續當機,您可以再次執行這個指令,並將節點標籤替換為要求更多額外記憶體的標籤。
如要使用永久標籤更新節點集區,請執行下列指令:
gcloud container node-pools update NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --node-labels=ADDITIONAL_MEMORY_NODE_LABEL \ --location=COMPUTE_LOCATION
更改下列內容:
NODEPOOL_NAME
:節點集區的名稱。CLUSTER_NAME
:現有叢集的名稱。ADDITIONAL_MEMORY_NODE_LABEL
:其中一個額外記憶體節點標籤;請使用下列其中一個值:- 如要加購 10 MB,請按
cloud.google.com/gke-metrics-agent-scaling-level=10
。 - 如要加購 20 MB,請按照下列步驟操作:
cloud.google.com/gke-metrics-agent-scaling-level=20
- 如要加購 50 MB,請輕觸「
cloud.google.com/gke-metrics-agent-scaling-level=50
」。 - 如要加購 100 MB:
cloud.google.com/gke-metrics-agent-scaling-level=100
- 如要加購 200 MB,請輕觸
cloud.google.com/gke-metrics-agent-scaling-level=200
。 - 如要加購 500 MB:
cloud.google.com/gke-metrics-agent-scaling-level=500
- 如要加購 10 MB,請按
COMPUTE_LOCATION
:叢集的 Compute Engine 位置。
或者,您也可以使用下列指令新增臨時節點標籤,升級後標籤不會保留:
kubectl label node/NODE_NAME \ ADDITIONAL_MEMORY_NODE_LABEL --overwrite
更改下列內容:
NODE_NAME
:受影響指標代理程式的節點名稱。ADDITIONAL_MEMORY_NODE_LABEL
:其中一個額外記憶體節點標籤;請使用上述範例中的其中一個值。
後續步驟
若您遇到與 Cloud Logging 代理程式有關的問題,請參閱其疑難排解說明文件。
如果無法在說明文件中找到問題的解決方法,請參閱「取得支援」一文,尋求進一步的協助, 包括下列主題的建議:
- 與 Cloud 客戶服務聯絡,建立支援案件。
- 在 StackOverflow 上提問,並使用
google-kubernetes-engine
標記搜尋類似問題,向社群尋求支援。你也可以加入#kubernetes-engine
Slack 頻道,取得更多社群支援。 - 使用公開問題追蹤工具回報錯誤或提出功能要求。