排解監控資訊主頁的問題

如果無法在 Cloud Monitoring 中查看 Google Kubernetes Engine (GKE) 監控資訊主頁,或資訊主頁顯示的資料不完整,您可能就無法觀察及回應叢集和工作負載中的問題。

請參閱本文,診斷及解決 GKE 監控資訊主頁的問題。請參閱相關指引,瞭解如何確認 Cloud Monitoring 是否已啟用、檢查 Google Cloud 控制台和帳戶設定,以及排解 GKE 資源的記錄和快訊政策問題。

平台管理員和營運人員,以及使用 Cloud Monitoring 資訊主頁瞭解 GKE 叢集和應用程式健康狀態與效能的應用程式開發人員,都必須掌握這項資訊。如要進一步瞭解 Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。

如要進一步瞭解如何使用這些資訊主頁排解叢集和工作負載的問題,請參閱「在 Google Cloud 控制台中評估叢集和工作負載健康狀態」。

根據預設,建立叢集時會啟用 Monitoring。如果您在 Monitoring 中查看提供的 Google Cloud 資訊主頁時,沒有看到 GKE 資訊主頁,表示所選 Google Cloud 專案中的叢集未啟用 Monitoring。啟用監控功能即可查看這些資訊主頁。

資訊主頁中沒有 Kubernetes 資源

如果 GKE 資訊主頁未顯示任何 Kubernetes 資源,請檢查下列事項:

選取的 Google Cloud 專案

確認您已從 Google Cloud 控制台選單列的下拉式選單中選取正確的 Google Cloud 專案。您必須選取您要查看其資料的專案。

叢集活動

如果叢集才剛建立,請稍候幾分鐘,等待資料填入。詳情請參閱「為 GKE 設定記錄和監控功能」。

日期範圍

所選日期範圍可能太窄。您可以使用資訊主頁工具列中的「時間」選單,選取其他日期範圍或定義「自訂」範圍。

查看資訊主頁的權限

查看服務的部署詳細資料或 Google Cloud 專案指標時,如果看到下列任一權限遭拒錯誤訊息,請更新您的 Identity and Access Management 角色,加入 roles/monitoring.viewer 或 roles/viewer:

  • You do not have sufficient permissions to view this page
  • You don't have permissions to perform the action on the selected resources

詳情請參閱預先定義的角色。

叢集和節點服務帳戶的權限,可將資料寫入 Monitoring 和 Logging

如果您在 Google Cloud 控制台的「Enabled APIs and services」(已啟用的 API 和服務) 頁面中看到高錯誤率,表示服務帳戶可能缺少下列角色:

  • roles/logging.logWriter:在 Google Cloud 控制台中,這個角色名為「記錄寫入者」。如要進一步瞭解 Logging 角色,請參閱「Logging 存取控管指南」。

  • roles/monitoring.metricWriter:在 Google Cloud 控制台中,這個角色名為「Monitoring 指標寫入者」。如要進一步瞭解 Monitoring 角色,請參閱 Monitoring 存取控管指南。

  • roles/stackdriver.resourceMetadata.writer:在 Google Cloud 控制台中,這個角色名為「Stackdriver 資源中繼資料寫入者」。這個角色可授予資源中繼資料的唯寫存取權,並提供代理程式傳送中繼資料所需的適切權限。如要進一步瞭解 Monitoring 角色,請參閱「Monitoring 存取控管指南」。

如要列出服務帳戶,請在 Google Cloud 控制台中前往「IAM 與管理」,然後選取「服務帳戶」。

無法查看記錄

如果資訊主頁未顯示記錄,請檢查下列事項:

代理正在執行且健康狀態良好

GKE 1.17 以上版本會使用 Fluent Bit 擷取記錄。Fluent Bit 是在 Kubernetes 節點上執行的 Logging 代理程式。 如要檢查代理程式是否正常運作,請按照下列步驟操作:

  1. 執行下列指令,檢查代理程式是否正在重新啟動:

    kubectl get pods -l k8s-app=fluentbit-gke -n kube-system
    

    如果沒有重新啟動,輸出內容會類似下列內容:

    NAME                  READY   STATUS    RESTARTS   AGE
    fluentbit-gke-6zr6g   2/2     Running   0          44d
    fluentbit-gke-dzh9l   2/2     Running   0          44d
    
  2. 執行下列指令,檢查 Pod 狀態條件:

    JSONPATH='{range .items[*]};{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status},{end}{end};'  \
     && kubectl get pods -l k8s-app=fluentbit-gke -n kube-system -o jsonpath="$JSONPATH" | tr ";" "\n"
    

    如果部署作業健康狀態良好,輸出內容會大致如下:

    fluentbit-gke-nj4qs:Initialized=True,Ready=True,ContainersReady=True,PodScheduled=True,
    fluentbit-gke-xtcvt:Initialized=True,Ready=True,ContainersReady=True,PodScheduled=True,
    
  3. 執行下列指令,檢查 Pod 狀態,這有助於判斷部署項目是否正常運作:

    kubectl get daemonset -l k8s-app=fluentbit-gke -n kube-system
    

    如果部署作業正常運作,輸出結果會與下列內容相似:

    NAME            DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
    fluentbit-gke   2         2         2       2            2           kubernetes.io/os=linux   5d19h
    

    在這個範例輸出內容中,所需狀態與目前狀態相符。

如果代理程式在這些情況下正常運作,但您仍未看到所有記錄,可能是因為代理程式超載而捨棄記錄。

代理程式過載並捨棄記錄

如果節點的記錄量超出代理程式負荷,您可能就無法看到所有記錄。GKE 中的預設 Logging 代理程式設定,是針對每個節點每秒 100 KiB 的速率進行調整,如果記錄檔量超過該限制,代理程式可能會開始捨棄記錄檔。

如要判斷是否達到這項限制,請留意下列指標:

  • 使用 container_name=fluentbit-gke 篩選條件查看 kubernetes.io/container/cpu/core_usage_time 指標,確認 Logging 代理程式的 CPU 使用率是否接近或達到 100%。

  • 查看按 logging.googleapis.com/byte_count 分組依據的 metadata.system_labels.node_name 指標,確認是否有任何節點達到每秒 100 KiB。

如果出現上述任一情況,您可以為叢集新增節點,減少節點的記錄量。如果所有記錄檔容量都來自單一 Pod,則需要減少該 Pod 的容量。

如要進一步瞭解如何調查及解決 GKE 記錄相關問題,請參閱「排解 GKE 記錄問題」。

事件未與 GKE 資源相符?

如果警告政策條件會匯總不同 GKE 資源的指標,您可能需要編輯政策條件,加入更多 GKE 階層標籤,將事件與特定實體建立關聯。

舉例來說,您可能有兩個 GKE 叢集,一個用於正式環境,另一個用於測試環境,每個叢集都有自己的服務 lilbuddy-2 副本。如果警告政策條件會彙整兩個叢集中容器的指標,GKE 監控資訊主頁就無法將這項事件與正式版服務或測試版服務建立專屬關聯。

如要解決這個問題,請在政策的「Group By」(分組依據) 欄位中新增 namespace、cluster 和 location,將警告政策指定給特定服務。在快訊的事件資訊卡上,按一下「更新警告政策」連結,開啟相關警告政策的「編輯警告政策」頁面。您可以在這裡更新警告政策,加入額外資訊,讓資訊主頁找到相關聯的資源。

更新警告政策後,GKE 監控資訊主頁就能將所有日後事件與特定叢集中的專屬服務建立關聯,提供更多資訊來診斷問題。

視用途而定,除了將這些標籤新增至「Group By」(分組依據) 欄位外,您可能還需要篩選其中部分標籤。舉例來說,如果只想接收正式環境叢集的快訊,可以篩選 cluster_name。

後續步驟