排解觀測能力問題

本文說明如何找出 Google Distributed Cloud (GDC) 離線裝置中可能發生的部署失敗和作業事件,並說明系統顯示的所有快訊,協助您解決記錄和監控元件的常見問題。

找出可觀測性元件

可觀測性平台會將元件部署至機構基礎架構叢集中的 obs-system 命名空間。

基礎架構運算子 (IO) 的 Grafana 執行個體可存取機構層級指標,監控 CPU 使用率和儲存空間用量等基礎架構元件。此外,這項服務也提供營運和稽核記錄的存取權。此外,您也可以存取 GDC 可操作元件的快訊、記錄和指標。

GDC 監控和記錄堆疊會使用開放原始碼解決方案,做為可觀測性平台的一部分。這些元件會從 Kubernetes Pod、裸機、網路交換器、儲存空間和代管服務收集記錄檔和指標。

下表說明所有整合 Observability 平台的元件:

元件 說明
Prometheus Prometheus 是時間序列資料庫,用於收集及儲存指標,並評估快訊。Prometheus 會將指標儲存在機構基礎架構叢集的 Cortex 執行個體中,以供長期儲存。Prometheus 會以鍵/值組合的形式新增標籤,並從 Kubernetes 節點、Pod、裸機、網路交換器和儲存裝置收集指標。
Alertmanager Alertmanager 是使用者定義的管理系統,會在記錄或指標顯示系統元件故障或無法正常運作時傳送快訊。可管理 Prometheus 快訊的路由、靜音和彙整作業。
Loki Loki 是時間序列資料庫,可儲存及匯總各種來源的記錄。並為記錄建立索引,方便查詢。
Grafana Grafana 提供使用者介面 (UI),可查看 Prometheus 收集的指標,以及查詢對應 Loki 執行個體的稽核和作業記錄。使用者介面可讓您以視覺化方式呈現指標和快訊的資訊主頁。
Fluent Bit Fluent Bit 是一種處理器,可從各種元件或位置提取記錄檔,並傳送至 Loki。這項服務會在所有叢集的每個節點上執行。

找出部署失敗的原因

如果部署作業正在執行且健康狀態良好,元件會處於 READY 狀態。

請按照下列步驟找出部署失敗的原因:

  1. 確認元件的目前狀態:

    kubectl get -n obs-system TYPE/COMPONENT
    

    更改下列內容:

    • TYPE:元件類型
    • COMPONENT:元件名稱

    您會看到類似以下的輸出內容:

    NAME       READY  AGE
    COMPONENT  1/1    23h
    

    如果元件運作正常,輸出內容的 READY 欄會顯示 N/N 值。如果「READY」資料欄未顯示值,不一定表示失敗。服務可能需要更多時間處理。

  2. 檢查每個元件中的 Pod:

    kubectl get pods -n obs-system | awk 'NR==1 | /COMPONENT/'
    

    COMPONENT 替換為元件名稱。

    您會看到類似以下的輸出內容:

    NAME       READY  STATUS   RESTARTS  AGE
    COMPONENT  1/1    Running  0         23h
    

    確認 READY 欄顯示 N/N 值、STATUS 欄顯示 Running 值,且 RESTARTS 的數量不超過 2 值。

    如果重新啟動次數過多,可能表示有下列症狀:

    • Pod 發生故障,Kubernetes 會重新啟動。
    • STATUS」欄會顯示 CrashLoopBackoff 值。

    如要解決失敗狀態,請查看 Pod 的記錄

    如果 Pod 處於 PENDING 狀態,表示出現下列一或多種症狀:

    • Pod 正在等待網路存取權,以便下載必要的容器。
    • 設定問題導致 Pod 無法啟動。舉例來說,Pod 要求的 Secret 值遺失。
    • Kubernetes 叢集資源不足,無法排定 Pod,如果叢集上執行許多應用程式,就會發生這種情況。
  3. 判斷 PENDING 狀態的原因:

    kubectl describe -n obs-system pod/POD_NAME
    

    POD_NAME 替換為顯示 PENDING 狀態的 Pod 名稱。

    輸出內容會顯示 Pod 的詳細資料。

  4. 前往輸出內容的 Events 部分,查看列出 Pod 近期事件的表格,以及 PENDING 狀態的原因摘要。

    以下輸出內容顯示 Grafana StatefulSet 物件的 Events 區段範例:

    Events:
      Type    Reason            Age                From                    Message
      ----    ------            ----               ----                    -------
      Normal  SuccessfulCreate  13s (x3 over 12d)  statefulset-controller  create Pod grafana-0 in StatefulSet grafana successful
    

    如果 Pod 或任何其他資源在一段時間內沒有任何事件,您會收到下列輸出內容:

      Events:         <none>
    

確認 Observability 記錄堆疊是否正在執行

請按照下列步驟操作,確認記錄堆疊正在執行:

  1. 確認所有 Loki 執行個體或 Pod 都已注入 Istio Sidecar。確認名為 anthos-audit-logs-forwarder-SUFFIXanthos-log-forwarder-SUFFIX 的所有 Fluent Bit Pod 都已注入 Istio Sidecar。

  2. 確認所有 Loki 執行個體都在機構基礎架構叢集中執行,且沒有發生錯誤。

  3. 檢查 anthos-audit-logs-forwarderanthos-log-forwarder DaemonSet 物件的狀態,確認所有節點中的所有執行個體都正常運作。

  4. 確認您在所有叢集中,都取得過去五分鐘內 kube-apiserver-SUFFIX 容器的作業記錄,以及 Kubernetes API 伺服器的稽核記錄。如要這麼做,請在 Grafana 執行個體中執行下列查詢:

    • 作業記錄sum (count_over_time({service_name="apiserver"} [5m])) by (cluster, fluentbit_pod)
    • 稽核記錄sum (count_over_time({cluster=~".+"} [5m])) by (cluster, node)

    您必須為機構基礎架構叢集中的所有控制平面節點取得非零值。

確認 Observability 監控堆疊正在執行中

請按照下列步驟操作,確認監控堆疊正在執行:

  1. 確認 Grafana 執行個體在機構基礎架構叢集中執行。grafana-0 Pod 必須在下列命名空間中順利執行:

    • obs-system
    • infra-obs-obs-system
    • platform-obs-obs-system
  2. 確認所有監控元件都位於 Istio 服務網格中。逐步完成「找出部署失敗」一節中的步驟。下列每個 Pod 的 READY 資料欄都必須顯示所有容器已準備就緒。舉例來說,值為 3/3 表示三個容器都已準備就緒。此外,Pod 必須有 istio-proxy 容器。 如果 Pod 不符合上述條件,請重新啟動 Pod:

    Pod 名稱 準備就緒的容器數量
    cortex- 2/2
    cortex-etcd-0 2/2
    cortex-proxy-server- 2/2
    cortex-tenant- 2/2
    meta-blackbox-exporter- 2/2
    meta-grafana-0 3/3
    meta-grafana-proxy-server- 2/2
    meta-prometheus-0 4/4
    cortex-alertmanager- 2/2
    cortex-compactor- 2/2
    cortex-distributor- 2/2
    cortex-etcd-0 2/2
    cortex-ingester- 2/2
    cortex-querier- 2/2
    cortex-query-frontend- 2/2
    cortex-query-scheduler- 2/2
    cortex-ruler- 2/2
    cortex-store-gateway- 2/2
    cortex-tenant- 2/2
    grafana-proxy-server- 2/2
    meta-blackbox-exporter- 2/2
    meta-grafana-0 3/3
    meta-grafana-proxy-server-* 2/2
    meta-prometheus-0 4/4

  3. 確認 Cortex 執行時未發生錯誤。

擷取可觀測性記錄

下表列出您必須執行的指令,才能擷取 Observability 平台部署的各個元件記錄。

元件 記錄擷取指令
grafana kubectl logs -n obs-system statefulset/grafana
anthos-prometheus-k8s kubectl logs -n obs-system statefulset/anthos-prometheus-k8s
alertmanager kubectl logs -n obs-system statefulset/alertmanager
ops-logs-loki-io kubectl logs -n obs-system statefulset/ops-logs-loki-io
ops-logs-loki-io-read kubectl logs -n obs-system statefulset/ops-logs-loki-io-read
ops-logs-loki-all kubectl logs -n obs-system statefulset/ops-logs-loki-all
ops-logs-loki-all-read kubectl logs -n obs-system statefulset/ops-logs-loki-all-read
audit-logs-loki-io kubectl logs -n obs-system statefulset/audit-logs-loki-io
audit-logs-loki-io-read kubectl logs -n obs-system statefulset/audit-logs-loki-io-read
audit-logs-loki-pa kubectl logs -n obs-system statefulset/audit-logs-loki-pa
audit-logs-loki-pa-read kubectl logs -n obs-system statefulset/audit-logs-loki-pa-read
audit-logs-loki-all kubectl logs -n obs-system statefulset/audit-logs-loki-all
audit-logs-loki-all-read kubectl logs -n obs-system statefulset/audit-logs-loki-all-read
anthos-log-forwarder kubectl logs -n obs-system daemonset/anthos-log-forwarder
anthos-audit-logs-forwarder kubectl logs -n obs-system daemonset/anthos-audit-logs-forwarder
oplogs-forwarder kubectl logs -n obs-system daemonset/oplogs-forwarder
logmon-operator kubectl logs -n obs-system deployment/logmon-operator

如要查看元件先前執行個體的記錄,請在每個指令結尾加上 -p 旗標。新增 -p 旗標後,您就能查看先前失敗執行個體的記錄,而非目前執行的執行個體。

查看設定

可觀測性堆疊會使用 Kubernetes API 自訂資源,設定監控和記錄管道。

LoggingPipeline 自訂資源會部署在機構基礎架構叢集中,並設定 Loki 執行個體。

下列指令會顯示可對記錄管道執行的動作:

  • 查看記錄管道部署作業的目前設定:

    kubectl get loggingpipeline -n obs-system default -o yaml
    
  • 變更記錄管道部署的設定:

    kubectl edit loggingpipeline -n obs-system default
    

GDC 使用名為 logmon-operator 的記錄和監控運算子,管理 Prometheus 和 Fluent Bit 等可觀測性元件的部署作業。logmon-operator 元件的 API 是 logmon 自訂資源定義。logmon 自訂資源定義會指示 logmon-operator 如何為部署作業設定可觀測性。這個自訂資源定義包含儲存指標的磁碟區屬性、Alertmanager 的警報規則、用於收集指標的 Prometheus 設定,以及用於資訊主頁的 Grafana 設定。

下列指令會顯示可對 logmon 自訂資源定義執行的動作:

  • 查看 Observability 部署作業的目前設定:

    kubectl get logmon -n obs-system logmon-default -o yaml
    
  • 變更可觀測性部署作業的設定:

    kubectl edit logmon -n obs-system logmon-default
    

執行任一指令的輸出內容可能會參照多個 Kubernetes ConfigMap 物件,以進行進一步設定。舉例來說,您可以在個別的 ConfigMap 物件中設定 Alertmanager 規則,並依名稱在 logmon 自訂資源定義中參照該物件。您可以透過名為 logmon 的自訂資源定義,變更及查看 Alertmanager 設定。gpc-alertmanager-config

如要查看 Alertmanager 設定,請執行下列指令:

kubectl get configmap -n obs-system gpc-alertmanager-config -o yaml

常見問題

本節說明部署可觀測性平台時可能會遇到的常見問題。

無法存取 Grafana

根據預設,Grafana 不會向 Kubernetes 叢集外部的機器公開。如要暫時從機構基礎架構叢集外部存取 Grafana 介面,您可以將 Service 轉送至本機主機。如要轉送 Service 的通訊埠,請執行:

kubectl port-forward -n gpc-system service/grafana 33000\:3000

在網路瀏覽器中前往 http://localhost:33000,查看部署項目的 Grafana 資訊主頁。如要結束程序,請按下 Control+C 鍵。

Grafana 執行速度緩慢

Grafana 執行速度緩慢表示:

  • 對 Prometheus 或 Loki 的查詢傳回過多資料。
  • 查詢傳回的資料量過多,無法在單一圖表上顯示。

如要解決 Grafana 速度緩慢的問題,請檢查自訂 Grafana 資訊主頁上的查詢。如果查詢傳回的資料量過多,無法在單一圖表上顯示,請考慮減少顯示的資料量,以提升資訊主頁效能。

Grafana 資訊主頁未顯示任何指標或記錄

如果 Grafana 未顯示任何指標或記錄,可能原因如下:

  • Grafana 資料來源設定有誤。
  • 系統無法連線至監控或記錄資料來源。
  • 系統未收集指標或記錄。

如要查看記錄和指標,請按照下列步驟操作:

  1. 在 Grafana 使用者介面中,按一下「資訊主頁設定」
  2. 選取「資料來源」
  3. 在「資料來源」頁面中,確認您看到下列來源:
名稱 機構 網址
Audit Logs All http://audit-logs-loki-io-read.obs-system.svc:3100
Operational Logs Root http://ops-logs-loki-io-read.obs-system.svc:3100
Operational Logs Org http://ops-logs-loki-all-read.obs-system.svc:3100
prometheus http://anthos-prometheus-k8s.obs-system.svc:9090

如果缺少這些資料來源,表示可觀測性堆疊無法正確設定 Grafana。

如果資料來源設定正確,但沒有顯示任何資料,這可能表示收集指標或記錄檔以提供給 Prometheus 或 Loki 的 Service 物件有問題。

Prometheus 收集指標時,會遵循提取模型,定期查詢 Service 物件的指標,並儲存找到的值。如要讓 Prometheus 探索 Service 物件以收集指標,必須符合下列條件:

  • 所有 Service 物件的 Pod 都會加上 'monitoring.gke.io/scrape: "true"' 註解。

  • Prometheus 指標格式會透過 HTTP 公開 Pod 指標。根據預設,Prometheus 會在 http://POD_NAME:80/metrics 端點尋找這些指標。如有需要,您可以透過註解覆寫通訊埠、端點和結構定義。

Fluent Bit 會收集記錄,並在 Kubernetes 叢集的每個節點上執行。Fluent Bit 會將記錄傳送至 Loki,以供長期儲存。

如果 Grafana 中沒有記錄,請嘗試下列解決方法:

  • 檢查 Loki 執行個體的記錄,確保執行時沒有發生錯誤。

  • 如果 Loki 執行個體運作正常,但記錄檔未顯示,請檢查 Fluent Bit 中的記錄檔,確保服務運作正常。如要瞭解如何提取記錄,請參閱「擷取可觀測性記錄」。

Alertmanager 未開啟快訊

如果 Alertmanager 無法開啟快訊,請按照下列步驟操作:

  1. gpc-system 命名空間內的 configMap 物件中,確認標籤 logmon: system_metrics 是否存在。
  2. 確認 configMap 資料區段包含名為 alertmanager.yml 的鍵。alertmanager.yml 鍵的值必須是有效 Alertmanager 設定檔中包含的快訊規則。
  3. 請確認 gpc-system 命名空間中名為 logmon-defaultlogmon 自訂資源定義包含對 configMap 物件的參照。logmon-default 自訂資源定義必須包含 configMap 物件的名稱,如以下範例所示:

    apiVersion: addons.gke.io/v1
    kind: Logmon
    spec:
      system_metrics:
        outputs:
          default_prometheus:
            deployment:
              components:
                alertmanager:
                  alertmanagerConfigurationConfigmaps:
                    - alerts-config
    

    範例中的 alerts-config 值是 configMap 物件的名稱。

Alertmanager 未將快訊傳送至設定的通知管道

即使 Alertmanager 在 Grafana 執行個體中產生快訊,設定錯誤仍可能導致您無法在設定為通知管道的外部軟體 (例如 Slack) 中收到通知。

如要在外部軟體中接收快訊,請按照下列步驟操作:

  1. 確認 Alertmanager 設定檔中的值格式正確。Alertmanager 觸發快訊時,會查詢外部軟體上的 Webhook。

  2. 確認連結至外部軟體的 Webhook 網址正確無誤。 如果網址正確無誤,請確認軟體已設定為接受 Webhook。您可能需要產生 API 金鑰才能存取外部服務 API,或是目前的 API 金鑰已過期,因此需要重新整理。

  3. 如果外部服務位於 GDC 氣隙裝置部署作業之外,請確保機構基礎架構叢集已設定輸出規則。這項設定可讓 Alertmanager 將要求傳送至內部 Kubernetes 網路以外的服務。如果無法驗證輸出規則,Alertmanager 可能就找不到外部軟體。

您無法查看專案範圍工作負載的指標

請按照下列步驟操作,套用解決方法並取得工作負載的指標:

  1. 確認 MonitoringTarget 自訂資源的狀態為 Ready
  2. 如要擷取工作負載,您必須在工作負載 Pod 規格中,宣告指定給 MonitoringTarget 的所有目標資訊。舉例來說,如果您宣告指標可透過通訊埠 8080 取得,工作負載 Pod 就必須向 Kubernetes 宣告通訊埠 8080 已開啟。否則 Prometheus 會忽略該工作負載。
  3. Prometheus 會執行多個分片,因此並非所有 Prometheus Pod 都會擷取 Pod。您可以從每個 Prometheus Pod 的名稱中找出分片編號。舉例來說,primary-prometheus-shard0-replica0-0 是分片 0 的一部分。從每個 Prometheus 分片檢查要抓取的 Pod:
    1. obs-system 命名空間中 Prometheus 的 primary-prometheus-shardSHARD_NUMBER-replica0-0 Pod 轉送至通訊埠,即可存取 Prometheus UI。每次檢查新分片時,請將 Pod 名稱中的 SHARD_NUMBER 替換為遞增數字。
    2. 在網路瀏覽器中前往 Prometheus UI,然後按照下列步驟操作:
      1. 依序按一下「狀態」>「目標」
      2. 確認要擷取的 Pod 是否在清單中。如果不是,請檢查下一個分片。如果沒有其他分片可檢查,請重新驗證 Prometheus 是否有足夠資訊可探索分片。
    3. 確認 Prometheus 的 primary-prometheus-shardSHARD_NUMBER-replica0-0 Pod 在 obs-system 命名空間中記錄錯誤。
  4. 確認 obs-system 命名空間中的 cortex-tenant Pod 記錄錯誤。

未建立資訊主頁

請按照下列步驟操作,套用解決方法並找出無法建立資訊主頁的原因:

  1. 查看 Dashboard 自訂資源的狀態,找出所有錯誤。自訂資源必須有 Ready 狀態。
  2. 請確認您檢查的 Grafana 執行個體正確無誤。舉例來說,如果您在名為 my-namespace 的專案命名空間中部署資訊主頁,則資訊主頁必須位於 https://GDCH_URL/my-namespace/grafana 端點的 Grafana 執行個體中。
  3. 檢查 gpc-system 命名空間中 fleet-admin-controller 的記錄。在記錄中搜尋資訊主頁名稱,找出與資訊主頁相關的錯誤。如果發現錯誤,表示 configMap 物件中的 JSON 檔案格式有誤,請務必修正。
  4. 檢查 PROJECT_NAME-obs-system 命名空間中的 Grafana 記錄,找出任何錯誤。資訊主頁會查詢 Grafana REST API,因此必須先讓 Grafana 正常運作,才能建立資訊主頁。

警報未開啟

請按照下列步驟操作,套用解決方法並找出無法開啟快訊的原因:

  1. 確認 Cortex 和 Loki 都處於 bucket-storage 模式。後端必須以 Bucket 儲存空間為基礎,規則才能正常運作。
  2. 確認 MonitoringRuleLoggingRule 自訂資源的狀態為 Ready
  3. 檢查下列快訊條件:
    • PromQL 和 LogQL 運算式:將您使用的所有函式與「建立快訊規則」說明文件進行比較,確保規則設定符合需求。確認運算式傳回 truefalse 值。
    • 持續時間:自訂資源的 for 欄位定義條件必須為 true 的時間長度。interval 欄位定義評估條件的頻率。互相檢查這些欄位的值,確保條件符合邏輯。
  4. 在 Grafana UI 中,使用「Alerts」頁面檢查快訊是否開啟。
  5. 如果 Grafana 顯示快訊已開啟,請檢查通知管道,並確認 Alertmanager 可以聯絡這些管道來產生快訊。

無法提供預期記錄

如果沒有看到元件的運作記錄,請按照下列步驟操作:

  1. 確認元件是否正在執行並產生記錄。
  2. 確認是否應以內建功能的形式收集元件記錄。如果沒有,請確保您已部署具有有效規格且狀態為 ReadyLoggingTarget 自訂資源。

如果沒有看到元件的稽核記錄,請按照下列步驟操作:

  1. 如果元件會將記錄寫入檔案,請確認節點檔案系統中 /var/log/audit/SERVICE_NAME/NAMESPACE/ACCESS_LEVEL/audit.log 路徑下確實存在該檔案。
  2. 確認同一節點上的 anthos-audit-logs-forwarder-SUFFIX Pod 沒有錯誤。
  3. 如果元件使用系統記錄端點接收記錄,請確認您已部署 AuditLoggingTarget 自訂資源,且規格有效並處於 Ready 狀態。

找出預先定義的快訊規則

本節包含有關可觀測性元件中預先定義的警報規則資訊,這些規則會通知您系統故障。

Loki 中預先定義的快訊規則

下表列出 Loki 中預先安裝的稽核記錄失敗警示規則:

Loki 中預先安裝的快訊規則,可偵測稽核記錄失敗情形
名稱 類型 說明
FluentBitAuditLoggingWriteFailure 重大 Fluent Bit 無法轉送過去五分鐘內的稽核記錄。
LokiAuditLoggingWriteFailure 重大 Loki 無法將稽核記錄寫入後端儲存空間。

如果顯示一或多則這類快訊,表示系統遺失至少一筆稽核記錄。

Prometheus 中預先定義的快訊規則

下表列出 Prometheus 中 Kubernetes 元件的預先安裝警報規則:

Prometheus 中預先安裝的警報規則
名稱 類型 說明
KubeAPIDown 重大 Kube API 從 Prometheus 目標探索中消失 15 分鐘。
KubeClientErrors 警告 Kubernetes API 伺服器用戶端的錯誤率已超過 0.01 達 15 分鐘。
KubeClientErrors 重大 Kubernetes API 伺服器用戶端的錯誤率已超過 0.1 達 15 分鐘。
KubePodCrashLooping 警告 Pod 處於當機迴圈狀態的時間超過 15 分鐘。
KubePodNotReady 警告 Pod 處於未就緒狀態的時間已超過 15 分鐘。
KubePersistentVolumeFillingUp 重大 已聲明擁有權的 PersistentVolume 物件可用位元組數小於 0.03。
KubePersistentVolumeFillingUp 警告 已聲明 PersistentVolume 物件的可用位元組數小於 0.15。
KubePersistentVolumeErrors 重大 永久磁碟區已處於 FailedPending 階段五分鐘。
KubeNodeNotReady 警告 節點已超過 15 分鐘未就緒。
KubeNodeCPUUsageHigh 重大 節點的 CPU 使用率超過 80%。
KubeNodeMemoryUsageHigh 重大 節點的記憶體用量超過 80%。
NodeFilesystemSpaceFillingUp 警告 節點的檔案系統用量超過 60%。
NodeFilesystemSpaceFillingUp 重大 節點的檔案系統用量超過 85%。
CertManagerCertExpirySoon 警告 有憑證將於 21 天後到期。
CertManagerCertNotReady 重大 憑證在 10 分鐘後仍無法提供流量。
CertManagerHittingRateLimits 重大 在五分鐘內建立或續訂憑證時,達到速率限制。
DeploymentNotReady 重大 機構基礎架構叢集上的部署作業處於非就緒狀態的時間已超過 15 分鐘。
StatefulSetNotReady 重大 機構基礎架構叢集上的 StatefulSet 物件處於非就緒狀態的時間已超過 15 分鐘。
AuditLogsForwarderDown 重大 anthos-audit-logs-forwarder DaemonSet 已停機超過 15 分鐘。
AuditLogsLokiDown 重大 audit-logs-loki StatefulSet 處於非就緒狀態的時間已超過 15 分鐘。