圖片來源: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
回到 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 頁面,就會看到 上面定義的兩個任務了:
可是如今尚未任何數據,這是由於上面是匹配 __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 這個任務下面已經有抓取任務了:
好比如今咱們可使用 probe_duration_seconds 來檢查監控結果:
對於 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