本文說明如何找出 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
狀態。
請按照下列步驟找出部署失敗的原因:
確認元件的目前狀態:
kubectl get -n obs-system TYPE/COMPONENT
更改下列內容:
TYPE
:元件類型COMPONENT
:元件名稱
您會看到類似以下的輸出內容:
NAME READY AGE COMPONENT 1/1 23h
如果元件運作正常,輸出內容的
READY
欄會顯示N/N
值。如果「READY
」資料欄未顯示值,不一定表示失敗。服務可能需要更多時間處理。檢查每個元件中的 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,如果叢集上執行許多應用程式,就會發生這種情況。
判斷
PENDING
狀態的原因:kubectl describe -n obs-system pod/POD_NAME
將
POD_NAME
替換為顯示PENDING
狀態的 Pod 名稱。輸出內容會顯示 Pod 的詳細資料。
前往輸出內容的
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 記錄堆疊是否正在執行
請按照下列步驟操作,確認記錄堆疊正在執行:
確認所有 Loki 執行個體或 Pod 都已注入 Istio Sidecar。確認名為
anthos-audit-logs-forwarder-SUFFIX
和anthos-log-forwarder-SUFFIX
的所有 Fluent Bit Pod 都已注入 Istio Sidecar。確認所有 Loki 執行個體都在機構基礎架構叢集中執行,且沒有發生錯誤。
檢查
anthos-audit-logs-forwarder
和anthos-log-forwarder
DaemonSet
物件的狀態,確認所有節點中的所有執行個體都正常運作。確認您在所有叢集中,都取得過去五分鐘內
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 監控堆疊正在執行中
請按照下列步驟操作,確認監控堆疊正在執行:
確認 Grafana 執行個體在機構基礎架構叢集中執行。
grafana-0
Pod 必須在下列命名空間中順利執行:obs-system
infra-obs-obs-system
platform-obs-obs-system
確認所有監控元件都位於 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
確認 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 資料來源設定有誤。
- 系統無法連線至監控或記錄資料來源。
- 系統未收集指標或記錄。
如要查看記錄和指標,請按照下列步驟操作:
- 在 Grafana 使用者介面中,按一下「資訊主頁設定」 。
- 選取「資料來源」。
- 在「資料來源」頁面中,確認您看到下列來源:
名稱 | 機構 | 網址 |
---|---|---|
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 無法開啟快訊,請按照下列步驟操作:
- 在
gpc-system
命名空間內的configMap
物件中,確認標籤logmon: system_metrics
是否存在。 - 確認
configMap
資料區段包含名為alertmanager.yml
的鍵。alertmanager.yml
鍵的值必須是有效 Alertmanager 設定檔中包含的快訊規則。 請確認
gpc-system
命名空間中名為logmon-default
的logmon
自訂資源定義包含對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) 中收到通知。
如要在外部軟體中接收快訊,請按照下列步驟操作:
確認 Alertmanager 設定檔中的值格式正確。Alertmanager 觸發快訊時,會查詢外部軟體上的 Webhook。
確認連結至外部軟體的 Webhook 網址正確無誤。 如果網址正確無誤,請確認軟體已設定為接受 Webhook。您可能需要產生 API 金鑰才能存取外部服務 API,或是目前的 API 金鑰已過期,因此需要重新整理。
如果外部服務位於 GDC 氣隙裝置部署作業之外,請確保機構基礎架構叢集已設定輸出規則。這項設定可讓 Alertmanager 將要求傳送至內部 Kubernetes 網路以外的服務。如果無法驗證輸出規則,Alertmanager 可能就找不到外部軟體。
您無法查看專案範圍工作負載的指標
請按照下列步驟操作,套用解決方法並取得工作負載的指標:
- 確認
MonitoringTarget
自訂資源的狀態為Ready
。 - 如要擷取工作負載,您必須在工作負載 Pod 規格中,宣告指定給
MonitoringTarget
的所有目標資訊。舉例來說,如果您宣告指標可透過通訊埠8080
取得,工作負載 Pod 就必須向 Kubernetes 宣告通訊埠8080
已開啟。否則 Prometheus 會忽略該工作負載。 - Prometheus 會執行多個分片,因此並非所有 Prometheus Pod 都會擷取 Pod。您可以從每個 Prometheus Pod 的名稱中找出分片編號。舉例來說,
primary-prometheus-shard0-replica0-0
是分片0
的一部分。從每個 Prometheus 分片檢查要抓取的 Pod:- 將
obs-system
命名空間中 Prometheus 的primary-prometheus-shardSHARD_NUMBER-replica0-0
Pod 轉送至通訊埠,即可存取 Prometheus UI。每次檢查新分片時,請將 Pod 名稱中的SHARD_NUMBER
替換為遞增數字。 - 在網路瀏覽器中前往 Prometheus UI,然後按照下列步驟操作:
- 依序按一下「狀態」>「目標」。
- 確認要擷取的 Pod 是否在清單中。如果不是,請檢查下一個分片。如果沒有其他分片可檢查,請重新驗證 Prometheus 是否有足夠資訊可探索分片。
- 確認 Prometheus 的
primary-prometheus-shardSHARD_NUMBER-replica0-0
Pod 在obs-system
命名空間中記錄錯誤。
- 將
- 確認
obs-system
命名空間中的cortex-tenant
Pod 記錄錯誤。
未建立資訊主頁
請按照下列步驟操作,套用解決方法並找出無法建立資訊主頁的原因:
- 查看
Dashboard
自訂資源的狀態,找出所有錯誤。自訂資源必須有Ready
狀態。 - 請確認您檢查的 Grafana 執行個體正確無誤。舉例來說,如果您在名為
my-namespace
的專案命名空間中部署資訊主頁,則資訊主頁必須位於https://GDCH_URL/my-namespace/grafana
端點的 Grafana 執行個體中。 - 檢查
gpc-system
命名空間中fleet-admin-controller
的記錄。在記錄中搜尋資訊主頁名稱,找出與資訊主頁相關的錯誤。如果發現錯誤,表示configMap
物件中的 JSON 檔案格式有誤,請務必修正。 - 檢查
PROJECT_NAME-obs-system
命名空間中的 Grafana 記錄,找出任何錯誤。資訊主頁會查詢 Grafana REST API,因此必須先讓 Grafana 正常運作,才能建立資訊主頁。
警報未開啟
請按照下列步驟操作,套用解決方法並找出無法開啟快訊的原因:
- 確認 Cortex 和 Loki 都處於 bucket-storage 模式。後端必須以 Bucket 儲存空間為基礎,規則才能正常運作。
- 確認
MonitoringRule
和LoggingRule
自訂資源的狀態為Ready
。 - 檢查下列快訊條件:
- PromQL 和 LogQL 運算式:將您使用的所有函式與「建立快訊規則」說明文件進行比較,確保規則設定符合需求。確認運算式傳回
true
或false
值。 - 持續時間:自訂資源的
for
欄位定義條件必須為 true 的時間長度。interval
欄位定義評估條件的頻率。互相檢查這些欄位的值,確保條件符合邏輯。
- PromQL 和 LogQL 運算式:將您使用的所有函式與「建立快訊規則」說明文件進行比較,確保規則設定符合需求。確認運算式傳回
- 在 Grafana UI 中,使用「Alerts」頁面檢查快訊是否開啟。
- 如果 Grafana 顯示快訊已開啟,請檢查通知管道,並確認 Alertmanager 可以聯絡這些管道來產生快訊。
無法提供預期記錄
如果沒有看到元件的運作記錄,請按照下列步驟操作:
- 確認元件是否正在執行並產生記錄。
- 確認是否應以內建功能的形式收集元件記錄。如果沒有,請確保您已部署具有有效規格且狀態為
Ready
的LoggingTarget
自訂資源。
如果沒有看到元件的稽核記錄,請按照下列步驟操作:
- 如果元件會將記錄寫入檔案,請確認節點檔案系統中
/var/log/audit/SERVICE_NAME/NAMESPACE/ACCESS_LEVEL/audit.log
路徑下確實存在該檔案。 - 確認同一節點上的
anthos-audit-logs-forwarder-SUFFIX
Pod 沒有錯誤。 - 如果元件使用系統記錄端點接收記錄,請確認您已部署
AuditLoggingTarget
自訂資源,且規格有效並處於Ready
狀態。
找出預先定義的快訊規則
本節包含有關可觀測性元件中預先定義的警報規則資訊,這些規則會通知您系統故障。
Loki 中預先定義的快訊規則
下表列出 Loki 中預先安裝的稽核記錄失敗警示規則:
名稱 | 類型 | 說明 |
---|---|---|
FluentBitAuditLoggingWriteFailure |
重大 | Fluent Bit 無法轉送過去五分鐘內的稽核記錄。 |
LokiAuditLoggingWriteFailure |
重大 | Loki 無法將稽核記錄寫入後端儲存空間。 |
如果顯示一或多則這類快訊,表示系統遺失至少一筆稽核記錄。
Prometheus 中預先定義的快訊規則
下表列出 Prometheus 中 Kubernetes 元件的預先安裝警報規則:
名稱 | 類型 | 說明 |
---|---|---|
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 |
重大 | 永久磁碟區已處於 Failed 或 Pending 階段五分鐘。 |
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 分鐘。 |