Prometheus Target
普羅米修斯 (Prometheus) 是一套開源的監控系統,其中一個重要的功能就是監控 Service (服務) 的運作狀態,這個功能被稱為 Service Monitoring。
Service Monitoring 可以藉由 exporter,透過定義 HTTP endpoints 的方式,監控這些服務的運作狀態。普羅米修斯會定期呼叫這些 endpoints ,並且收集回應的 metrics 以了解服務是否正常運作、服務的吞吐量、延遲、錯誤率等相關資訊。
Service Monitoring 可以提供以下的監控能力:
- 監控服務的可用性,例如偵測服務是否還在運作、是否正常回應等等。
- 監控服務的效能,例如服務的吞吐量、延遲等等。
- 記錄服務的執行狀態,例如錯誤率、請求數量、處理時間等等。
- 透過 Service Monitoring,可以提升系統的可用性、效能及穩定性,讓系統管理者能夠更快速地偵測到問題、快速修復問題,降低系統的 downtime,提高系統的可靠度。
如何瀏覽exporter的內容
先到普羅米修斯的網頁的Target的地方,會可以看到現在的監控目標,如果設定的目標沒有正確出現,則可以去Service Discovery的頁籤去確認原因。
內容長這樣
無法存取rancher-monitoring-kubelet的exporter吐出的內容
serviceMonitor/kube-system/rancher-monitoring-kubelet/1 (7/7 up)
普羅米修斯在取得Pod的相關狀態是利用rancher-monitoring-kubelet
這個POD來取得相關資訊,但是我們會沒有辦法直接去讀取https://127.0.0.1:10250/metrics/cadvisor
這個網址,這是因為要讀取需要先透過K8S的認證
# 取得該namespace的所有密鑰
kubectl get secret -n cattle-monitoring-system
# 取得密鑰的內容
kubectl -n cattle-monitoring-system get secret rancher-monitoring-prometheus-token-hvlqt -o jsonpath={.data.token} | base64 –d
# 將pod-exporter的網址後面加上-H並帶入密鑰
curl https://127.0.0.1:10250/metrics/cadvisor -k -H “Authorization: Bearer token_content_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”
Service Monitor抓不到監控目標的可能原因
以下為一個簡單範例
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: generation: 4 labels: app.kubernetes.io/instance: srs-json-exporter manager: agent operation: Update name: json-exporter namespace: stu-srs spec: endpoints: - interval: 30s params: module: - default target: - http://127.0.0.1:1985/api/v1/streams/ port: json-exporter jobLabel: jobLabel namespaceSelector: matchNames: - stu-srs selector: matchLabels: app.kubernetes.io/instance: srs-json-exporter
在selector 字段指定要監控的 Service 的標籤選擇器,而不是 Pod 的標籤選擇器。
在這個 YAML 配置文件中,ServiceMonitor 的 selector 字段設置為 matchLabels: app: json-exporter,這代表 ServiceMonitor 將監控符合 app: json-exporter 標籤的 Service。
如果這個 Service 沒有符合 app: json-exporter 標籤,那麼 ServiceMonitor 就無法監控這個 Service。
如果您確認了 Service 的標籤設置是正確的,那麼可能是因為 ServiceMonitor 與 Service 所在的命名空間不匹配,導致 ServiceMonitor 無法監控 Service。
您可以檢查 ServiceMonitor 的 namespaceSelector 設置是否正確。namespaceSelector 字段指定要監控的命名空間。如果這個 Service 所在的命名空間不在 matchNames 列表中,那麼 ServiceMonitor 就無法監控這個 Service。