Prometheus Exporter 黑盒监控 Kubernetes 服务

Prometheus Exporter 黑盒监控 Kubernetes 服务

文章目录

  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。


系统环境:

  • 操作系统: CentOS 7.9
  • Docker 版本: 20.10.8
  • Prometheus 版本: 2.29.1
  • Kubernetes 版本: 1.22.4
  • BlackBox Exporter 版本: 0.19.0

示例地址:


系列文章目录


一、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 组件的配置参数进行修改,所以我们将其配置文件存入 KubernetesConfigMap 资源中,其中 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 ExporterDeployment 资源部署到 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 按钮:

设置 ImportID 号为 9965,引入 BlackBox Exporter 模板,然后点击 Load 按钮进入配置数据库:

选择使用上面配置的 Prometheus 数据库,之后点击 Import 按钮进入看板:

可以看到如下监控信息:

到此黑盒监控配置完成,当然唯一不足的就是现在已经有了指标数据,但是根据这些数据只能观察到一些发生的信息,而没有根据这些监控数据执行告警。

所以,如何使用这些数据进行告警,还需要大家摸索,既可以使用 Promethes 配合 AlertManager 实现告警,也可以使用 Grafana 的告警功能实现告警,怎么实现还得看大家业务情况,自行解决一下哈~。

---END---

如果本文对你有帮助,可以关注我的公众号"小豆丁技术栈"了解最新动态,顺便也请帮忙 github 点颗星哦~感谢~


  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。