You need to enable JavaScript to run this app.
导航

使用托管 Prometheus 实现黑盒监控

最近更新时间2023.11.07 14:47:30

首次发布时间2023.06.05 22:23:06

当您在容器服务集群接入托管 Prometheus 后,允许通过 Probe 来满足集群和应用的黑盒监控需求。本文为您介绍如何通过 Probe 来配置黑盒监控。

背景信息

在标准的 Kubernetes 集群中,我们可以通过配置 ServiceMonitor 或 PodMonitor 进行服务发现,对集群内的资源或服务进行监控,例如:监控主机的资源用量、容器的运行状态、数据库中间件的运行数据等等。这些都是支持业务和服务的基础设施,通过监控其暴露的相关指标,能够了解其内部的实际运行状态,预判可能出现的问题,从而对潜在的不确定因素进行优化。这种通过直接观测应用内部指标的监控方法,也被称之为 白盒监控

除了白盒监控以外,实际中还经常使用 黑盒监控(Blackbox) 对服务进行监控。所谓黑盒监控,即以用户的视角测试和监控服务的外部可见性,常见的黑盒监控包括 HTTP 探针、TCP 探针、DNS 探针、ICMP 探针、gRPC 探针等,可以用于检测站点或者服务的可访问性,以及访问效率等。例如:

  • HTTP 探测:HTTP 服务有效性监控、SSL 证书有效期等。
  • ICMP 探测:网络连通性检测、主机探活等。
  • TCP 探测:主机 TCP 端口探活等。
    alt

说明

Blackbox Exporter 是 Prometheus 社区提供的官方黑盒监控解决方案,其允许用户通过 HTTP、HTTPS、DNS、TCP、ICMP 以及 gRPC 等方式对网络和应用进行探测和监控。详情请参见 官方文档

黑盒监控与白盒监控的主要区别和应用场景为:

  • 黑盒监控: 用户视角,以故障为导向,侧重监控应用的外部服务是否正常。当故障发生时,黑盒监控能快速发现故障。
  • 白盒监控: 应用视角,侧重监控应用的内部运行情况,并以此预测潜在的问题。
    alt

说明

一个典型的、完善的监控链路,需要白盒监控和黑盒监控共同完成。即从白盒监控的角度发现潜在问题,从黑盒监控的角度快速发现已经发生的问题。

前提条件

  • 已注册并开通火山引擎容器服务(VKE)。
  • 已创建托管 Prometheus 工作区,详情请参见 创建工作区
  • 已创建集群,详情请参见 创建集群
  • VKE 集群已接入托管 Prometheus,详情请参见 容器服务接入
  • 已通过 kubectl 连接目标集群。详情请参见 连接集群
  • 如果您需要监控集群外部的服务,需要开启 blackbox-exporter 组件所在集群的 公网访问 功能,详情请参见 容器服务 FAQ

操作步骤

步骤一:创建 Probe CRD 资源

如果您的集群中不存在 Probe CRD 资源,您需要在本地环境中连接集群,执行以下命令,在集群中创建 Probe CRD 资源。

kubectl apply -f https://vmp-release-cn-beijing.tos-cn-beijing.volces.com/manifests/crds/promopeartor-crd-probes.yaml

说明

  • 如果您的集群所在地域不为 华北2(北京),则您需要将上述命令中的 cn-beijing 字段修改为对应地域的 RegionID。例如:华东2(上海)地域的集群,部署命令为 kubectl apply -f https://vmp-release-cn-shanghai.tos-cn-shanghai.volces.com/manifests/crds/promopeartor-crd-probes.yaml。地域的 RegionID 详情请参见 地域和可用区
  • ServiceMonitor 和 PodMonitor 对应 CRD 资源的部署方式,请参见 如何在集群中创建 ServiceMonitor 等 CRD 资源?

步骤二:使用 ConfigMap 管理 blackbox-exporter 配置

  1. 登录 容器服务控制台
  2. 单击左侧导航栏中的 集群
  3. 在集群列表页面,单击需要配置的目标集群。
  4. 在集群管理页面的左侧导航栏中,选择 配置 > 配置项,单击 使用 Yaml 创建,创建配置项。
apiVersion: v1
kind: ConfigMap
metadata:
  name: blackbox-config
  namespace: volcano-metrics
data:
  blackbox.yml: |-
    modules:
      ## ------------HTTP 检测模块配置------------
      http_2xx: 
        prober: http
        timeout: 5s ## 探测超时时间
        http:
          valid_http_versions: ["HTTP/1.1", "HTTP/2.0"]   
          valid_status_codes: []  ## HTTP 返回状态码,默认为 2xx
          method: GET ## HTTP GET 方法
          preferred_ip_protocol: "ip4" ## HTTP 探针默认为 IPv6,需要使用该配置项强制通过 IPv4 进行探测
      ## ------------HTTP POST 监测模块配置------------
      http_post_2xx: 
        prober: http
        timeout: 5s ## 探测超时时间
        http:
          method: POST
          headers: 
            Content-Type: application/json ## 定义 HTTP 报文头
          body: '{}' ## 定义 HTTP 报文 body 内容
      ## ------------TCP 检测模块配置------------
      tcp_connect: 
        prober: tcp
        timeout: 5s ## 探测超时时间
      ## ------------ICMP 检测模块配置------------
      icmp: 
        prober: icmp
        timeout: 5s ## 探测超时时间
      ## ------------DNS 检测模块配置------------
      dns: 
        prober: dns
        dns:
          query_name: "www.example.com"
          query_type: "A"
          valid_rcodes:
            - NOERROR

说明

上述配置项仅为示例,只定义了http_2xxhttp_post_2xxtcp_connecticmpdns几个探测模块。如果您有其他协议的探测需求,需要添加对应的探测模块配置。详情请参见 官方文档

步骤三:部署 blackbox-exporter

  1. 登录 容器服务控制台
  2. 在左侧菜单栏中选择 集群,并在右侧集群列表中选择目标集群。
  3. 单击集群名称,进入集群配置页面。
  4. 在左侧菜单栏中选择 工作负载 > 无状态负载。 单击 使用 Yaml 创建 ,部署 blackbox-exporter。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: blackbox
  namespace: volcano-metrics
spec:
  selector:
    matchLabels:
      app: blackbox
  template:
    metadata:
      labels:
        app: blackbox
    spec:
      containers:
      - image: prom/blackbox-exporter:latest # 拉取 Docker Hub 中的 exporter 镜像
        name: blackbox
        args:
        - --config.file=/etc/blackbox_exporter/blackbox.yml # 指定 ConfigMap 配置文件
        - --log.level=error  # 错误级别控制
        ports:
        - containerPort: 9115 # 配置容器端口号
        volumeMounts:
        - name: config
          mountPath: /etc/blackbox_exporter 
      volumes:
      - name: config
        configMap:
          name: blackbox-config # 挂载 ConfigMap 配置文件

说明

blackbox-exporter 的详细参数,请参见 blackbox-exporter

  1. 在左侧菜单栏中选择 服务与路由 > 服务。 单击 使用 Yaml 创建 ,创建服务。
apiVersion: v1
kind: Service
metadata:
  name: service-blackbox # 服务的名称
  namespace: volcano-metrics # 服务的命名空间
spec:
  selector:
    app: blackbox # 通过标签选择器将服务与后段容器组(Pod)绑定
  ports:
  - name: rule # 服务端口映射规则名称
    protocol: TCP # 服务协议,支持 TCP 或 UDP
    port: 9115 # 服务端口号
    targetPort: 9115 # 容器端口号
  type: ClusterIP # 服务的类型

步骤四:配置服务发现

  1. 登录 容器服务控制台
  2. 在左侧菜单栏中选择 集群,并在右侧集群列表中选择目标集群。
  3. 单击集群名称,进入集群配置页面。
  4. 在左侧菜单栏中选择 运维管理 > 对象浏览器。 单击 使用 Yaml 创建 ,配置服务发现。
    • 在 类型 下拉菜单中选择 自定义
    • 在 Yaml 配置框内输入 Yaml 配置。
apiVersion: monitoring.coreos.com/v1
kind: Probe
metadata:
  name: http-probe-example # 配置服务发现的名称
  namespace: volcano-metrics # 配置服务发现所在的命名空间
  labels: 
    volcengine.vmp: "true" # 配置 Probe 的标签,允许被 Prometheus-agent 发现
spec:
  jobName: http-example # 配置任务名称
  prober: 
    url: service-blackbox.volcano-metrics.svc.cluster.local:9115 # 通过域名指定 blackbox-exporter 的服务地址
  module: http_2xx # 配置探测任务使用的预定义模块
  targets: # 配置采集目标,这里使用了静态配置。在实际使用中,也支持其他配置,例如 Kubernetes 服务发现功能
    staticConfig: 
      static:
        - www.volcengine.com # 配置采集对象,本例中以配置静态对象为例

结果验证

  1. 执行以下命令,配置 Grafana 端口映射。
kubectl port-forward service/grafana 3000:3000 -n volcano-metrics
  1. 在本地环境(Linux/Mac)中打开浏览器,在地址栏中输入 localhost:3000,进入 Grafana 登录界面,使用默认用户名admin密码admin登录。
    alt
  2. 登录 Grafana 后,创建大盘,即可查看通过 Blackbox 监控的对象信息。
    alt

    说明

    您也可以使用托管 Prometheus 的 Explore 功能,直接查询probe开头的指标。详情请参见 指标查询

常见问题

如何对 blackbox-exporter 进行调试和 Debug?

当您发现 blackbox-exporter 采集的数据有问题,或者组件状态不正常时,可以采取以下方式,直接查看 blackbox-exporter 采集到的数据,或进行 Debug 处理。具体的步骤如下:

  1. 在本地环境中通过 kubectl 连接集群,执行以下命令,配置 blackbox-exporter 组件实例的端口映射。其中blackbox-84d7xxxx为组件实例名称。
kubectl port-forward pod/blackbox-84d7xxxx 9115:9115 -n volcano-metrics
  1. 执行以下命令,查看 blackbox-exporter 组件的数据和 Debug 信息。其中:
    • target字段为您探测的目标。
    • module字段为您使用的检测模块。
    • debug=true表示开启 Debug。您可以看到 blackbox-exporter 组件的配置信息、采集指标、组件日志等信息。
curl -s "localhost:9115/probe?target=https://www.volcengine.com&module=http_2xx&debug=true"