Prometheus 服務發現機制 機製

2020-08-08 13:35:07

Prometheus 服務發現機制 機製概述

Prometheus數據源的設定主要分爲靜態設定和動態發現, 常用的爲以下幾類:

  1. static_configs: #靜態服務發現
  2. file_sd_configs: #檔案服務發現
  3. dns_sd_configs: #DNS 服務發現
  4. kubernetes_sd_configs: #Kubernetes 服務發現
  5. consul_sd_configs: #Consul 服務發現(推薦使用)

static_configs: 靜態服務發現

Prometheus.yaml組態檔:

scrape_configs:
      - job_name: 'prometheus'
        static_configs:
          - targets: ['localhost:9090']
      - job_name: 'grafana'
        static_configs:
          - targets:
              - 'grafana-service.ns-monitor:3000'
      - job_name: 'kubernetes-apiservers'

file_sd_configs: 檔案服務發現

基於檔案的服務發現方式不需要依賴其他平臺與第三方服務,使用者只需將要新的target資訊以yaml或json檔案格式新增到target檔案中 ,prometheus會定期從指定檔案中讀取target資訊並更新。

target檔案:

vim targets.json
[
  {
    "targets": [ "192.168.20.136:9100"],
    "labels": {
      "instance": "nodeone",
      "job": "expor_test1"
    }
  },
  {
    "targets": [ "192.168.20.137:9100"],
    "labels": {
      "instance": "nodetwo",
      "job": "expor_test2"
    }
  }
]

Prometheus.yaml組態檔:

scrape_configs:
- job_name: 'file_sd'   #此處定義了自動發現的採集任務
  file_sd_configs:
    - files:
      - targets.json         #採集檔名

檢視web介面targets 出現targets.json 所定義的2個job。

dns_sd_configs: DNS 服務發現

忽略

kubernetes_sd_configs: Kubernetes 服務發現

對於kubernetes而言,Promethues通過與Kubernetes API互動,然後輪詢資源端點。目前主要支援5種服務發現模式,分別是:
1: Node、
2 :Service、
3 :Pod、
4 :Endpoints、
5 :Ingress
對應組態檔中的role: node / role:service

動態獲取所有節點node的資訊,可以新增如下設定:

  • role: node
kubernetes_sd_configs:
        - role: node
        relabel_configs:
        - action: labelmap
          regex: __meta_kubernetes_node_label_(.+)
        - target_label: __address__
          replacement: kubernetes.default.svc:443
        - source_labels: [__meta_kubernetes_node_name]
          regex: (.+)
          target_label: __metrics_path__
          replacement: /api/v1/nodes/${1}/proxy/metrics

  • role: endpoints
      - job_name: 'kubernetes-service-endpoints'

        kubernetes_sd_configs:
        - role: endpoints
        relabel_configs:
        - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
          action: keep
          regex: true
        - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
          action: replace
          target_label: __scheme__
          regex: (https?)
        - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
          action: replace
          target_label: __metrics_path__
          regex: (.+)
        - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
          action: replace
          target_label: __address__
          regex: ([^:]+)(?::\d+)?;(\d+)
          replacement: $1:$2
        - action: labelmap
          regex: __meta_kubernetes_service_label_(.+)
        - source_labels: [__meta_kubernetes_namespace]
          action: replace
          target_label: kubernetes_namespace
        - source_labels: [__meta_kubernetes_service_name]
          action: replace
          target_label: kubernetes_name

對應的service、pod也是同樣的方式。
需要注意的是,爲了能夠讓Prometheus能夠存取收到Kubernetes API,我們要對Prometheus進行存取授權,即serviceaccount。否則就算設定了,也沒有許可權獲取。

Prometheus 的relabel_configs設定詳解:

  1. source_labels:源標籤,沒有經過relabel處理之前的標籤名字

  2. target_label:通過action處理之後的新的標籤名字

  3. regex:正則表達式,匹配源標籤

  4. replacement:replacement指定的替換後的標籤(target_label)對應的數值

  5. action:action定義了relabel的動作,action支援多種,如下:

    • replace: 替換標籤值,根據regex正則匹配到源標籤的值,並把匹配的值寫入到目的標籤中
    • keep: 滿足regex正則條件的範例進行採集,把source_labels中沒有匹配到regex正則內容的Target範例丟掉
    • drop: 滿足regex正則條件的範例不採集,把source_labels中匹配到regex正則內容的Target範例丟掉
    • labeldrop: 對抓取到的符合過濾規則的target標籤進行刪除
    • labelkeep: 對抓取到的符合過濾規則的target標籤進行保留
    • labelmap會根據regex的定義去匹配Target範例所有標籤的名稱,並且以匹配到的內容爲新的標籤名稱,其值作爲新標籤的值
    • hashmod 設定target_label爲modulus連線的雜湊值source_labels

consul_sd_configs: Consul 服務發現

consul介紹

Consul 是基於 GO 語言開發的開源工具,主要面向分佈式,服務化的系統提供服務註冊、服務發現和設定管理的功能。
Consul 提供服務註冊/發現、健康檢查、Key/Value儲存、多數據中心和分佈式一致性保證等功能。
之前我們通過 Prometheus 實現監控,當新增一個 Target 時,需要變更伺服器上的組態檔,即使使用 file_sd_configs 設定,也需要登錄伺服器修改對應 Json 檔案,會非常麻煩。

Consul 安裝設定

prometheus.yml 設定:

- job_name: 'consul-prometheus'
  consul_sd_configs:
  - server: '172.30.12.167:8500'
    services: []  

說明一下:這裏需要使用 consul_sd_configs 來設定使用 Consul 服務發現型別,server 爲 Consul 的服務地址。 設定完畢後,重新啓動 Prometheus 服務。