Prometheus Exporter 黑盒监控 Kubernetes 服务
文章目录
!版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。
系统环境:
- 操作系统: CentOS 7.9
- Docker 版本: 20.10.8
- Prometheus 版本: 2.29.1
- Kubernetes 版本: 1.22.4
- BlackBox Exporter 版本: 0.19.0
示例地址:
系列文章目录
- 01. Kubernetes 部署监控工具 Prometheus
- 02. Kubernetes 部署图表工具 Grafana
- 03. Prometheus 结合 Node Exporter 监控 Kubernetes 集群节点
- 04. Prometheus 结合 StateMetrics+cAdvisor 监控 Kubernetes 集群服务
- 05. Prometheus 监听指定标签 Kubernetes 服务
- 06. Prometheus 监控 Kubernetes ETCD 集群
- 07. Prometheus Exporter 黑盒监控 Kubernetes 服务
- 08. Kubernetes 部署告警工具 AlertManager
- 09. AlertManager 配置邮箱告警
- 其它章节整理中...
一、BlackBox Exporter 是什么
BlackBox Exporter 是 Prometheus 官方提供的黑盒监控解决方案,允许用户通过 HTTP、HTTPS、DNS、TCP 以及 ICMP 的方式对网络进行探测,这种探测方式常常用于探测一个服务的运行状态,观察服务是否正常运行。
二、黑盒监控和白盒监控
2.1 什么是白盒与黑盒监控
在监控系统中会经常提到 白盒监控 与 黑盒监控 两个关键词,这里对这俩关键词进行一下简单解释:
墨盒监控
黑和监控指的是以用户的身份测试服务的运行状态。常见的黑盒监控手段包括 HTTP 探针、TCP 探针、DNS 探测、ICMP 等。黑盒监控常用于检测站点与服务可用性、连通性,以及访问效率等。
白盒监控
白盒监控一般指的是我们日常对服务器状态的监控,如服务器资源使用量、容器的运行状态、中间件的稳定情况等一系列比较直观的监控数据,这些都是支撑业务应用稳定运行的基础设施。
通过白盒能监控,可以使我们能够了解系统内部的实际运行状况,而且还可以通过对监控指标数据的观察与分析,可以让我们提前预判服务器可能出现的问题,针对可能出现的问题进行及时修正,避免造成不可预估的损失。
2.2 白盒监控和黑盒监控的区别
黑盒监控与白盒监控有着很大的不同,俩者的区别主要是,黑盒监控是以故障为主导,当被监控的服务发生故障时,能快速进行预警。而白盒监控则更偏向于主动的和提前预判方式,预测可能发生的故障。
一套完善的监控系统是需要黑盒监控与白盒监控俩者配合同时工作的,白盒监控预判可能存在的潜在问题,而黑盒监控则是快速发现已经发生的问题。
三、Kubernetes 部署 BlackBox Exporter
同样,我们将 BlackBox Exporter 部署到 Kubernetes 集群中,可以按照下面步骤进行部署。
3.1 创建 BlackBox 的 ConfigMap 资源
一般为了方便对 BlackBox Exporter 组件的配置参数进行修改,所以我们将其配置文件存入 Kubernetes 的 ConfigMap 资源中,其中 ConfigMap 资源文件 blackbox-exporter-config.yaml
内容如下:
1apiVersion: v1
2kind: ConfigMap
3metadata:
4 name: blackbox-exporter
5 labels:
6 app: blackbox-exporter
7data:
8 blackbox.yml: |-
9 modules:
10 ## ----------- DNS 检测配置 -----------
11 dns_tcp:
12 prober: dns
13 dns:
14 transport_protocol: "tcp"
15 preferred_ip_protocol: "ip4"
16 query_name: "kubernetes.default.svc.cluster.local" # 用于检测域名可用的网址
17 query_type: "A"
18 ## ----------- TCP 检测模块配置 -----------
19 tcp_connect:
20 prober: tcp
21 timeout: 5s
22 ## ----------- ICMP 检测配置 -----------
23 ping:
24 prober: icmp
25 timeout: 5s
26 icmp:
27 preferred_ip_protocol: "ip4"
28 ## ----------- HTTP GET 2xx 检测模块配置 -----------
29 http_get_2xx:
30 prober: http
31 timeout: 10s
32 http:
33 method: GET
34 preferred_ip_protocol: "ip4"
35 valid_http_versions: ["HTTP/1.1","HTTP/2"]
36 valid_status_codes: [200] # 验证的HTTP状态码,默认为2xx
37 no_follow_redirects: false # 是否不跟随重定向
38 ## ----------- HTTP GET 3xx 检测模块配置 -----------
39 http_get_3xx:
40 prober: http
41 timeout: 10s
42 http:
43 method: GET
44 preferred_ip_protocol: "ip4"
45 valid_http_versions: ["HTTP/1.1","HTTP/2"]
46 valid_status_codes: [301,302,304,305,306,307] # 验证的HTTP状态码,默认为2xx
47 no_follow_redirects: false # 是否不跟随重定向
48 ## ----------- HTTP POST 监测模块 -----------
49 http_post_2xx:
50 prober: http
51 timeout: 10s
52 http:
53 method: POST
54 preferred_ip_protocol: "ip4"
55 valid_http_versions: ["HTTP/1.1", "HTTP/2"]
56 #headers: # HTTP头设置
57 # Content-Type: application/json
58 #body: '{}' # 请求体设置
参考 BlackBox Exporter 的 Github 提供的 示例配置文件。
3.2 部署 BlackBox 的 ConfigMap 资源
将 ConfigMap 资源文件部署到 Kubernetes 中,执行的命令如下:
- -f: 指定部署的资源文件;
- -n: 指定部署的命名空间;
1$ kubectl apply -f blackbox-exporter-config.yaml -n kube-system
3.3 创建 BlackBox Exporter 的 Deployment 资源
创建在 Kubernetes 中部署 Backbox Exporter 的资源文件 blackbox-exporter-deploy.yaml
,内容如下:
1apiVersion: v1
2kind: Service
3metadata:
4 name: blackbox-exporter
5 labels:
6 k8s-app: blackbox-exporter
7spec:
8 type: ClusterIP
9 ports:
10 - name: http
11 port: 9115
12 targetPort: 9115
13 selector:
14 k8s-app: blackbox-exporter
15---
16apiVersion: apps/v1
17kind: Deployment
18metadata:
19 name: blackbox-exporter
20 labels:
21 k8s-app: blackbox-exporter
22spec:
23 replicas: 1
24 selector:
25 matchLabels:
26 k8s-app: blackbox-exporter
27 template:
28 metadata:
29 labels:
30 k8s-app: blackbox-exporter
31 spec:
32 containers:
33 - name: blackbox-exporter
34 image: prom/blackbox-exporter:v0.19.0
35 args:
36 - --config.file=/etc/blackbox_exporter/blackbox.yml
37 - --web.listen-address=:9115
38 - --log.level=info
39 ports:
40 - name: http
41 containerPort: 9115
42 resources:
43 limits:
44 cpu: 200m
45 memory: 256Mi
46 requests:
47 cpu: 100m
48 memory: 50Mi
49 livenessProbe:
50 tcpSocket:
51 port: 9115
52 initialDelaySeconds: 5
53 timeoutSeconds: 5
54 periodSeconds: 10
55 successThreshold: 1
56 failureThreshold: 3
57 readinessProbe:
58 tcpSocket:
59 port: 9115
60 initialDelaySeconds: 5
61 timeoutSeconds: 5
62 periodSeconds: 10
63 successThreshold: 1
64 failureThreshold: 3
65 volumeMounts:
66 - name: config
67 mountPath: /etc/blackbox_exporter
68 volumes:
69 - name: config
70 configMap:
71 name: blackbox-exporter
72 defaultMode: 420
3.4 部署 BlackBox Exporter 的 Deployment 资源
将 BlackBox Exporter 的 Deployment 资源部署到 Kubernetes 中:
- -f: 指定要部署的资源文件;
- -n: 指定部署的命名空间;
1$ kubectl apply -f blackbox-exporter-deploy.yaml -n kube-system
3.5 观察 BlackBox Exporter 部署状态
执行下面命令,观察 BlackBox Exporter 的应用部署状态,命令如下:
1$ kubectl get -f blackbox-exporter-deploy.yaml -n kube-system -w
可以观察到 Pod 运行状态如下:
1NAME READY STATUS RESTARTS AGE
2blackbox-exporter-668fc6dcc8-2sfdr 1/1 Running 0 8m44s
四、Prometheus 添加探测配置
4.1 创建 DNS 探测配置
创建 Prometheus 规则,添加使用 BlackBox Exporter 探测指定 DNS 服务器健康状态的配置,内容如下:
1################ DNS 服务器监控 ###################
2- job_name: "kubernetes-dns"
3 metrics_path: /probe
4 params:
5 ## 配置要使用的模块,要与blackbox exporter配置中的一致
6 ## 这里使用DNS模块
7 module: [dns_tcp]
8 static_configs:
9 ## 配置要检测的地址
10 - targets:
11 - kube-dns.kube-system:53
12 - 8.8.4.4:53
13 - 8.8.8.8:53
14 - 223.5.5.5
15 relabel_configs:
16 ## 将上面配置的静态DNS服务器地址转换为临时变量 “__param_target”
17 - source_labels: [__address__]
18 target_label: __param_target
19 ## 将 “__param_target” 内容设置为 instance 实例名称
20 - source_labels: [__param_target]
21 target_label: instance
22 ## BlackBox Exporter 的 Service 地址
23 - target_label: __address__
24 replacement: blackbox-exporter.kube-system:9115
4.2 创建 Service 探测配置
创建用于探测 Kubernetes 服务的配置,对那些配置了 prometheus.io/http-probe: "true"
标签的 Kubernetes Service 资源的健康状态进行探测,配置内容如下:
1- job_name: "kubernetes-services"
2 metrics_path: /probe
3 ## 使用HTTP_GET_2xx与HTTP_GET_3XX模块
4 params:
5 module:
6 - "http_get_2xx"
7 - "http_get_3xx"
8 ## 使用Kubernetes动态服务发现,且使用Service类型的发现
9 kubernetes_sd_configs:
10 - role: service
11 relabel_configs:
12 ## 设置只监测Kubernetes Service中Annotation里配置了注解prometheus.io/http_probe: true的service
13 - action: keep
14 source_labels: [__meta_kubernetes_service_annotation_prometheus_io_http_probe]
15 regex: "true"
16 - action: replace
17 source_labels:
18 - "__meta_kubernetes_service_name"
19 - "__meta_kubernetes_namespace"
20 - "__meta_kubernetes_service_annotation_prometheus_io_http_probe_port"
21 - "__meta_kubernetes_service_annotation_prometheus_io_http_probe_path"
22 target_label: __param_target
23 regex: (.+);(.+);(.+);(.+)
24 replacement: $1.$2:$3$4
25 - target_label: __address__
26 replacement: blackbox-exporter.kube-system:9115
27 - source_labels: [__param_target]
28 target_label: instance
29 - action: labelmap
30 regex: __meta_kubernetes_service_label_(.+)
31 - source_labels: [__meta_kubernetes_namespace]
32 target_label: kubernetes_namespace
33 - source_labels: [__meta_kubernetes_service_name]
34 target_label: kubernetes_name
4.3 将探测配置添加到 ConfigMap 资源
由于之前是基于 Kubernetes 部署的 Prometheus,且将其配置参数写到 Kubernetes 的 ConfigMap 资源中,然后通过挂载 ConfigMap 到 Pod 内部,这样修改 ConfigMap 就可以修改 Prometheus 配置。
所以,这里将上面 Prometheus 中的配置存入到 Kubernetes 的 ConfigMap 资源文件 prometheus-config.yaml
中,资源内容如下:
1apiVersion: v1
2kind: ConfigMap
3metadata:
4 name: prometheus-config
5data:
6 prometheus.yml: |
7 global:
8 scrape_interval: 15s
9 evaluation_interval: 15s
10 external_labels:
11 cluster: "kubernetes"
12
13 scrape_configs:
14 ################################## Kubernetes BlackBox DNS ###################################
15 - job_name: "kubernetes-dns"
16 metrics_path: /probe
17 params:
18 module: [dns_tcp]
19 static_configs:
20 - targets:
21 - kube-dns.kube-system:53
22 - 8.8.4.4:53
23 - 8.8.8.8:53
24 - 223.5.5.5
25 relabel_configs:
26 - source_labels: [__address__]
27 target_label: __param_target
28 - source_labels: [__param_target]
29 target_label: instance
30 - target_label: __address__
31 replacement: blackbox-exporter.kube-system:9115
32 ################################## Kubernetes BlackBox Services ###################################
33 - job_name: 'kubernetes-services'
34 metrics_path: /probe
35 params:
36 module:
37 - "http_get_2xx"
38 - "http_get_3xx"
39 kubernetes_sd_configs:
40 - role: service
41 relabel_configs:
42 - action: keep
43 source_labels: [__meta_kubernetes_service_annotation_prometheus_io_http_probe]
44 regex: "true"
45 - action: replace
46 source_labels:
47 - "__meta_kubernetes_service_name"
48 - "__meta_kubernetes_namespace"
49 - "__meta_kubernetes_service_annotation_prometheus_io_http_probe_port"
50 - "__meta_kubernetes_service_annotation_prometheus_io_http_probe_path"
51 target_label: __param_target
52 regex: (.+);(.+);(.+);(.+)
53 replacement: $1.$2:$3$4
54 - target_label: __address__
55 replacement: blackbox-exporter.kube-system:9115
56 - source_labels: [__param_target]
57 target_label: instance
58 - action: labelmap
59 regex: __meta_kubernetes_service_label_(.+)
60 - source_labels: [__meta_kubernetes_namespace]
61 target_label: kubernetes_namespace
62 - source_labels: [__meta_kubernetes_service_name]
63 target_label: kubernetes_name
4.4 更新 Prometheus 的 ConfigMap 资源
更新 Prometheus 在 Kubernetes 的 ConfigMap 资源中的配置参数,命令如下:
- -f: 指定要部署的资源文件。
- -n: 指定 Namespace 名称。
1$ kubectl apply -f prometheus-config.yaml -n kube-system
4.5 使 Prometheus 重新加载配置
更新 Prometheus 配置后,需要使 Prometheus 重新加载配置,这里本人的 Prometheus 地址为 http://192.168.2.32:30900
,所以执行命令如下:
1$ curl -XPOST http://192.168.2.32:30900/-/reload
五、Prometheus 探测 Kubernetes 应用示例
5.1 探测 Service 示例
这里先部署一个用于测试的 Nginx 应用镜像,部署的 Deployment 资源文件 nginx-deploy.yaml
内容如下:
1apiVersion: v1
2kind: Service
3metadata:
4 name: nginx
5 labels:
6 k8s-app: nginx
7 annotations:
8 prometheus.io/http-probe: "true" ### 设置该服务执行HTTP探测
9 prometheus.io/http-probe-port: "80" ### 设置HTTP探测的接口
10 prometheus.io/http-probe-path: "/" ### 设置HTTP探测的地址
11spec:
12 type: ClusterIP
13 ports:
14 - name: http
15 port: 80
16 targetPort: 80
17 selector:
18 app: nginx
19---
20apiVersion: apps/v1
21kind: Deployment
22metadata:
23 name: nginx
24 labels:
25 app: nginx
26spec:
27 replicas: 1
28 selector:
29 matchLabels:
30 app: nginx
31 template:
32 metadata:
33 labels:
34 app: nginx
35 spec:
36 containers:
37 - name: nginx
38 image: nginx:1.19
39 ports:
40 - containerPort: 80
5.2 将应用部署到 Kubernetes 中
将测试用例 Deployment 资源部署到 Kubernetes 中:
- -f: 指定待更新的资源文件。
- -n: 指定应用所在的的命名空间。
1$ kubectl apply -f nginx-deploy.yaml -n kube-system
六、访问 Prometheus UI 界面观察
访问 Prometheus 的 UI 界面,进入 Status 中的 Targets 界面,将观察到:
可以看到 Prometheus 已经按照配置的 DNS 服务器地址列表,执行定时探测 DNS服务器 的健康状况,
除此之外,Prometheus 还会定期探测那些添加了特定注解的,存在于 Kubernetes 中的 Service 资源的健康状态。
七、Grafana 中引入 BlackBox Exporter 监控看板
在之前的 "Kubernetes 部署图表组件 Grafana" 文章中,已经介绍过如何在 Kubernetes 中部署 Grafana,所以这里就不再介绍该组件的安装过程,只是简单介绍下如何引入黑盒监控的监控看板,操作过程如下:
7.1 Grafana 添加 Prometheus 数据库
进入 Grafana 界面,输入默认的用户名/密码 (admin/123456)
进入 Grafana 界面中:
然后主界面后点左侧栏菜单,选择 Data Sources 来添加 Prometheus 数据库:
输入数据库名称与 Promehteus 地址,然后点 Save&Test 按钮。
7.2 Grafana 中引入 BlackBox Exporeter 看板
点击 Grafana 左侧栏菜单,选择 Manage 菜单,进入后点击右上角 Import 按钮:
设置 Import 的 ID 号为 9965
,引入 BlackBox Exporter 模板,然后点击 Load 按钮进入配置数据库:
选择使用上面配置的 Prometheus 数据库,之后点击 Import 按钮进入看板:
可以看到如下监控信息:
到此黑盒监控配置完成,当然唯一不足的就是现在已经有了指标数据,但是根据这些数据只能观察到一些发生的信息,而没有根据这些监控数据执行告警。
所以,如何使用这些数据进行告警,还需要大家摸索,既可以使用 Promethes 配合 AlertManager 实现告警,也可以使用 Grafana 的告警功能实现告警,怎么实现还得看大家业务情况,自行解决一下哈~。
---END---
如果本文对你有帮助,可以关注我的公众号"小豆丁技术栈"了解最新动态,顺便也请帮忙 github 点颗星哦~感谢~
!版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。