使用容器深入解析將 Prometheus 計量傳送至 Log Analytics 工作區

本文說明如何將 Prometheus 計量從由容器深入解析監視的 Kubernetes 叢集傳送至 Log Analytics 工作區。 執行此設定之前,您應該先確定您使用適用於 Prometheus 的 Azure 監視器受管理服務從叢集擷取 Prometheus 計量,這是監視叢集的建議方法。 只有當您也想要將此相同的資料傳送至 Log Analytics 工作區時,才能使用本文所述的設定,以便您使用記錄查詢記錄搜尋警示分析資料。

此設定需要設定 Azure 監視器代理程式的「監視附加元件」,這是容器深入解析用於將資料傳送至 Log Analytics 工作區的相同附加元件。 這需要透過匯出工具或 Pod 來公開 Prometheus 計量端點,然後為容器深入解析所使用的 Azure 監視器代理程式設定監視附加元件,如下圖所示。

Diagram of container monitoring architecture sending Prometheus metrics to Azure Monitor Logs.

Prometheus 擷取設定 (針對儲存為記錄的計量)

從下列兩個檢視方塊中的其中一個執行主動擷取 Prometheus 計量,並將計量傳送至設定的記錄分析工作區:

  • 整個叢集:定義於 ConfigMap 區段的 [Prometheus data_collection_settings.cluster]
  • 整個節點:定義於 [ConfigMap] 區段 [Prometheus_data_collection_settings.node]
端點 範圍 範例
Pod 註釋 整個叢集 prometheus.io/scrape: "true"
prometheus.io/path: "/mymetrics"
prometheus.io/port: "8000"
prometheus.io/scheme: "http"
Kubernetes 服務 整個叢集 http://my-service-dns.my-namespace:9100/metrics
http://metrics-server.kube-system.svc.cluster.local/metrics
URL/端點 每個節點和/或整個叢集 http://myurl:9101/metrics

指定 URL 時,Container Insights 只抓取端點。 在指定 Kube 服務時,由叢集 DNS 伺服器來解析服務名稱以取得 IP 位址。 然後抓取已解析的服務。

範圍 機碼 資料類型 Description
整個叢集 從下列三種方法中指定任何一種,以抓取端點的計量。
urls String 逗號分隔的陣列 HTTP 端點 (指定 IP 位址或有效的 URL 路徑)。 例如: urls=[$NODE_IP/metrics] 。 ($NODE_IP 為特定的容器深入解析參數,並可用以代替節點 IP 位址。必須全部大寫。)
kubernetes_services String 逗號分隔的陣列 Kubernetes 服務的陣列,可從 kube-state-metrics 抓取計量。 這裡必須使用完整網域名稱。 例如:kubernetes_services = ["http://metrics-server.kube-system.svc.cluster.local/metrics",http://my-service-dns.my-namespace.svc.cluster.local:9100/metrics]
monitor_kubernetes_pods 布林值 [True] 或 [False] 在整個叢集設定中設定為 true 時,容器深入解析代理程式將抓取整個叢集的 Kube Pod,以取得下列 Prometheus 註釋:
prometheus.io/scrape:
prometheus.io/scheme:
prometheus.io/path:
prometheus.io/port:
prometheus.io/scrape 布林值 [True] 或 [False] 啟用 Pod 的抓取,而且 monitor_kubernetes_pods 必須設定為 true
prometheus.io/scheme String HTTP 預設為透過 HTTP 抓取。
prometheus.io/path String 逗號分隔的陣列 要從中擷取計量的 HTTP 資源路徑。 若計量路徑不是 /metrics,請運用此註釋來定義。
prometheus.io/port String 9102 指定抓取的來源連接埠。 若未設定連接埠,則其預設為 9102。
monitor_kubernetes_pods_namespaces String 逗號分隔的陣列 可從 Kubernetes Pod 抓取計量的命名空間允許清單。
例如,monitor_kubernetes_pods_namespaces = ["default1", "default2", "default3"]
整個節點 urls String 逗號分隔的陣列 HTTP 端點 (指定 IP 位址或有效的 URL 路徑)。 例如: urls=[$NODE_IP/metrics] 。 ($NODE_IP 為特定的容器深入解析參數,並可用以代替節點 IP 位址。必須全部大寫。)
整個節點或整個叢集 interval String 60 秒 收集間隔預設為 1 分鐘 (60 秒)。 可以將 [prometheus_data_collection_settings.node] 和/或 [prometheus_data_collection_settings.cluster] 的收集修改為 s、m、h 等時間單位。
整個節點或整個叢集 fieldpass
fielddrop
String 逗號分隔的陣列 您可以設定允許 (fieldpass) 和不允許 (fielddrop) 清單,以指定從端點收集或不收集特定的計量。 您必須先設定允許清單。

設定 ConfigMaps 以指定 Prometheus 抓取設定 (針對儲存為記錄的計量)

執行下列步驟,以設定您叢集的 ConfigMap 設定檔。 ConfigMaps 是全域清單,只能有一個 ConfigMap 套用至代理程式。 不能以另一個 ConfigMaps 來駁回收集。

  1. 下載 ConfigMap YAML 檔案範本,並將其儲存為 ontainer-azm-ms-agentconfig.yaml。 若已將 ConfigMap 部署至叢集,但想要更新為較新的設定,則可以編輯先前使用的 ConfigMap 檔案。

  2. 以您的自訂來編輯 ConfigMap YAML 檔案,以抓取 Prometheus 計量。

    若要收集整個叢集的 Kube 服務,請使用下列範例來設定 ConfigMap 檔案:

    prometheus-data-collection-settings: |- ​
    # Custom Prometheus metrics data collection settings
    [prometheus_data_collection_settings.cluster] ​
    interval = "1m"  ## Valid time units are s, m, h.
    fieldpass = ["metric_to_pass1", "metric_to_pass12"] ## specify metrics to pass through ​
    fielddrop = ["metric_to_drop"] ## specify metrics to drop from collecting
    kubernetes_services = ["http://my-service-dns.my-namespace:9102/metrics"]
    
  3. 執行下列 kubectl 命令:kubectl apply -f <configmap_yaml_file.yaml>

    範例:kubectl apply -f container-azm-ms-agentconfig.yaml

可能需要幾分鐘的時間才能完成設定變更並生效。 叢集中的所有 ama-logs Pod 將重新啟動。 在重新啟動完成時,會顯示類似如下的訊息,並且包括 configmap "container-azm-ms-agentconfig" created 結果。

確認設定

若要驗證設定已成功套用至叢集,請使用下列命令來檢閱代理程式 Pod 的記錄:kubectl logs ama-logs-fdf58 -n=kube-system

若 Azure 監視器代理程式 Pod 傳回設定錯誤,則輸出將顯示類似下列範例的錯誤:

***************Start Config Processing******************** 
config::unsupported/missing config schema version - 'v21' , using defaults

套用設定變更時發生的錯誤也可供檢閱。 針對設定變更和抓取 Prometheus 計量,有下列選項可額外執行疑難排解:

  • 使用相同kubectl logs命令從代理程式 Pod 記錄。

  • 從即時資料。 即時資料記錄會顯示類似下列範例的錯誤:

    2019-07-08T18:55:00Z E! [inputs.prometheus]: Error in plugin: error making HTTP request to http://invalidurl:1010/metrics: Get http://invalidurl:1010/metrics: dial tcp: lookup invalidurl on 10.0.0.10:53: no such host
    
  • 從 Log Analytics 工作區中的 KubeMonAgentEvents 資料表。 每小時傳送一次資料,抓取錯誤顯示為「警告」嚴重性,設定錯誤顯示為「錯誤」嚴重性。 如果沒有錯誤,資料表中的項目包含嚴重性為資訊的資料,其不會回報任何錯誤。 Tags 屬性包含發生錯誤的 Pod 和容器識別碼,還有過去一小時內第一次發生、最後一次發生和計數的詳細資訊。

  • 針對 Azure Red Hat OpenShift v3.x 與 v4.x,請搜尋 ContainerLog 資料表來檢查 Azure 監視器代理程式記錄,以確認是否已啟用 openshift-azure-logging 的記錄集合。

錯誤會阻止 Azure 監視器代理程式剖析檔案,導致其重新啟動並使用預設設定。 在 Azure Red Hat OpenShift v3.x 以外的叢集上更正 ConfigMap 中的錯誤之後,將 YAML 檔案儲存,並執行下列 kubectl apply -f <configmap_yaml_file.yaml 命令以套用已更新的 ConfigMaps。

若為 Azure Red Hat OpenShift v3.x,請執行下列 oc edit configmaps container-azm-ms-agentconfig -n openshift-azure-logging 命令以編輯並儲存已更新的 ConfigMaps。

查詢 Prometheus 計量資料

若要檢視 Azure 監視器抓取的 Prometheus 計量,以及代理程式回報的任何設定/抓取錯誤,請檢閱查詢 Prometheus 計量資料

在 Grafana 中檢視 Prometheus 計量

容器深入解析支援在 Grafana 儀表板中,檢視 Log Analytics 工作區中儲存的計量。 我們已提供範本,您可以從 Grafana 的儀表板存放庫進行下載。 使用範本開始進行並當作參考,以協助您瞭解從已監視的叢集來將自訂 Grafana 儀表板視覺化,查詢其他資料。

下一步