排解系統指標問題

本頁面說明如何解決 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 預設服務帳戶,請完成下列步驟:

控制台

  1. 前往「歡迎」頁面:

    前往「歡迎」頁面

  2. 在「專案編號」欄位中,按一下「複製到剪貼簿」。
  3. 前往「IAM」(身分與存取權管理) 頁面:

    前往「身分與存取權管理」頁面

  4. 按一下 「授予存取權」。
  5. 在「New principals」(新主體) 欄位中,指定下列值:
    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    將 PROJECT_NUMBER 替換為您複製的專案編號。
  6. 在「選取角色」選單中,選取「Kubernetes Engine 預設節點服務帳戶」角色。
  7. 按一下 [儲存]。

gcloud

  1. 找出 Google Cloud 專案編號:
    gcloud projects describe PROJECT_ID \
        --format="value(projectNumber)"

    將 PROJECT_ID 替換為專案 ID。

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

    12345678901
    
  2. 將 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 持續當機,您可以按照下列指示查看終止原因:

  1. 取得 GKE 指標代理程式 Pod 的名稱:

    kubectl get pods -n kube-system -l component=gke-metrics-agent
    
  2. 找出狀態為 CrashLoopBackOff 的 Pod。

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

    NAME                    READY STATUS           RESTARTS AGE
    gke-metrics-agent-5857x 0/1   CrashLoopBackOff 6        12m
    
  3. 描述狀態為 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"
    
  4. 為指標代理程式失敗的節點新增節點標籤。您可以使用永久或暫時節點標籤。建議您嘗試再增加 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
    • COMPUTE_LOCATION:叢集的 Compute Engine 位置。

    或者,您也可以使用下列指令,新增升級後不會保留的暫時節點標籤:

    kubectl label node/NODE_NAME \
    ADDITIONAL_MEMORY_NODE_LABEL --overwrite
    

    更改下列內容:

    • NODE_NAME:受影響指標代理程式的節點名稱。
    • ADDITIONAL_MEMORY_NODE_LABEL:額外記憶體節點標籤之一;請使用上述範例中的其中一個值。

後續步驟