使用 Prometheus 進行黑盒(blackbox) 監控

使用 Prometheus 進行黑盒(blackbox) 監控

圖片來源:https://unsplash.com/photos/BjjwEf0BRkAgit

前面咱們主要介紹了 Prometheus 下如何進行白盒監控,咱們監控主機的資源用量、容器的運行狀態、數據庫中間件的運行數據、自動發現 Kubernetes 集羣中的資源等等,這些都是支持業務和服務的基礎設施,經過白盒可以瞭解其內部的實際運行狀態,經過對監控指標的觀察可以預判可能出現的問題,從而對潛在的不肯定因素進行優化。而從完整的監控邏輯的角度,除了大量的應用白盒監控之外,還應該添加適當的 Blackbox(黑盒)監控,黑盒監控即以用戶的身份測試服務的外部可見性,常見的黑盒監控包括 HTTP探針、 TCP探針 等用於檢測站點或者服務的可訪問性,以及訪問效率等。github

黑盒監控相較於白盒監控最大的不一樣在於黑盒監控是以故障爲導向當故障發生時,黑盒監控能快速發現故障,而白盒監控則側重於主動發現或者預測潛在的問題。一個完善的監控目標是要可以從白盒的角度發現潛在問題,可以在黑盒的角度快速發現已經發生的問題。數據庫

Blackbox Exporter 是 Prometheus 社區提供的官方黑盒監控解決方案,其容許用戶經過:HTTP、 HTTPS、 DNS、 TCP 以及 ICMP 的方式對網絡進行探測。api

一樣首先須要在 Kubernetes 集羣中運行 blackbox-exporter 服務,一樣經過一個 ConfigMap 資源對象來爲 Blackbox 提供配置,以下所示:(prome-blackbox.yaml)網絡

apiVersion: v1

kind: ConfigMap

metadata:

  name: blackbox-config

  namespace: kube-mon

data:

  blackbox.yml: |-

    modules:

      http_2xx:  # http 檢測模塊  Blockbox-Exporter 中全部的探針均是以 Module 的信息進行配置

        prober: http

        timeout: 10s

        http:

          valid_http_versions: ["HTTP/1.1", "HTTP/2"]   

          valid_status_codes: [200]  # 這裏最好做一個返回狀態碼,在grafana做圖時,有明示---陳剛註釋。

          method: GET

          preferred_ip_protocol: "ip4"

      http_post_2xx: # http post 監測模塊

        prober: http

        timeout: 10s

        http:

          valid_http_versions: ["HTTP/1.1", "HTTP/2"]

          method: POST

          preferred_ip_protocol: "ip4"

      tcp_connect:  # TCP 檢測模塊

        prober: tcp

        timeout: 10s

      dns:  # DNS 檢測模塊

        prober: dns

        dns:

          transport_protocol: "tcp"  # 默認是 udp

          preferred_ip_protocol: "ip4"  # 默認是 ip6

          query_name: "kubernetes.default.svc.cluster.local"

---

apiVersion: apps/v1

kind: Deployment

metadata:

  name: blackbox

  namespace: kube-mon

spec:

  selector:

    matchLabels:

      app: blackbox

  template:

    metadata:

      labels:

        app: blackbox

    spec:

      containers:

      - image: prom/blackbox-exporter:v0.16.0

        name: blackbox

        args:

        - --config.file=/etc/blackbox_exporter/blackbox.yml # ConfigMap 中的配置文件

        - --log.level=error  # 錯誤級別控制

        ports:

        - containerPort: 9115

        volumeMounts:

        - name: config

          mountPath: /etc/blackbox_exporter

      volumes:

      - name: config

        configMap:

          name: blackbox-config

---

apiVersion: v1

kind: Service

metadata:

  name: blackbox

  namespace: kube-mon

spec:

  selector:

    app: blackbox

  ports:

  - port: 9115

    targetPort: 9115

直接建立上面的資源清單:app

$ kubectl apply -f prome-blackbox.yaml

configmap/blackbox-config created

deployment.apps/blackbox created

service/blackbox created

而後須要在 Prometheus 的配置文件中加入對 BlackBox 的抓取設置,以下所示:curl

apiVersion: v1

kind: ConfigMap

metadata:

  name: prometheus-config

  namespace: kube-mon

data:

  prometheus.yml: |

    global:

      scrape_interval: 15s

      scrape_timeout: 15s

    scrape_configs:

    - job_name: 'prometheus'

      static_configs:

      - targets: ['localhost:9090']

    - job_name: "kubernetes-service-dns"

      metrics_path: /probe # 不是 metrics,是 probe

      params:

        module: [dns] # 使用 DNS 模塊

      static_configs:

      - targets:

        - kube-dns.kube-system:53  # 不要省略端口號

      relabel_configs:

      - source_labels: [__address__]

        target_label: __param_target

      - source_labels: [__param_target]

        target_label: instance

      - target_label: __address__

        replacement: blackbox:9115  # 服務地址,和上面的 Service 定義保持一致

首先獲取 targets 實例的 address 值寫進 param_target, _param<name> 形式的標籤裏的 name 和它的值會被添加到發送到黑盒的 http 的 header 的 params 看成鍵值,例如 param_module 對應 params 裏的 module。而後獲取 __param_target 的值,並覆寫到 instance 標籤中,覆寫 Target 實例的 address 標籤值爲 BlockBoxExporter 實例的訪問地址,向 blackbox:9115 發送請求獲取實例的 metrics 信息。而後更新配置:tcp

$ kubectl apply -f prometheus-cm.yaml

configmap/prometheus-config configured

# 隔一下子執行 reload 操做

$ curl -X POST "http://10.244.3.174:9090/-/reload"  # promethues pod ip

打開 Prometheus 的 Target 頁面,就會看到 上面定義的 kubernetes-service-dns 任務了:ide

使用 Prometheus 進行黑盒(blackbox) 監控

回到 Graph 頁面,可使用 probe_success{job="kubernetes-service-dns"} 來查看檢測結果,這樣就實現了對 DNS 的黑盒監控。post

除了 DNS 的配置外,上面咱們還配置了一個 http_2xx 的模塊,也就是 HTTP 探針,HTTP 探針是進行黑盒監控時最經常使用的探針之一,經過 HTTP 探針可以對網站或者 HTTP 服務創建有效的監控,包括其自己的可用性,以及用戶體驗相關的如響應時間等等。除了可以在服務出現異常的時候及時報警,還能幫助系統管理員分析和優化網站體驗。這裏咱們可使用他來對 http 服務進行檢測。

由於前面已經給 Blackbox 配置了 http_2xx 模塊,因此這裏只須要在 Prometheus 中加入抓取任務,這裏咱們能夠結合前面的 Prometheus 的服務發現功能來作黑盒監控,對於 Service 和 Ingress 類型的服務發現,用來進行黑盒監控是很是合適的,配置以下所示:

- job_name: 'kubernetes-http-services'

  metrics_path: /probe

  params:

    module: [http_2xx]  # 使用定義的http模塊

  kubernetes_sd_configs:

  - role: service  # service 類型的服務發現

  relabel_configs:

  # 只有service的annotation中配置了 prometheus.io/http_probe=true 的才進行發現

  - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_http_probe]

    action: keep

    regex: true

  - source_labels: [__address__]

    target_label: __param_target

  - target_label: __address__

    replacement: blackbox:9115

  - source_labels: [__param_target]

    target_label: instance

  - action: labelmap

    regex: __meta_kubernetes_service_label_(.+)

  - source_labels: [__meta_kubernetes_namespace]

    target_label: kubernetes_namespace

  - source_labels: [__meta_kubernetes_service_name]

    target_label: kubernetes_name

- job_name: 'kubernetes-ingresses'

  metrics_path: /probe

  params:

    module: [http_2xx]  # 使用定義的http模塊

  kubernetes_sd_configs:

  - role: ingress  # ingress 類型的服務發現

  relabel_configs:

  # 只有ingress的annotation中配置了 prometheus.io/http_probe=true的才進行發現

  - source_labels: [__meta_kubernetes_ingress_annotation_prometheus_io_http_probe]

    action: keep

    regex: true

  - source_labels: [__meta_kubernetes_ingress_scheme,__address__,__meta_kubernetes_ingress_path]

    regex: (.+);(.+);(.+)

    replacement: ${1}://${2}${3}

    target_label: __param_target

  - target_label: __address__

    replacement: blackbox:9115

  - source_labels: [__param_target]

    target_label: instance

  - action: labelmap

    regex: __meta_kubernetes_ingress_label_(.+)

  - source_labels: [__meta_kubernetes_namespace]

    target_label: kubernetes_namespace

  - source_labels: [__meta_kubernetes_ingress_name]

    target_label: kubernetes_name

咱們結合前面的服務發現功能,經過過濾 prometheus.io/http_probe=true 的 Service 和 Ingress 才進行 HTTP 探針類型的黑盒監控,其餘配置和上面配置 dns 監控的時候是一致的。而後更新配置:

$ kubectl apply -f prometheus-cm.yaml

configmap/prometheus-config configured

# 隔一下子執行reload操做

$ curl -X POST "http://10.244.3.174:9090/-/reload"

打開 Prometheus 的 Target 頁面,就會看到 上面定義的兩個任務了:

使用 Prometheus 進行黑盒(blackbox) 監控

可是如今尚未任何數據,這是由於上面是匹配 __meta_kubernetes_ingress_annotation_prometheus_io_http_probe 這個元信息,因此若是咱們須要讓這兩個任務發現的話須要在 Service 或者 Ingress 中配置對應的 annotation:

annotation:

  prometheus.io/http-probe: "true"

好比在咱們本身的一個 Ingress 對象中添加上面這個 annotation:

$  kubectl get ingress fe-trait-ingress -o yaml

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

  annotations:

    ......

    prometheus.io/http-probe: "true"  # 用於黑盒監控

......

spec:

  rules:

  - host: todo.qikqiak.com

    http:

      paths:

      - backend:

          serviceName: fe

          servicePort: 3000

        path: /app(/|$)(.*)

status:

  loadBalancer: {}

這個時候咱們查看到 Ingress 這個任務下面已經有抓取任務了:

使用 Prometheus 進行黑盒(blackbox) 監控
好比如今咱們可使用 probe_duration_seconds 來檢查監控結果:

使用 Prometheus 進行黑盒(blackbox) 監控

對於 Service 是同樣的,固然若是你須要對監控的路徑、端口這些作控制,咱們能夠本身在 relabel_configs 中去作相應的配置,好比咱們想對 Service 的黑盒作自定義配置,能夠想下面這樣配置:

- source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_namespace, __meta_kubernetes_service_annotation_prometheus_io_http_probe_port, __meta_kubernetes_service_annotation_prometheus_io_http_probe_path]

  action: replace

  target_label: __param_target

  regex: (.+);(.+);(.+);(.+)

  replacement: $1.$2:$3$4

這樣咱們就須要在 Service 中配置這樣的 annotation 了:

annotation:

  prometheus.io/http-probe: "true"

  prometheus.io/http-probe-port: "8080"

  prometheus.io/http-probe-path: "/healthz"

這樣咱們就完成了 HTTP 探針的黑盒監控,除此以外,咱們還能夠配置 TCP 的監控,上面咱們已經配置了這個模塊,你們能夠本身嘗試去配置下。

除了支持對 HTT P協議進行網絡探測之外,Blackbox 還支持對 TCP、DNS、ICMP 等其餘網絡協議,感興趣的讀者能夠從 Blackbox 的 Github 項目中獲取更多使用信息。

Prometheus 配置文件能夠參考官方倉庫:https://github.com/prometheus/prometheus/blob/master/documentation/examples/prometheus-kubernetes.yml

Blackbox 的配置文件能夠參考官方參考:https://github.com/prometheus/blackbox_exporter/blob/master/example.yml

使用 Prometheus 進行黑盒(blackbox) 監控

相關文章
相關標籤/搜索