使用 Prometheus 进行黑盒(blackbox) 监控
作者 阳明
来源 | k8s技术圈(ID:kube100)
前面我们主要介绍了 Prometheus 下如何进行白盒监控,我们监控主机的资源用量、容器的运行状态、数据库中间件的运行数据、自动发现 Kubernetes 集群中的资源等等,这些都是支持业务和服务的基础设施,通过白盒能够了解其内部的实际运行状态,通过对监控指标的观察能够预判可能出现的问题,从而对潜在的不确定因素进行优化。而从完整的监控逻辑的角度,除了大量的应用白盒监控以外,还应该添加适当的 Blackbox(黑盒)监控,黑盒监控即以用户的身份测试服务的外部可见性,常见的黑盒监控包括 HTTP探针、 TCP探针 等用于检测站点或者服务的可访问性,以及访问效率等。
黑盒监控相较于白盒监控最大的不同在于黑盒监控是以故障为导向当故障发生时,黑盒监控能快速发现故障,而白盒监控则侧重于主动发现或者预测潜在的问题。一个完善的监控目标是要能够从白盒的角度发现潜在问题,能够在黑盒的角度快速发现已经发生的问题。
Blackbox Exporter 是 Prometheus 社区提供的官方黑盒监控解决方案,其允许用户通过:HTTP、 HTTPS、 DNS、 TCP 以及 ICMP 的方式对网络进行探测。
同样首先需要在 Kubernetes 集群中运行 blackbox-exporter 服务,同样通过一个 ConfigMap 资源对象来为 Blackbox 提供配置,如下所示:(prome-blackbox.yaml)
直接创建上面的资源清单:
然后需要在 Prometheus 的配置文件中加入对 BlackBox 的抓取设置,如下所示:
首先获取 targets 实例的 __address__ 值写进 __param_target, __param_<name> 形式的标签里的 name 和它的值会被添加到发送到黑盒的 http 的 header 的 params 当作键值,例如 __param_module 对应 params 里的 module。然后获取 __param_target 的值,并覆写到 instance 标签中,覆写 Target 实例的 __address__ 标签值为 BlockBoxExporter 实例的访问地址,向 blackbox:9115 发送请求获取实例的 metrics 信息。然后更新配置:
打开 Prometheus 的 Target 页面,就会看到 上面定义的 kubernetes-service-dns 任务了:
回到 Graph 页面,可以使用 probe_success{job="kubernetes-service-dns"} 来查看检测结果,这样就实现了对 DNS 的黑盒监控。
除了 DNS 的配置外,上面我们还配置了一个 http_2xx 的模块,也就是 HTTP 探针,HTTP 探针是进行黑盒监控时最常用的探针之一,通过 HTTP 探针能够对网站或者 HTTP 服务建立有效的监控,包括其本身的可用性,以及用户体验相关的如响应时间等等。除了能够在服务出现异常的时候及时报警,还能帮助系统管理员分析和优化网站体验。这里我们可以使用他来对 http 服务进行检测。
因为前面已经给 Blackbox 配置了 http_2xx 模块,所以这里只需要在 Prometheus 中加入抓取任务,这里我们可以结合前面的 Prometheus 的服务发现功能来做黑盒监控,对于 Service 和 Ingress 类型的服务发现,用来进行黑盒监控是非常合适的,配置如下所示:
我们结合前面的服务发现功能,通过过滤 prometheus.io/http_probe=true 的 Service 和 Ingress 才进行 HTTP 探针类型的黑盒监控,其他配置和上面配置 dns 监控的时候是一致的。然后更新配置:
打开 Prometheus 的 Target 页面,就会看到 上面定义的两个任务了:
但是现在还没有任何数据,这是因为上面是匹配 __meta_kubernetes_ingress_annotation_prometheus_io_http_probe 这个元信息,所以如果我们需要让这两个任务发现的话需要在 Service 或者 Ingress 中配置对应的 annotation:
比如在我们自己的一个 Ingress 对象中添加上面这个 annotation:
这个时候我们查看到 Ingress 这个任务下面已经有抓取任务了:
比如现在我们可以使用 probe_duration_seconds 来检查监控结果:
对于 Service 是一样的,当然如果你需要对监控的路径、端口这些做控制,我们可以自己在 relabel_configs 中去做相应的配置,比如我们想对 Service 的黑盒做自定义配置,可以想下面这样配置:
这样我们就需要在 Service 中配置这样的 annotation 了:
这样我们就完成了 HTTP 探针的黑盒监控,除此之外,我们还可以配置 TCP 的监控,上面我们已经配置了这个模块,大家可以自己尝试去配置下。
除了支持对 HTT P协议进行网络探测以外,Blackbox 还支持对 TCP、DNS、ICMP 等其他网络协议,感兴趣的读者可以从 Blackbox 的 Github 项目中获取更多使用信息。
Prometheus 配置文件可以参考官方仓库:
https://github.com/prometheus/prometheus/blob/master/documentation/examples/prometheus-kubernetes.yml
Blackbox 的配置文件可以参考官方参考:
https://github.com/prometheus/blackbox_exporter/blob/master/example.yml
prometheus.io/http-probe-port: "8080" prometheus.io/http-probe-path: "/healthz"
这些路径是服务的自己的 路径吧 暴露给prometheus拉取的
我的服务有些readiness暴露的接口我是不是可以直接 拿出来用