Prometheus Exporter 黑盒監(jiān)控 Kubernetes 服務(wù)

系統(tǒng)環(huán)境:
操作系統(tǒng): CentOS 7.9 Docker 版本: 20.10.8 Prometheus 版本: 2.29.1 Kubernetes 版本: 1.22.4 BlackBox Exporter 版本: 0.19.0
示例地址:
Kubernetes 部署 BlackBox Exporter 的部署文件[1]
一、BlackBox Exporter 是什么
BlackBox Exporter 是 Prometheus 官方提供的黑盒監(jiān)控解決方案,允許用戶通過 HTTP、HTTPS、DNS、TCP 以及 ICMP 的方式對網(wǎng)絡(luò)進(jìn)行探測,這種探測方式常常用于探測一個(gè)服務(wù)的運(yùn)行狀態(tài),觀察服務(wù)是否正常運(yùn)行。
二、黑盒監(jiān)控和白盒監(jiān)控
2.1 什么是白盒與黑盒監(jiān)控
在監(jiān)控系統(tǒng)中會(huì)經(jīng)常提到 白盒監(jiān)控 與 黑盒監(jiān)控 兩個(gè)關(guān)鍵詞,這里對這倆關(guān)鍵詞進(jìn)行一下簡單解釋:
墨盒監(jiān)控
黑和監(jiān)控指的是以用戶的身份測試服務(wù)的運(yùn)行狀態(tài)。常見的黑盒監(jiān)控手段包括 HTTP 探針、TCP 探針、DNS 探測、ICMP 等。黑盒監(jiān)控常用于檢測站點(diǎn)與服務(wù)可用性、連通性,以及訪問效率等。
白盒監(jiān)控
白盒監(jiān)控一般指的是我們?nèi)粘Ψ?wù)器狀態(tài)的監(jiān)控,如服務(wù)器資源使用量、容器的運(yùn)行狀態(tài)、中間件的穩(wěn)定情況等一系列比較直觀的監(jiān)控?cái)?shù)據(jù),這些都是支撐業(yè)務(wù)應(yīng)用穩(wěn)定運(yùn)行的基礎(chǔ)設(shè)施。
通過白盒能監(jiān)控,可以使我們能夠了解系統(tǒng)內(nèi)部的實(shí)際運(yùn)行狀況,而且還可以通過對監(jiān)控指標(biāo)數(shù)據(jù)的觀察與分析,可以讓我們提前預(yù)判服務(wù)器可能出現(xiàn)的問題,針對可能出現(xiàn)的問題進(jìn)行及時(shí)修正,避免造成不可預(yù)估的損失。
2.2 白盒監(jiān)控和黑盒監(jiān)控的區(qū)別
黑盒監(jiān)控與白盒監(jiān)控有著很大的不同,倆者的區(qū)別主要是,黑盒監(jiān)控是以故障為主導(dǎo),當(dāng)被監(jiān)控的服務(wù)發(fā)生故障時(shí),能快速進(jìn)行預(yù)警。而白盒監(jiān)控則更偏向于主動(dòng)的和提前預(yù)判方式,預(yù)測可能發(fā)生的故障。
一套完善的監(jiān)控系統(tǒng)是需要黑盒監(jiān)控與白盒監(jiān)控倆者配合同時(shí)工作的,白盒監(jiān)控預(yù)判可能存在的潛在問題,而黑盒監(jiān)控則是快速發(fā)現(xiàn)已經(jīng)發(fā)生的問題。
三、Kubernetes 部署 BlackBox Exporter
同樣,我們將 BlackBox Exporter 部署到 Kubernetes 集群中,可以按照下面步驟進(jìn)行部署。
3.1 創(chuàng)建 BlackBox 的 ConfigMap 資源
一般為了方便對 BlackBox Exporter 組件的配置參數(shù)進(jìn)行修改,所以我們將其配置文件存入 Kubernetes 的 ConfigMap 資源中,其中 ConfigMap 資源文件 blackbox-exporter-config.yaml 內(nèi)容如下:
apiVersion:?v1
kind:?ConfigMap
metadata:
??name:?blackbox-exporter
??labels:
????app:?blackbox-exporter
data:
??blackbox.yml:?|-
????modules:
??????##?-----------?DNS?檢測配置?-----------
??????dns_tcp:
????????prober:?dns
????????dns:
??????????transport_protocol:?"tcp"
??????????preferred_ip_protocol:?"ip4"
??????????query_name:?"kubernetes.default.svc.cluster.local"?#?用于檢測域名可用的網(wǎng)址
??????????query_type:?"A"
??????##?-----------?TCP?檢測模塊配置?-----------
??????tcp_connect:
????????prober:?tcp
????????timeout:?5s
??????##?-----------?ICMP?檢測配置?-----------
??????ping:
????????prober:?icmp
????????timeout:?5s
????????icmp:
??????????preferred_ip_protocol:?"ip4"
??????##?-----------?HTTP?GET?2xx?檢測模塊配置?-----------
??????http_get_2xx:
????????prober:?http
????????timeout:?10s
????????http:
??????????method:?GET
??????????preferred_ip_protocol:?"ip4"
??????????valid_http_versions:?["HTTP/1.1","HTTP/2"]
??????????valid_status_codes:?[200]???????????#?驗(yàn)證的HTTP狀態(tài)碼,默認(rèn)為2xx
??????????no_follow_redirects:?false??????????#?是否不跟隨重定向
??????##?-----------?HTTP?GET?3xx?檢測模塊配置?-----------
??????http_get_3xx:
????????prober:?http
????????timeout:?10s
????????http:
??????????method:?GET
??????????preferred_ip_protocol:?"ip4"
??????????valid_http_versions:?["HTTP/1.1","HTTP/2"]
??????????valid_status_codes:?[301,302,304,305,306,307]??#?驗(yàn)證的HTTP狀態(tài)碼,默認(rèn)為2xx
??????????no_follow_redirects:?false?????????????????????#?是否不跟隨重定向
??????##?-----------?HTTP?POST?監(jiān)測模塊?-----------
??????http_post_2xx:
????????prober:?http
????????timeout:?10s
????????http:
??????????method:?POST
??????????preferred_ip_protocol:?"ip4"
??????????valid_http_versions:?["HTTP/1.1",?"HTTP/2"]
??????????#headers:?????????????????????????????#?HTTP頭設(shè)置
??????????#??Content-Type:?application/json
??????????#body:?'{}'???????????????????????????#?請求體設(shè)置
參考 BlackBox Exporter 的 Github 提供的 示例配置文件[2]。
3.2 部署 BlackBox 的 ConfigMap 資源
將 ConfigMap 資源文件部署到 Kubernetes 中,執(zhí)行的命令如下:
-f: 指定部署的資源文件; -n: 指定部署的命名空間;
$?kubectl?apply?-f?blackbox-exporter-config.yaml?-n?kube-system
3.3 創(chuàng)建 BlackBox Exporter 的 Deployment 資源
創(chuàng)建在 Kubernetes 中部署 Backbox Exporter 的資源文件 blackbox-exporter-deploy.yaml,內(nèi)容如下:
apiVersion:?v1
kind:?Service
metadata:
??name:?blackbox-exporter
??labels:
????k8s-app:?blackbox-exporter
spec:
??type:?ClusterIP
??ports:
??-?name:?http
????port:?9115
????targetPort:?9115
??selector:
????k8s-app:?blackbox-exporter
---
apiVersion:?apps/v1
kind:?Deployment
metadata:
??name:?blackbox-exporter
??labels:
????k8s-app:?blackbox-exporter
spec:
??replicas:?1
??selector:
????matchLabels:
??????k8s-app:?blackbox-exporter
??template:
????metadata:
??????labels:
????????k8s-app:?blackbox-exporter
????spec:
??????containers:
??????-?name:?blackbox-exporter
????????image:?prom/blackbox-exporter:v0.19.0
????????args:
????????-?--config.file=/etc/blackbox_exporter/blackbox.yml
????????-?--web.listen-address=:9115
????????-?--log.level=info
????????ports:
????????-?name:?http
??????????containerPort:?9115
????????resources:
??????????limits:
????????????cpu:?200m
????????????memory:?256Mi
??????????requests:
????????????cpu:?100m
????????????memory:?50Mi
????????livenessProbe:
??????????tcpSocket:
????????????port:?9115
??????????initialDelaySeconds:?5
??????????timeoutSeconds:?5
??????????periodSeconds:?10
??????????successThreshold:?1
??????????failureThreshold:?3
????????readinessProbe:
??????????tcpSocket:
????????????port:?9115
??????????initialDelaySeconds:?5
??????????timeoutSeconds:?5
??????????periodSeconds:?10
??????????successThreshold:?1
??????????failureThreshold:?3
????????volumeMounts:
????????-?name:?config
??????????mountPath:?/etc/blackbox_exporter
??????volumes:
??????-?name:?config
????????configMap:
??????????name:?blackbox-exporter
??????????defaultMode:?420
3.4 部署 BlackBox Exporter 的 Deployment 資源
將 BlackBox Exporter 的 Deployment 資源部署到 Kubernetes 中:
-f: 指定要部署的資源文件; -n: 指定部署的命名空間;
$?kubectl?apply?-f?blackbox-exporter-deploy.yaml?-n?kube-system
3.5 觀察 BlackBox Exporter 部署狀態(tài)
執(zhí)行下面命令,觀察 BlackBox Exporter 的應(yīng)用部署狀態(tài),命令如下:
$?kubectl?get?-f?blackbox-exporter-deploy.yaml?-n?kube-system?-w
可以觀察到 Pod 運(yùn)行狀態(tài)如下:
NAME?????????????????????????????????????????READY???STATUS?????????????RESTARTS????????????AGE
blackbox-exporter-668fc6dcc8-2sfdr???????????1/1?????Running????????????0???????????????????8m44s
四、Prometheus 添加探測配置
4.1 創(chuàng)建 DNS 探測配置
創(chuàng)建 Prometheus 規(guī)則,添加使用 BlackBox Exporter 探測指定 DNS 服務(wù)器健康狀態(tài)的配置,內(nèi)容如下:
################?DNS?服務(wù)器監(jiān)控?###################
-?job_name:?"kubernetes-dns"
??metrics_path:?/probe
??params:
????##?配置要使用的模塊,要與blackbox?exporter配置中的一致
????##?這里使用DNS模塊
????module:?[dns_tcp]
??static_configs:
????##?配置要檢測的地址
????-?targets:
??????-?kube-dns.kube-system:53
??????-?8.8.4.4:53
??????-?8.8.8.8:53
??????-?223.5.5.5
??relabel_configs:
????##?將上面配置的靜態(tài)DNS服務(wù)器地址轉(zhuǎn)換為臨時(shí)變量?“__param_target”
????-?source_labels:?[__address__]
??????target_label:?__param_target
????##?將?“__param_target”?內(nèi)容設(shè)置為?instance?實(shí)例名稱
????-?source_labels:?[__param_target]
??????target_label:?instance
????##?BlackBox?Exporter?的?Service?地址
????-?target_label:?__address__
??????replacement:?blackbox-exporter.kube-system:9115
4.2 創(chuàng)建 Service 探測配置
創(chuàng)建用于探測 Kubernetes 服務(wù)的配置,對那些配置了 prometheus.io/http-probe: "true" 標(biāo)簽的 Kubernetes Service 資源的健康狀態(tài)進(jìn)行探測,配置內(nèi)容如下:
-?job_name:?"kubernetes-services"
??metrics_path:?/probe
??##?使用HTTP_GET_2xx與HTTP_GET_3XX模塊
??params:
????module:
????-?"http_get_2xx"
????-?"http_get_3xx"
??##?使用Kubernetes動(dòng)態(tài)服務(wù)發(fā)現(xiàn),且使用Service類型的發(fā)現(xiàn)
??kubernetes_sd_configs:
??-?role:?service
??relabel_configs:
????##?設(shè)置只監(jiān)測Kubernetes?Service中Annotation里配置了注解prometheus.io/http_probe:?true的service
??-?action:?keep
????source_labels:?[__meta_kubernetes_service_annotation_prometheus_io_http_probe]
????regex:?"true"
??-?action:?replace
????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"
????target_label:?__param_target
????regex:?(.+);(.+);(.+);(.+)
????replacement:?$1.$2:$3$4
??-?target_label:?__address__
????replacement:?blackbox-exporter.kube-system: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
4.3 將探測配置添加到 ConfigMap 資源
由于之前是基于 Kubernetes 部署的 Prometheus[3],且將其配置參數(shù)寫到 Kubernetes 的 ConfigMap 資源中,然后通過掛載 ConfigMap 到 Pod 內(nèi)部,這樣修改 ConfigMap 就可以修改 Prometheus 配置。
所以,這里將上面 Prometheus 中的配置存入到 Kubernetes 的 ConfigMap 資源文件 prometheus-config.yaml 中,資源內(nèi)容如下:
apiVersion:?v1
kind:?ConfigMap
metadata:
??name:?prometheus-config
data:
??prometheus.yml:?|
????global:
??????scrape_interval:?????15s
??????evaluation_interval:?15s
??????external_labels:
????????cluster:?"kubernetes"
????scrape_configs:
????##################################?Kubernetes?BlackBox?DNS?###################################
????-?job_name:?"kubernetes-dns"
??????metrics_path:?/probe
??????params:
????????module:?[dns_tcp]
??????static_configs:
????????-?targets:
??????????-?kube-dns.kube-system:53
??????????-?8.8.4.4:53
??????????-?8.8.8.8:53
??????????-?223.5.5.5
??????relabel_configs:
????????-?source_labels:?[__address__]
??????????target_label:?__param_target
????????-?source_labels:?[__param_target]
??????????target_label:?instance
????????-?target_label:?__address__
??????????replacement:?blackbox-exporter.kube-system:9115
????##################################?Kubernetes?BlackBox?Services?###################################
????-?job_name:?'kubernetes-services'
??????metrics_path:?/probe
??????params:
????????module:
????????-?"http_get_2xx"
????????-?"http_get_3xx"
??????kubernetes_sd_configs:
??????-?role:?service
??????relabel_configs:
??????-?action:?keep
????????source_labels:?[__meta_kubernetes_service_annotation_prometheus_io_http_probe]
????????regex:?"true"
??????-?action:?replace
????????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"
????????target_label:?__param_target
????????regex:?(.+);(.+);(.+);(.+)
????????replacement:?$1.$2:$3$4
??????-?target_label:?__address__
????????replacement:?blackbox-exporter.kube-system: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
4.4 更新 Prometheus 的 ConfigMap 資源
更新 Prometheus 在 Kubernetes 的 ConfigMap 資源中的配置參數(shù),命令如下:
-f: 指定要部署的資源文件。 -n: 指定 Namespace 名稱。
$?kubectl?apply?-f?prometheus-config.yaml?-n?kube-system
4.5 使 Prometheus 重新加載配置
更新 Prometheus 配置后,需要使 Prometheus 重新加載配置,這里本人的 Prometheus 地址為 http://192.168.2.32:30900,所以執(zhí)行命令如下:
$?curl?-XPOST?http://192.168.2.32:30900/-/reload
五、Prometheus 探測 Kubernetes 應(yīng)用示例
5.1 探測 Service 示例
這里先部署一個(gè)用于測試的 Nginx 應(yīng)用鏡像,部署的 Deployment 資源文件 nginx-deploy.yaml 內(nèi)容如下:
apiVersion:?v1
kind:?Service
metadata:
??name:?nginx
??labels:
????k8s-app:?nginx
??annotations:
????prometheus.io/http-probe:?"true"????????###?設(shè)置該服務(wù)執(zhí)行HTTP探測
????prometheus.io/http-probe-port:?"80"?????###?設(shè)置HTTP探測的接口
????prometheus.io/http-probe-path:?"/"??????###?設(shè)置HTTP探測的地址
spec:
??type:?ClusterIP
??ports:
??-?name:?http
????port:?80
????targetPort:?80
??selector:
????app:?nginx
---
apiVersion:?apps/v1
kind:?Deployment
metadata:
??name:?nginx
??labels:
????app:?nginx
spec:
??replicas:?1
??selector:
????matchLabels:
??????app:?nginx
??template:
????metadata:
??????labels:
????????app:?nginx
????spec:
??????containers:
??????-?name:?nginx
????????image:?nginx:1.19
????????ports:
????????-?containerPort:?80
5.2 將應(yīng)用部署到 Kubernetes 中
將測試用例 Deployment 資源部署到 Kubernetes 中:
-f: 指定待更新的資源文件。 -n: 指定應(yīng)用所在的的命名空間。
$?kubectl?apply?-f?nginx-deploy.yaml?-n?kube-system
六、訪問 Prometheus UI 界面觀察
訪問 Prometheus 的 UI 界面,進(jìn)入 Status 中的 Targets 界面,將觀察到:

可以看到 Prometheus 已經(jīng)按照配置的 DNS 服務(wù)器地址列表,執(zhí)行定時(shí)探測 DNS 服務(wù)器 的健康狀況,
除此之外,Prometheus 還會(huì)定期探測那些添加了特定注解的,存在于 Kubernetes 中的 Service 資源的健康狀態(tài)。
七、Grafana 中引入 BlackBox Exporter 監(jiān)控看板
在之前的 ["Kubernetes 部署圖表組件 Grafana"](http://www.mydlq.club/article/111/ ""Kubernetes 部署圖表組件 Grafana"") 文章中,已經(jīng)介紹過如何在 Kubernetes 中部署 Grafana,所以這里就不再介紹該組件的安裝過程,只是簡單介紹下如何引入黑盒監(jiān)控的監(jiān)控看板,操作過程如下:
7.1 Grafana 添加 Prometheus 數(shù)據(jù)庫
進(jìn)入 Grafana 界面,輸入默認(rèn)的用戶名/密碼 (admin/123456) 進(jìn)入 Grafana 界面中:

然后主界面后點(diǎn)左側(cè)欄菜單,選擇 Data Sources 來添加 Prometheus 數(shù)據(jù)庫:

輸入數(shù)據(jù)庫名稱與 Promehteus 地址,然后點(diǎn) Save&Test 按鈕。

7.2 Grafana 中引入 BlackBox Exporeter 看板
點(diǎn)擊 Grafana 左側(cè)欄菜單,選擇 Manage 菜單,進(jìn)入后點(diǎn)擊右上角 Import 按鈕:

設(shè)置 Import 的 ID 號為 9965,引入 BlackBox Exporter 模板,然后點(diǎn)擊 Load 按鈕進(jìn)入配置數(shù)據(jù)庫:

選擇使用上面配置的 Prometheus 數(shù)據(jù)庫,之后點(diǎn)擊 Import 按鈕進(jìn)入看板:

可以看到如下監(jiān)控信息:

到此黑盒監(jiān)控配置完成,當(dāng)然唯一不足的就是現(xiàn)在已經(jīng)有了指標(biāo)數(shù)據(jù),但是根據(jù)這些數(shù)據(jù)只能觀察到一些發(fā)生的信息,而沒有根據(jù)這些監(jiān)控?cái)?shù)據(jù)執(zhí)行告警。
所以,如何使用這些數(shù)據(jù)進(jìn)行告警,還需要大家摸索,既可以使用 Promethes 配合 AlertManager 實(shí)現(xiàn)告警,也可以使用 Grafana 的告警功能實(shí)現(xiàn)告警,怎么實(shí)現(xiàn)還得看大家業(yè)務(wù)情況,自行解決一下哈~。
引用鏈接
Kubernetes 部署 BlackBox Exporter 的部署文件: https://github.com/my-dlq/blog-example/tree/master/kubernetes/kubernetes-blackbox-exporter
[2]示例配置文件: https://github.com/prometheus/blackbox_exporter/blob/master/example.yml
[3]Kubernetes 部署的 Prometheus: http://www.mydlq.club/article/110/
原文鏈接:http://www.mydlq.club/article/120/


你可能還喜歡
點(diǎn)擊下方圖片即可閱讀

云原生是一種信仰???
關(guān)注公眾號
后臺回復(fù)?k8s?獲取史上最方便快捷的 Kubernetes 高可用部署工具,只需一條命令,連 ssh 都不需要!


點(diǎn)擊?"閱讀原文"?獲取更好的閱讀體驗(yàn)!
發(fā)現(xiàn)朋友圈變“安靜”了嗎?


