在適用於 Prometheus 的 Azure 監視器受管理服務中自訂抓取 Prometheus 計量

本文提供在 Azure 監視器中使用計量附加元件,以自訂為 Kubernetes 叢集抓取計量的相關指示。

Configmaps

可以設定四個不同的 Configmaps 以提供計量附加元件的抓取設定和其他設定。 所有設定對應都應該套用至任何叢集 kube-system 命名空間。

注意

啟用受控 Prometheus 時,叢集中預設沒有這四個 Configmap。 視需要自訂的內容而定,您必須在 kube-system 命名空間中部署這四個相同名稱的這四個 configmap 中的任何或全部。 AMA 計量 Pod 會在您將這些設定對應部署到 kube-system 命名空間之後挑選,並在 2-3 分鐘內重新啟動,以套用 Configmap 中指定的設定。

  1. ama-metrics-settings-configmap 此 ConfigMap 具有下列可設定的簡單設定。 您可以從上述 Git 中樞存放庫取得 Configmap、變更需要設定,並將 Configmap 套用/部署至叢集的 kube-system 命名空間
    • 叢集別名 (若要在從叢集內嵌的每個時間序列/計量中變更 cluster 標籤標的值)
    • 啟用/停用預設抓取目標 - 根據目標開啟/關閉預設抓取。 這些預設目標的抓取設定已預先定義/內建
    • 根據命名空間啟用以 Pod 註釋為基礎的抓取
    • 計量保留清單:此設定可用來控制每個預設目標允許的計量,以及變更預設行為
    • 抓取預設/預先定義目標的間隔。 30 secs 是預設的抓取頻率,而且可以使用此 Configmap 來變更每個預設目標
    • 偵錯模式:啟用此設定有助於偵錯遺漏的計量/擷取問題 - 詳情請參閱疑難排解
  2. ama-metrics-prometheus-config 此 Configmap 可用來提供附加元件複本的 Prometheus 抓取設定。 Addon 會執行單一複本,而且您可以在此 Configmap 中提供抓取作業,以探索和抓取任何叢集層級服務。 您可以從上述 Git 中樞存放庫取得範例 Configmap、新增您需要的抓取作業,並將 Configmap 套用/部署至叢集的 kube-system 命名空間。 雖然支援此功能,但請注意,建議的擷取自定義目標方式是使用 自定義資源
  3. ama-metrics-prometheus-config-node (進階) 此 Configmap 可用來提供 Prometheus 抓取設定給叢集中每個 Linux 節點上執行的附加元件 DaemonSet,而且每個節點上的任何節點層級目標都可以在此 Configmap 中提供抓取作業來進行抓取。 當您使用此 Configmap 時,可以在抓取組態中使用 $NODE_IP 變數,此變數會由在每個節點上執行的 DaemonSet Pod 中對應的節點 IP 位址取代。 如此一來,您就可以從計量附加元件 DaemonSet 抓取在該節點上執行的任何項目。 當您在此節點層級 Configmap 中使用抓取組態中的探索時請多加注意,因為叢集中的每個節點都會設定及探索目標,並收集的備援計量。 您可以從上述 Git 中樞存放庫取得範例 Configmap、新增您需要的抓取作業,並將 Configmap 套用/部署至叢集的 kube-system 命名空間
  4. ama-metrics-prometheus-config-node-windows (進階) 此 Configmap 可用來提供 Prometheus 抓取設定給叢集中每個 Windows 節點上執行的附加元件 DaemonSet,而每個節點上的節點層級目標可藉由在此 Configmap 中提供抓取作業來進行抓取。 當您使用此 Configmap 時,可以在抓取組態中使用 $NODE_IP 變數,此變數將會由在每個節點上執行的 DaemonSet Pod 中對應的節點 IP 位址取代。 如此一來,您就可以從計量附加元件 DaemonSet 抓取在該節點上執行的任何項目。 當您在此節點層級 Configmap 中使用抓取組態中的探索時請多加注意,因為叢集中的每個節點都會設定及探索目標,並收集的備援計量。 您可以從上述 Git 中樞存放庫取得範例 Configmap、新增您需要的抓取作業,並將 Configmap 套用/部署至叢集的 kube-system 命名空間

自訂資源定義

Azure 監視器計量附加元件支援使用 Prometheus - Pod 監視器和服務監視器來擷取 Prometheus 計量,類似於 OSS Prometheus 操作員。 啟用附加元件將會部署Pod和服務監視器自定義資源定義,讓您建立自己的自定義資源。 請遵循指示,在您的 叢集上建立及套用自定義資源

計量附加元件設定 Configmap

The ama-metrics-settings-configmap 可以下載、編輯和套用至叢集,以自訂立即可用的計量附加元件功能。

啟用和停用預設目標

下表列出 Azure 監視器計量附加元件預設可抓取的所有預設目標,及其一開始是否已啟用。 預設目標為每隔 30 秒抓取一次。 複本會以抓取全叢集目標 (例如 kube-state-metrics) 進行部署。 DaemonSet 也會以抓取全節點目標 (例如 kubelet) 進行部署。

機碼 類型 已啟用 Pod 描述
kubelet bool true Linux DaemonSet 在 K8s 叢集中的每個節點中抓取 kubelet,而不需要任何額外的抓取設定。
cadvisor bool true Linux DaemonSet 在 K8s 叢集中的每個節點中抓取 cAdvisor,而不需要任何額外的抓取設定。
僅限 Linux。
kubestate bool true Linux 複本 在 K8s 叢集中抓取 kube-state-metrics (安裝為附加元件的一部分),而不需任何額外的抓取設定。
nodeexporter bool true Linux DaemonSet 抓取節點計量,而不需任何額外的抓取設定。
僅限 Linux。
coredns bool false Linux 複本 在 K8s 叢集中抓取 coredns 服務,而不需要任何額外的抓取設定。
kubeproxy bool false Linux DaemonSet 在 K8s 叢集中探索到的每個 Linux 節點中抓取 kube-proxy,而不需要任何額外的抓取設定。
僅限 Linux。
apiserver bool false Linux 複本 在 K8s 叢集中抓取 kubernetes API 伺服器,而不需任何額外的抓取設定。
windowsexporter bool false Windows DaemonSet 在 K8s 叢集中的每個節點中抓取 Windows 匯出工具,而不需要任何額外的抓取設定。
僅限 Windows。
windowskubeproxy bool false Windows DaemonSet 在 K8s 叢集的每個節點中抓取 windows-kube-proxy,無需任何額外的抓取設定。
僅限 Windows。
prometheuscollectorhealth bool false Linux 複本 抓取 prometheus-collector 容器的相關資訊,例如抓取的時間序列數量和大小。

如果您想要開啟預設未啟用的預設目標抓取,請編輯 configmapama-metrics-settings-configmap,以將 default-scrape-settings-enabled 下列出的目標更新為 true。 將 Configmap 套用至您的叢集。

啟用以 Pod 註釋為基礎的抓取

若要抓取應用程式 Pod,而不需要建立自定義 Prometheus 組態,可以將註釋新增至 Pod。 需要註釋 prometheus.io/scrape: "true" 才能抓取 Pod。 批註 prometheus.io/pathprometheus.io/port 指出計量裝載在 Pod 上的路徑和連接埠。 於 <pod IP>:8080/metrics 裝載計量之 Pod 的註釋如下:

metadata:   
  annotations:
    prometheus.io/scrape: 'true'
    prometheus.io/path: '/metrics'
    prometheus.io/port: '8080'

預設會抓取具有特定註釋的這些 Pod。 若要啟用,請在 ama-metrics-settings-configmap中,新增 pod 命名空間的 regex,並加上您想要抓取的批註作為字段的值 podannotationnamespaceregex

例如,下列設定只會在 命名空間 kube-systemmy-namespace 中抓取具有註釋的 Pod:

pod-annotation-based-scraping: |-
    podannotationnamespaceregex = "kube-system|my-namespace"

若要針對具有所有命名空間註釋的 Pod 啟用抓取,請使用:

pod-annotation-based-scraping: |-
    podannotationnamespaceregex = ".*"

警告

根據具有註釋的 Pod 數目,從許多命名空間抓取 Pod 註釋可能會產生非常大量的計量。

自訂預設目標所收集的計量

根據預設,對於所有預設目標,只會內嵌預設錄製規則、警示和 Grafana 儀表板中使用的最小計量,如 minimal-ingestion-profile 中所述。 若要從預設目標收集所有計量,請在 default-targets-metrics-keep-list 下方更新設定 configmap 中的 keep-list,並將 minimalingestionprofile 設定為 false

若要允許列出更多計量,除了允許的預設計量之外,針對任何預設目標,請針對您想要變更的對應作業編輯 default-targets-metrics-keep-list 下的設定。

例如,kubelet 是預設目標 kubelet 的計量篩選設定。 使用下列指令碼,以篩選使用 regex 型篩選條件在預設目標中收集的 in 計量。

kubelet = "metricX|metricY"
apiserver = "mymetric.*"

注意

如果您在 regex 中使用引號或反斜線,則必須使用反斜線來逸出,例如範例 "test\'smetric\"s\""testbackslash\\*

若要進一步自訂預設作業以變更屬性,例如集合頻率或標籤,請藉由將目標的 configmap 值設為 false,以停用對應的預設目標。 然後使用自訂 Configmap 來套用作業。 對於自訂設定上的詳細資料,請參閱在 Azure 監視器中自訂抓取 Prometheus 計量

叢集別名

附加至每次抓取時間序列的叢集標籤將會使用完整 AKS 叢集 Azure Resource Manager 資源識別碼的最後一部分。 例如,如果資源識別碼為 /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/rg-name/providers/Microsoft.ContainerService/managedClusters/myclustername,則叢集標籤為 myclustername

若要覆寫已抓取時間序列中的叢集標籤,請將設定 cluster_alias 更新為 configmapama-metrics-settings-configmapprometheus-collector-settings 下的任何字串。 如果叢集中不存在,您可以建立此 Configmap,或者如果叢集中已經存在,您則可以編輯。

新的標籤也顯示在 Grafana 儀表板的叢集參數下拉式清單中,而不是預設標籤。

注意

僅允許英數字元。 任何字元都會取代為 _。 這項變更為了確保取用此標籤的不同元件會遵守基本英數字元慣例。

偵錯模式

警告

此模式可能會影響效能,而且只應該短時間啟用以進行偵錯。

若要檢視為了偵錯而抓取的每個計量,可以將計量附加元件代理程式設定為在偵錯模式中執行,方法是將設定 enabled 更新為 configmapama-metrics-settings-configmapdebug-mode 設定下的 true。 您可以建立此 configmap,或編輯現有的 configmap。 如需更多資訊,請參閱對於 Prometheus 計量集合進行疑難排解的〈偵錯模式〉一節

抓取間隔設定

若要更新任何目標的抓取間隔設定,您可以在 Configmapama-metrics-settings-configmap 中更新該目標的設定 default-targets-scrape-interval-settings 持續時間。 您必須以此網站中指定的正確格式來設定抓取間隔。 否則,預設值為 30 秒會套用至對應的目標。 例如 - 如果您想要將 kubelet 作業的抓取間隔更新為 60s,您可以在 YAML 中更新下列區段:

default-targets-scrape-interval-settings: |-
    kubelet = "60s"
    coredns = "30s"
    cadvisor = "30s"
    kubeproxy = "30s"
    apiserver = "30s"
    kubestate = "30s"
    nodeexporter = "30s"
    windowsexporter = "30s"
    windowskubeproxy = "30s"
    kappiebasic = "30s"
    prometheuscollectorhealth = "30s"
    podannotations = "30s"

並使用下列命令套用 YAML:kubectl apply -f .\ama-metrics-settings-configmap.yaml

設定自訂 Prometheus 抓取作業

您可以使用 Prometheus - Pod 監視器和服務監視器(建議)來刮去 Prometheus 計量,類似於 OSS Prometheus 運算元。 請遵循指示,在您的 叢集上建立及套用自定義資源

此外,您可以遵循指示來 建立、驗證及套用叢集的 configmap 。 組態格式類似於 Prometheus 組態檔

Prometheus 設定提示與範例

從本節的範例中了解一些秘訣。

使用 Pod 和服務監視器範本,並遵循 API 規格來建立您的自訂資源(PodMonitor 和服務監視器)。 請注意 ,受控 Prometheus 挑選現有 OSS CR 所需的唯一變更是 API 群組 - azmonitoring.coreos.com/v1。 請參閱 這裡 以深入瞭解

注意

當自訂抓取設定因驗證錯誤而無法套用時,將會繼續使用預設抓取設定。

如果您想要使用套用至所有報廢作業的全域設定,而且只有自定義資源,您仍然需要只使用全域設定來建立 configmap(自定義資源中的每個設定 設定 會覆寫全域區段中的設定)

抓取設定

目前,自定義資源的目標探索支援方法是Pod和服務監視器

Pod 和服務監視器

使用 Pod 和服務監視器探索到的目標,會根據所使用的監視器而有不同的 __meta_* 標籤。 您可以在 relabelings 區段使用這些標籤,以篩選目標或取代目標的標籤。

請參閱Pod和服務監視器的Pod和服務監視器範例

重新標記

relabelings 區段會在目標探索時套用,並套用至作業的每個目標。 下列範例示範使用 relabelings 的方式。

新增標籤

將名為 example_label 的新標籤 (具有值 example_value) 新增至作業的每個計量。 請只使用 __address__ 做為來源標籤,因為該標籤存在,並新增作業每個目標的標籤。

relabelings:
- sourceLabels: [__address__]
  targetLabel: example_label
  replacement: 'example_value'

使用 Pod 或服務監視器標籤

使用 Pod 和服務監視器探索到的目標,會根據所使用的監視器而有不同的 __meta_* 標籤。 探索目標之後,會卸除 __* 標籤。 若要在計量層級篩選這些標籤,請先指派標籤名稱,使其維持使用 relabelings。 然後使用 metricRelabelings 來篩選。

# Use the kubernetes namespace as a label called 'kubernetes_namespace'
relabelings:
- sourceLabels: [__meta_kubernetes_namespace]
  action: replace
  targetLabel: kubernetes_namespace

# Keep only metrics with the kubernetes namespace 'default'
metricRelabelings:
- sourceLabels: [kubernetes_namespace]
  action: keep
  regex: 'default'

作業與執行個體重新指派標籤

您可根據來源標籤變更 jobinstance 標籤值,就像任何其他標籤一樣。

# Replace the job name with the pod label 'k8s app'
relabelings:
- sourceLabels: [__meta_kubernetes_pod_label_k8s_app]
  targetLabel: job

# Replace the instance name with the node name. This is helpful to replace a node IP
# and port with a value that is more readable
relabelings:
- sourceLabels: [__meta_kubernetes_node_name]]
  targetLabel: instance

計量重新標記

在擷取之後和擷取之前,會套用計量重新標記。 使用 metricRelabelings 區段以篩選抓取後的計量。 下列範例示範如何進行。

依名稱卸除計量

# Drop the metric named 'example_metric_name'
metricRelabelings:
- sourceLabels: [__name__]
  action: drop
  regex: 'example_metric_name'

依名稱僅保留特定計量

# Keep only the metric named 'example_metric_name'
metricRelabelings:
- sourceLabels: [__name__]
  action: keep
  regex: 'example_metric_name'
# Keep only metrics that start with 'example_'
metricRelabelings:
- sourceLabels: [__name__]
  action: keep
  regex: '(example_.*)'

重新命名計量

不支援計量重新命名。

依標籤篩選計量

# Keep metrics only where example_label = 'example'
metricRelabelings:
- sourceLabels: [example_label]
  action: keep
  regex: 'example'
# Keep metrics only if `example_label` equals `value_1` or `value_2`
metricRelabelings:
- sourceLabels: [example_label]
  action: keep
  regex: '(value_1|value_2)'
# Keep metrics only if `example_label_1 = value_1` and `example_label_2 = value_2`
metricRelabelings:
- sourceLabels: [example_label_1, example_label_2]
  separator: ';'
  action: keep
  regex: 'value_1;value_2'
# Keep metrics only if `example_label` exists as a label
metricRelabelings:
- sourceLabels: [example_label_1]
  action: keep
  regex: '.+'

TLS 型抓取

如果您有使用 TLS 提供的 Prometheus 執行個體,而且想要從中抓取計量,您必須將設定設定為 https,並在 Configmap 或個別 CRD 中設定 TLS 設定。 您可以使用自訂抓取作業內的 tls_config 組態屬性,使用 CRD 或 Configmap 來設定 TLS 設定。 您必須提供 CA 憑證來驗證 API 伺服器憑證。 當 Prometheus 透過 TLS 連線到目標時,CA 憑證會用來驗證伺服器的憑證真實性。 這有助於確保伺服器的憑證是經受信任的授權單位簽署。

祕密應該在 kube-system 命名空間中建立,然後在 kube 系統命名空間中建立 Configmap/CRD。 祕密建立的順序很重要。 當沒有秘密,但有效的 CRD/ Configmap 時,您會在收集器記錄檔中找到錯誤 ->no file found for cert....

以下是如何透過 Configmap 或 CRD 提供 TLS 組態設定的詳細資料。

  • 若要在 configmap 中提供 TLS 組態設定,請在已啟用 mtls 的應用程式內建立自我簽署憑證和密鑰。 Configmap 內的 tlsConfig 範例看起來應該像這樣:
tls_config:
    ca_file: /etc/prometheus/certs/client-cert.pem
    cert_file: /etc/prometheus/certs/client-cert.pem
    key_file: /etc/prometheus/certs/client-key.pem
    insecure_skip_verify: false
  • 若要在CRD中提供TLS組態設定,請在已啟用mtls的應用程式內建立自我簽署憑證和密鑰。 Pod 監視器內的 tlsConfig 範例看起來應該像這樣:
tlsConfig:
    ca:
        secret:
        key: "client-cert.pem" # since it is self-signed
        name: "ama-metrics-mtls-secret"
    cert:
        secret:
        key: "client-cert.pem"
        name: "ama-metrics-mtls-secret"
    keySecret:
        key: "client-key.pem"
        name: "ama-metrics-mtls-secret"
    insecureSkipVerify: false

注意

請確定 mtls 應用程式內的憑證檔名和金鑰名稱採用下列格式,以 CRD 為基礎的擷取。 例如:secret_kube-system_ama-metrics-mtls-secret_cert-name.pem 和 secret_kube-system_ama-metrics-mtls-secret_key-name.pem。 CRD 必須在 kube 系統命名空間中建立。 祕密名稱應該正好是 kube-system 命名空間中的 ama-metrics-mtls-secret。 建立秘密的範例命令:kubectl 建立祕密泛型 ama-metrics-mtls-secret --from-file=secret_kube-system_ama-metrics-mtls-secret_client-cert.pem=secret_kube-system_ama-metrics-mtls-system_ama-metrics-mtls-secret_client secret_client-cert.pem --from-file=secret_kube-system_ama-metrics-mtls-secret_client-key.pem=secret_kube-system_ama-metrics-mtls-secret_client-key.pem -n kube-system

若要深入了解 TLS 驗證,下列文件可能會有幫助。

基本驗證

如果您在 prometheus 組態中使用 basic_auth 設定,請遵循步驟 -

  1. 在名為 ama-metrics-mtls-secret 的 kube-system 命名空間中建立秘密

password1 的值是 base64encoded 金鑰 密碼1 可以是任何專案,但只需要符合您的 scrapeconfig password_file filepath 即可。

apiVersion: v1
kind: Secret
metadata:
  name: ama-metrics-mtls-secret
  namespace: kube-system
type: Opaque
data:
  password1: <base64-encoded-string>
  1. 在自訂報廢組態的 configmap 中使用下列設定 -
basic_auth:
  username: admin
  password_file: /etc/prometheus/certs/password1

注意

請確定名稱為 ama-metrics-mtls-secret ,且位於 kube-system 命名空間中。

/ etc/prometheus/certs/ 路徑是必要的,但 password1 可以是任何字串,而且必須符合上面所建立秘密中數據的密鑰。 這是因為秘密 ama-metrics-mtls-secret 會掛接在容器內的路徑 /etc/prometheus/certs/ 中。

當秘密掛接為檔案時,代理程式 Pod 會自動譯碼 base64 編碼值。

任何其他被視為 prometheus 組態中秘密的授權組態設定,都必須改用檔案設定替代方式,如上述所述。

下一步

Prometheus 計量設定警示
查詢 Prometheus 計量
深入了解收集 Prometheus 計量