排解系統指標問題


本頁面說明如何解決 Google Kubernetes Engine (GKE) 叢集上的系統指標相關問題。

叢集的指標未顯示於 Cloud Monitoring 中

確認您已在專案中啟用 Monitoring APILogging 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 命名空間是否正在執行 heapstergke-metrics-agent (OpenTelemetry Collector)?

    這個 Pod 無法排程工作負載的原因可能是叢集資源不足。執行 kubectl get pods --namespace=kube-system 並檢查名稱中含有 heapstergke-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」(身分與存取權管理)IAM 頁面:

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

  4. 按一下「授予存取權」
  5. 在「New principals」(新增主體) 欄位中,指定下列值:
    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    PROJECT_NUMBER 替換為您複製的專案編號。
  6. 在「Select a role」(選取角色) 選單中,選取「Kubernetes Engine Default Node Service Account」(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:其中一個額外記憶體節點標籤;請使用上述範例中的其中一個值。

後續步驟