摘要:- job_name: 'blackbox-k8s-http-services' scrape_interval: 30s scrape_timeout: 10s 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: [__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: (.+)。- 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。

Prometheus 監控分爲兩種:

白盒監控
墨盒監控

白盒監控 :是指我們日常監控主機的資源用量、容器的運行狀態、數據庫中間件的運行數據。 這些都是支持業務和服務的基礎設施,通過白盒能夠了解其內部的實際運行狀態,通過對監控指標的觀察能夠預判可能出現的問題,從而對潛在的不確定因素進行優化。

墨盒監控 :即以用戶的身份測試服務的外部可見性,常見的黑盒監控包括 HTTP探針TCP探針DnsIcmp 等用於檢測站點、服務的可訪問性、服務的連通性,以及訪問效率等。

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

部署 Prometheus Blackbox 服務

環境:

  • Prometheus Operator 版本 v0.29.0(手動部署)
  • Kubernetes 版本 1.15.6 (二進制部署)
  • Blackbox Exporter 版本 v0.16.0

Blackbox Exporter 部署

首先得聲明一個 Blackbox 的 Deployment,並利用 Configmap 來爲 Blackbox 提供配置文件。

$ vim prometheus-blackbox.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: blackbox-config
  namespace: monitoring
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]  # 默認 2xx,這裏定義一個返回狀態碼,在grafana作圖時,有明示。
          method: GET
          headers:
            Host: prometheus.example.com
            Accept-Language: en-US
            Origin: example.com
          preferred_ip_protocol: "ip4" # 首選IP協議
          no_follow_redirects: false # 關閉跟隨重定向
      http_post_2xx: # http post 監測模塊
        prober: http
        timeout: 10s
        http:
          valid_http_versions: ["HTTP/1.1", "HTTP/2"]
          method: POST
          # post 請求headers, body 這裏可以不聲明
          headers:  # 使用 json 格式
            Content-Type: application/json
          body: '{"text": "hello"}'
          preferred_ip_protocol: "ip4"
      tcp_connect:  # TCP 檢測模塊
        prober: tcp
        timeout: 10s
      dns_tcp:  # DNS 通過TCP檢測模塊
        prober: dns
        dns:
          transport_protocol: "tcp"  # 默認是 udp
          preferred_ip_protocol: "ip4"  # 默認是 ip6
          query_name: "kubernetes.default.svc.cluster.local" # 利用這個域名來檢查 dns 服務器
          # query_type: "A"  # 如果是 kube-dns ,一定要加入這個,因爲不支持Ipv6
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: blackbox
  namespace: monitoring
spec:
  replicas: 1
  revisionHistoryLimit: 3
  selector:
    matchLabels:
      app: blackbox
  strategy:
    rollingUpdate:
      maxSurge: 30%
      maxUnavailable: 30%
    type: RollingUpdate
  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=info  # 日誌級別,可以把級別調到 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: monitoring
spec:
  selector:
    app: blackbox
  ports:
  - port: 9115
    targetPort: 9115
# 部署
$ kubectl apply -f prometheus-blackbox.yaml

configmap/blackbox-config created
deployment.apps/blackbox created
service/blackbox created

定義 BlackBox 在 Prometheus 抓取設置

下面抓取設置,都存放在 prometheus-additional.yaml 文件中,設置可參考 https://github.com/prometheus/prometheus/blob/master/documentation/examples/prometheus-kubernetes.yml

DNS 監控

- job_name: "blackbox-k8s-service-dns"
  scrape_interval: 30s
  scrape_timeout: 10s
  metrics_path: /probe # 不是 metrics,是 probe
  params:
    module: [dns_tcp] # 使用 DNS TCP 模塊
  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 定義保持一致

更新 additional-configs secrets 配置 , Prometheus 會自動 reload

# 先刪除,在重新創建
$ kubectl delete secrets -n monitoring additional-configs
$ kubectl create secret generic additional-configs --from-file=prometheus-additional.yaml -n monitoring

看到下面輸出結果,說明 Prometheus 已重載

打開 Prometheus 的 Target 頁面,就會看到 上面定義的 blackbox-k8s-service-dns 任務

HTTP 監控(K8S 內部發現方法)

發現 Service 監控

- 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

按上面方法重載 Prometheus,打開 Prometheus 的 Target 頁面,就會看到 上面定義的 blackbox-k8s-http-services 任務

自定義發現 Service 監控 端口路徑 ,可以如下設置:

- job_name: 'blackbox-k8s-http-services'
  scrape_interval: 30s
  scrape_timeout: 10s
  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: [__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
  - 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

然後,需要在 Service 中配置這樣的 annotation

annotation:
  prometheus.io/http-probe: "true"
  prometheus.io/http-probe-port: "8080"
  prometheus.io/http-probe-path: "/healthCheck"

按上面方法重載 Prometheus,打開 Prometheus 的 Target 頁面,就會看到 上面定義的 blackbox-k8s-http-services 任務

發現 Ingress

- job_name: 'blackbox-k8s-ingresses'
  scrape_interval: 30s
  scrape_timeout: 10s
  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,會出現下面報錯,報權限不足

解決方法:在 prometheus-clusterRole.yaml 後面添加下面內容

- apiGroups:
  - extensions
  resources:
  - ingresses
  verbs:
  - get
  - list
  - watch
$ kubectl apply -f prometheus-clusterRole.yaml

打開 Prometheus 的 Target 頁面,就會看到 上面定義的 blackbox-k8s-ingresses 任務

HTTP 監控(監控外部域名)

- job_name: "blackbox-external-website"
  scrape_interval: 30s
  scrape_timeout: 15s
  metrics_path: /probe
  params:
    module: [http_2xx]
  static_configs:
  - targets:
    - https://www.example.com # 要檢查的網址
    - https://test.example.com
  relabel_configs:
  - source_labels: [__address__]
    target_label: __param_target
  - source_labels: [__param_target]
    target_label: instance
  - target_label: __address__
    replacement: blackbox:9115

打開 Prometheus 的 Target 頁面,就會看到 上面定義的 blackbox-external-website 任務

HTTP Post 監控(監控外部域名)

- job_name: 'blackbox-http-post'
  metrics_path: /probe
  params:
    module: [http_post_2xx]
  static_configs:
    - targets:
      - https://www.example.com/api # 要檢查的網址
  relabel_configs:
    - source_labels: [__address__]
      target_label: __param_target
    - source_labels: [__param_target]
      target_label: instance
    - target_label: __address__
      replacement: blackbox:9115

打開 Prometheus 的 Target 頁面,就會看到 上面定義的 blackbox-http-post 任務

Grafana Dashboard

Grafana 官網找到的一個Dashboard

小結

Prometheus Blackbox 除了支持對 HTTP 協議進行網絡探測以外,Blackbox 還支持對 TCP、DNS、ICMP 等其他網絡協議,大家感興趣的可以從 Blackbox 的 Github項目 中獲取更多使用方法。

相關文章