Prometheus Exporter 黑盒监控 Kubernetes 服务

云原生实验室

共 12448字,需浏览 25分钟

 · 2022-01-14


系统环境:

  • 操作系统: 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 官方提供的黑盒监控解决方案,允许用户通过 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 内容如下:

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" # 用于检测域名可用的网址
          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]           # 验证的HTTP状态码,默认为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]  # 验证的HTTP状态码,默认为2xx
          no_follow_redirects: false                     # 是否不跟随重定向
      ## ----------- HTTP POST 监测模块 -----------
      http_post_2xx:
        prober: http
        timeout: 10s
        http:
          method: POST
          preferred_ip_protocol: "ip4"
          valid_http_versions: ["HTTP/1.1", "HTTP/2"]
          #headers:                             # HTTP头设置
          #  Content-Type: application/json
          #body: '{}'                           # 请求体设置

参考 BlackBox Exporter 的 Github 提供的 示例配置文件[2]

3.2 部署 BlackBox 的 ConfigMap 资源

ConfigMap 资源文件部署到 Kubernetes 中,执行的命令如下:

  • -f: 指定部署的资源文件;
  • -n: 指定部署的命名空间;
$ kubectl apply -f blackbox-exporter-config.yaml -n kube-system

3.3 创建 BlackBox Exporter 的 Deployment 资源

创建在 Kubernetes 中部署 Backbox Exporter 的资源文件 blackbox-exporter-deploy.yaml,内容如下:

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 ExporterDeployment 资源部署到 Kubernetes 中:

  • -f: 指定要部署的资源文件;
  • -n: 指定部署的命名空间;
$ kubectl apply -f blackbox-exporter-deploy.yaml -n kube-system

3.5 观察 BlackBox Exporter 部署状态

执行下面命令,观察 BlackBox Exporter 的应用部署状态,命令如下:

$ kubectl get -f blackbox-exporter-deploy.yaml -n kube-system -w

可以观察到 Pod 运行状态如下:

NAME                                         READY   STATUS             RESTARTS            AGE
blackbox-exporter-668fc6dcc8-2sfdr           1/1     Running            0                   8m44s

四、Prometheus 添加探测配置

4.1 创建 DNS 探测配置

创建 Prometheus 规则,添加使用 BlackBox Exporter 探测指定 DNS 服务器健康状态的配置,内容如下:

################ DNS 服务器监控 ###################
- 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:
    ## 将上面配置的静态DNS服务器地址转换为临时变量 “__param_target”
    - source_labels: [__address__]
      target_label: __param_target
    ## 将 “__param_target” 内容设置为 instance 实例名称
    - source_labels: [__param_target]
      target_label: instance
    ## BlackBox Exporter 的 Service 地址
    - target_label: __address__
      replacement: blackbox-exporter.kube-system:9115

4.2 创建 Service 探测配置

创建用于探测 Kubernetes 服务的配置,对那些配置了 prometheus.io/http-probe: "true" 标签的 Kubernetes Service 资源的健康状态进行探测,配置内容如下:

- job_name: "kubernetes-services"
  metrics_path: /probe
  ## 使用HTTP_GET_2xx与HTTP_GET_3XX模块
  params:
    module:
    - "http_get_2xx"
    - "http_get_3xx"
  ## 使用Kubernetes动态服务发现,且使用Service类型的发现
  kubernetes_sd_configs:
  - role: service
  relabel_configs:
    ## 设置只监测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],且将其配置参数写到 Kubernetes 的 ConfigMap 资源中,然后通过挂载 ConfigMap 到 Pod 内部,这样修改 ConfigMap 就可以修改 Prometheus 配置。

所以,这里将上面 Prometheus 中的配置存入到 Kubernetes 的 ConfigMap 资源文件 prometheus-config.yaml 中,资源内容如下:

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 资源中的配置参数,命令如下:

  • -f: 指定要部署的资源文件。
  • -n: 指定 Namespace 名称。
$ kubectl apply -f prometheus-config.yaml -n kube-system

4.5 使 Prometheus 重新加载配置

更新 Prometheus 配置后,需要使 Prometheus 重新加载配置,这里本人的 Prometheus 地址为 http://192.168.2.32:30900,所以执行命令如下:

$ curl -XPOST http://192.168.2.32:30900/-/reload

五、Prometheus 探测 Kubernetes 应用示例

5.1 探测 Service 示例

这里先部署一个用于测试的 Nginx 应用镜像,部署的 Deployment 资源文件 nginx-deploy.yaml 内容如下:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    k8s-app: nginx
  annotations:
    prometheus.io/http-probe: "true"        ### 设置该服务执行HTTP探测
    prometheus.io/http-probe-port: "80"     ### 设置HTTP探测的接口
    prometheus.io/http-probe-path: "/"      ### 设置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 将应用部署到 Kubernetes 中

将测试用例 Deployment 资源部署到 Kubernetes 中:

  • -f: 指定待更新的资源文件。
  • -n: 指定应用所在的的命名空间。
$ 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"](http://www.mydlq.club/article/111/ ""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 的告警功能实现告警,怎么实现还得看大家业务情况,自行解决一下哈~。

引用链接

[1]

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/


你可能还喜欢

点击下方图片即可阅读

我妈今年 70 岁,她用了 21 年的 Linux!

云原生是一种信仰 🤘

关注公众号

后台回复◉k8s◉获取史上最方便快捷的 Kubernetes 高可用部署工具,只需一条命令,连 ssh 都不需要!



点击 "阅读原文" 获取更好的阅读体验!


发现朋友圈变“安静”了吗?

浏览 24
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报