Prometheus BlackBox簡單監控
摘要:- 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探針
、 Dns
、 Icmp
等用於檢測站點、服務的可訪問性、服務的連通性,以及訪問效率等。
兩者比較
:黑盒監控相較於白盒監控最大的不同在於黑盒監控是以故障爲導向當故障發生時,黑盒監控能快速發現故障,而白盒監控則側重於主動發現或者預測潛在的問題。一個完善的監控目標是要能夠從白盒的角度發現潛在問題,能夠在黑盒的角度快速發現已經發生的問題。
部署 Prometheus Blackbox 服務
環境:
- Prometheus Operator 版本 v0.29.0(手動部署)
- Kubernetes 版本 1.15.6 (二進制部署)
- Blackbox Exporter 版本 v0.16.0
Blackbox Exporter 部署
Exporter Configmap
定義,可以參考下面兩個鏈接
https://github.com/prometheus/blackbox_exporter/blob/master/CONFIGURATION.md
https://github.com/prometheus/blackbox_exporter/blob/master/example.yml首先得聲明一個 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項目 中獲取更多使用方法。