Skip to main content

moregeek program

如何使用 blackbox exporter 监控 url?-多极客编程

前言


监控域名和 URL 是可观察性的一个重要方面,主要用于诊断可用性问题。接下来会详细介绍如何使用 Blackbox Exporter 和 Prometheus 在 Kubernetes 中实现 URL 监控。


Blackbox Exporter 简介


Blackbox Exporter 是 Prometheus 的一个可选组件,像其他 Exporter 一样, 主要用于将监控数据转换为 Prometheus 可理解的指标格式,即 Prometheus exposition format


Endpoint 监控


Endpoint 监控是指监控内部和外部 Endpoint(HTTP/S、DNS、TCP、ICMP 和 grpc)的各种参数,包括 HTTP 响应时间、DNS 查询延迟、SSL 证书过期信息、TLS 版本等等。


在 Kubernetes 中,不仅仅是外部 Endpoint 需要被监控,内部 Endpoint 也需要被监控响应时间和其他参数。这些指标是基础设施的一个重要部分,以确保服务的连续性、可用性和符合一些安全认证。


白盒(WhiteBox)与黑盒(Blackbox)监控


白盒监控是指对系统内部的监控,包括应用 logging、handlers、tracing 和 metrics。与之相对,黑盒监控主要从外部发起探测,探测影响用户的行为,如服务器停机、页面不工作或网站性能下降。


Blackbox Exporter


Blackbox Exporter 用于探测 HTTPS、HTTP、TCP、DNS、ICMP 和 grpc 等 Endpoint。在你定义 Endpoint 后,Blackbox Exporter 会生成指标,可以使用 Grafana 等工具进行可视化。Blackbox Exporter 最重要的功能之一是测量 Endpoint 的可用性。


下图显示了 Blackbox Exporter 监控一个 Endpoint 的流程:


blackbox exporter 流程图


Blackbox Exporter 安装和配置


使用 Helm 安装 Blackbox Exporter


Blackbox Exporter 的安装很简单,可以通过 Helm Chart 安装:


# 添加 repo
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

# Install chart
helm install [RELEASE_NAME] prometheus-community/prometheus-blackbox-exporter

🎉


Blackbox 基本配置


下面是 Blackbox Exporter 配置中定义的一个默认模块:


blackbox.yaml:


modules:
http_2xx:
prober: http
timeout: 15s
http:
fail_if_not_ssl: true
ip_protocol_fallback: false
method: GET
follow_redirects: true
preferred_ip_protocol: ip4
valid_http_versions:
- HTTP/1.1
- HTTP/2.0
valid_status_codes:
- 200
- 204

你可以相应地配置你自己的blackbox.yml,使探针 (probe) 根据你的配置返回成功/失败。以上面配置为例,详细说明下 modulehttp probe 的配置:



  • prober: 探测的协议(可以是:http, tcp, dns, icmp, grpc)。
  • timeout: 探测超时时间。
  • http: http probe

接下来是 http probe 的配置:



  • valid_status_codes: <int>, ... | default = 2xx: 该 Probe 可接受的状态码。默认为 2xx。建议使用默认值。
  • valid_http_versions: 该 Probe 接受的 http 版本。可选值:HTTP/1.1 HTTP/2.0
  • method: <string> | default = "GET": probe 使用的 http method
  • headers: probe 使用的 header, 比如可以加一些 user-agent 之类的 header 避免被 WAF 拦截
  • body_size_limit: <size> | default = 0 将被处理的最大未压缩的主体长度(字节)。值为 0 意味着没有限制。
  • compression: 用于解压响应的压缩算法(gzip、br、deflate、ident)。
  • follow_redirects: <boolean> | default = true: 是否 follow 重定向
  • fail_if_ssl: 如果存在 SSL,则探测失败
  • fail_if_not_ssl: 如果不存在 SSL, 则探测失败
  • fail_if_body_matches_regexp: 如果返回的 body 匹配该正则则失败
  • fail_if_body_not_matches_regexp: 如果返回的 body 不匹配该正则则失败
  • fail_if_header_matches: 如果返回的 header 匹配该正则,则失败。对于有多个值的 header,如果至少有一个符合,则失败。
  • fail_if_header_not_matches: 如果返回的 header 不匹配该正则,则失败。
  • tls_config: HTTP probe 的 TLS 协议配置,常用于私人证书。
  • basic_auth: 目标的 HTTP basic auth 凭证。
  • bearer_token: <secret>: 模板的 bearer token.
  • proxy_url 用于连接到目标的 proxy server 的配置
  • skip_resolve_phase_with_proxy 当设置了 HTTP 代理(proxy_url)时,跳过 DNS 解析和 URL 变更。
  • oauth2 用于连接到模板的 OAuth 2.0 配置
  • enable_http2 是否启用 http2
  • preferred_ip_protocol HTTP probe 的 IP 协议 (ip4, ip6)
  • ip_protocol_fallback
  • body probe 中使用的 HTTP 请求的主体。

你可以查看这个 example.yml 中的详细例子,了解更多情况。另外还需要在 Prometheus 做一些配置上的改变,Blackbox Exporter 才会发送与应用的配置相关的指标。


Prometheus 中的配置


需要在 Prometheus 里配置 scrape 的配置,以及 Blackbox 相关的 Alert Rules.


Blackbox 的 Prometheus Scrape 配置


示例如下:


scrape_configs:
- job_name: blackbox-exporter
params:
module:
- http_2xx
scrape_interval: 1m
scrape_timeout: 10s
metrics_path: /probe
scheme: http
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: prometheus-blackbox-exporter.monitoring:9115
action: replace
static_configs:
- targets:
- https://ewhisper.cn
- https://www.ewhisper.cn
- https://rancher.ewhisper.cn
labels:
domain: ewhisper
environment: test
cluster: home-k3s

这样直接改 Prometheus 的配置是比较容易出错的,如果你已经安装了 Prometheus Operator, 则可以直接通过 probe CRD 来配置,非常方便:


apiVersion: monitoring.coreos.com/v1
kind: Probe
metadata:
name: ewhisper
namespace: monitoring
spec:
jobName: http-get
interval: 60s
module: http_2xx
prober:
url: prometheus-blackbox-exporter.monitoring:9115
scheme: http
path: /probe
targets:
staticConfig:
static:
- targets:
- https://ewhisper.cn
- https://www.ewhisper.cn
- https://rancher.ewhisper.cn
labels:
domain: ewhisper
environment: test
cluster: home-k3s

Blackbox Exporter 探测场景


单论 URL, 总结起来,Blackbox Exporter 有以下探测场景:



  1. 探测外部 URL
  2. 探测 K8S 集群内部 service
  3. 探测 K8S 集群内部 Ingress
  4. 探测 K8S 集群内部 Pod

场景一:探测外部 URL


配置 上面 已经提过,这里就不在赘述。


场景二:探测 K8S 集群内部 service


在 Kubernetes 系统中,资源和 Endpoint 会随着时间的推移而出现和消失,可以非常有用的探测是对资源的动态探测,包括 pods、service 和 ingress。


在 Prometheus 中使用 Kubernetes 服务发现配置,我们可以实现 Endpoint 的动态探测。Kubernetes 服务发现配置允许从 Kubernetes 的 API 中获取刮削目标,并始终与集群状态保持同步。你可以在文档的 kubernetes_sd_config 部分找到可以配置为发现目标的可用角色列表。


kubernetes_sd_configs:
- role: service
metrics_path: /probe
params:
module:
- http_2xx
relabel_configs:
- action: keep
regex: true
source_labels:
- __meta_kubernetes_service_annotation_prometheus_io_probe
- source_labels:
- __address__
target_label: __param_target
- replacement: prometheus-blackbox-exporter.monitoring:9115
target_label: __address__
- 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

这里我们可以使用[__meta_kubernetes_service_annotation_prometheus_io_probe]来只检查那些有prometheus.io/probe = true注释的服务,示例如下:


➜ kubectl describe svc nginx
...
Annotations: prometheus.io/probe: true
...

场景三:探测 K8S 集群内部 Ingress


    - job_name: "blackbox-kubernetes-ingresses"
metrics_path: /probe
params:
module: [http_2xx]
kubernetes_sd_configs:
- role: ingress
relabel_configs:
# 示例重新标记,只探测有 "prometheus.io/probe = true"注释的一些接入点。
# - source_labels: [__meta_kubernetes_ingess_annotation_prometheus_io_probe]
# action: keep
# regex: true
- source_labels:
[
__meta_kubernetes_ingress_scheme,
__address__,
__meta_kubernetes_ingress_path,
]
regex: (.+);(.+);(.+)
replacement: ${1}://${2}${3}
target_label: __param_target
- target_label: __address__
replacement: prometheus-blackbox-exporter.monitoring:9115
- source_labels: [__param_target]
target_label: instance
- action: labelmap
regex: __meta_kubernetes_ingress_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_ingress_name]
target_label: ingress_name

场景四:探测 K8S 集群内部 Pod


    - job_name: "blackbox-kubernetes-pods"
metrics_path: /probe
params:
module: [http_2xx]
kubernetes_sd_configs:
- role: pod
relabel_configs:
# 示例重新标记,只探测有
# "prometheus.io/probe = true"注释的 pod。
# - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_probe]
# action: keep
# regex: true
- source_labels: [__address__]
target_label: __param_target
- target_label: __address__
replacement: prometheus-blackbox-exporter.monitoring:9115
- source_labels: [__param_target]
replacement: ${1}/health
target_label: instance
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_pod_name]
target_label: kubernetes_pod_name

在 Prometheus 验证生成的指标


Blackbox Alert


一旦更改被 apply,Blackbox Exporter 的资源被部署,我们可以在 Prometheus 中验证目标的状态。我们可以通过跳转到状态选项卡,然后在 Prometheus UI 中选择 targets,来检查 Blackbox Exporter 是否与注册的目标一起启动。


在这里你可以看到我们使用https://rancher.ewhisper.cn作为外部目标来参考,其状态是 404。我们还可以通过寻找以probe_开头的指标来检查指标是否被收集。


Prometheus probe metrics


在这里你可以看到一些生成的probe_ 的指标列表。


指标名 功能
probe_duration_seconds 返回探针完成的时间(秒)。
probe_http_status_code 响应 HTTP 状态代码
probe_http_version 返回探针响应的 HTTP 版本
probe_success 显示探测是否成功
probe_dns_lookup_time_seconds 返回探测 DNS 的时间,单位是秒。
probe_ip_protocol 指定探针 IP 协议是 IP4 还是 IP6
probe_ssl_earliest_cert_expiry metric 返回以 unixtime 为单位的最早的 SSL 证书到期时间
probe_tls_version_info 包含所使用的 TLS 版本
probe_failed_due_to_regex 表示探测是否因 regex 匹配而失败
probe_http_content_length HTTP 内容响应的长度

使用 Grafana 监控配置的 URL


可以直接复用 Grafana 上的一些 Dashboard, 查看 URL 的指标:


dashboard


dashboard


点这里👉Blackbox Grafana 搜索和下载对应的 Grafana Dashboard.


Blackbox 的优势梳理



  1. 开源免费的 Blackbox Endpoint 监控工具;
  2. 除了 HTTP/S, 还支持 DNS、TCP、ICMP 和** grpc**
  3. 丰富的 HTTP 黑盒监控配置,如 Header、认证、代理、正则匹配等。
  4. 利用 Prometheus + Kubernetes 的 kubernetes_sd_config 功能动态地产生指标,并可用于动态 Endpoint 监控。
  5. 可以监控证书过期时间。

Blackbox Exporter 的行业应用场景


为什么需要 Blackbox Exporter?


以我所熟悉的保险行业为例,大中型保险公司,都是采用类似:



  • 总部
  • 省级分公司
  • 中心支公司
  • 中公司
  • 营业部

这样的组织形式。分支机构往往是通过专线和总部连接,并使用总部提供的各类保险业务系统。


虽然国内外有各种工具和服务可用于监控域名和 URL, 如 听云、Dynatrace 等。但是



  • 一方面,服务是按探测次数收费的,如果探测频率、探测 URL 过多,价格不低的;
  • 另一方面,这些商业化服务可能无法覆盖保险行业这种近乎内网的网络架构。

在这种情况下,Blackbox Exporter 是现有解决方案的一个开源替代品,由 Prometheus 社区维护。


而且,Prometheus + Blackbox Exporter + Kubernetes 动态发现,可以大大减少人工配置大量 URL 探测的工作。


另外,针对上面提到的情况, 也可以使用 Prometheus + Blackbox Exporter + 轻量级 K8s 解决方案如 K3s, 将 probe 节点部署到各个分支机构,实现和分支机构员工完全相同的访问路径。分支-总部各系统网络可用性一目了然,及时发现分支-总部各系统网络问题。


总结


通过本文,我们讨论了:



  • 什么是 Blackbox Exporter
  • 如何安装和配置它
  • 几种典型的配置场景,特别是利用 Prometheus + Blackbox Exporter + Kubernetes 动态发现
  • Blackbox Exporter 优势
  • Blackbox Exporter 的行业应用场景

希望对各位读者有所帮助。


🎉🎉🎉


📚️ Reference




三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.



©著作权归作者所有:来自51CTO博客作者东风微鸣的原创作品,请联系作者获取转载授权,否则将追究法律责任

基于双栈服务的启发式测绘-多极客编程

基于地址生成特征的启发式测绘如前所述,IPv6 地址分布存在一些特点,比如部分地址位随机、MAC地址嵌入等,我们可以利用 这些分布特性,加入一些测绘范围或限制条件,来降低 IPv6 地址测绘地址空间。 接下来我们用以下方法进行测绘测试,数据源来自于开源的 Hitlist 中存活的 IPv6 地址集合 1。1. 低位和部分位随机地址测绘 低位 IPv6 地址测绘和 IPv4 的测绘类似,除了地址的后

42-kvm虚拟化-基于现有虚拟机磁盘为模版创建新的虚拟机-多极客编程

基于现有虚拟机磁盘为模版创建新的虚拟机使用 virt-install 创建虚拟机虽然使用virt-manager 可以方便的管理虚拟机,但如果需要批量进行虚拟机的创建管理,命令行工具virtinstall更加方便和适合案例:利用 qemu-img命令创建虚拟磁盘#注意: qemu-img create 一定要确认对应路径下没有此文件,如果存在将覆盖原文件1. 确认现有的虚拟磁盘文件[root@ub

python调用openstack api-多极客编程

本文将介绍如何使用 python 调用 OpenStack API。 什么是RESTful API RESTful API 就是 RESTful 风格的 API。遵循 RESTful 风格开发的API被叫做 RESTful API。 那么什么是 RESTful风格呢。 首先需要明确的是,REST并没有一个明确的标准,而是一种设计风格,这种风格有这样几个主要特征: 统一接口,这是 RESTfu

43-kvm虚拟化-利用libvirt服务进行kvm虚拟机管理-多极客编程

半虚拟化驱动virtio的工作原理为了提高内存、硬盘、网络的性能,需要支持半虚拟化virtio 是一种 I/O 半虚拟化解决方案,是一套通用 I/O 设备虚拟化的程序,是对半虚拟化 Hypervisor 中的一组通用 I/O 设备的抽象,提供了一套上层应用与各 Hypervisor 虚拟化设备(KVM,Xen,VMware等)之间的通信框架和编程接口,减少跨平台所带来的兼容性问题,大大提高驱动程序

44-kvm虚拟化-存储管理和磁盘扩容-多极客编程

KVM存储模式基于文件系统的存储dir: Filesystem Directory 需要有挂载点的文件系统fs: Pre-Formatted Block Device 无需挂载的文件系统,如:位于SAN存储的文件系统,可支持多个主机同时访问,而本地文件系统不支持netfs: Network Exported Directory 网络文件系统,比如:NFS,SAMBA等基于设备的存储 - 无需文件系

两个由于ip地址冲突引发的故障​(veeam与vsan故障实例)-多极客编程

IP地址冲突一般只发生在工作站端,在服务器端IP地址发生冲突的概率较低,所以一般服务器出了问题,很少考虑IP地址冲突的问题。笔者最近碰到两起案例,都是由于IP地址冲突造成的,在此总结分享出来,希望对大家有所帮助。​1 Veeam复制时出现“应用程序中的错误”提示某企业VMware vSphere虚拟化环境,有2台ESXi主机,其中IP地址为10.10.10.241的服务器运行着生产的虚拟机,IP地

如何精简 prometheus 的指标和存储占用-多极客编程

前言 随着 Prometheus 监控的组件、数量、指标越来越多,Prometheus 对计算性能的要求会越来越高,存储占用也会越来越多。 在这种情况下,要优化 Prometheus 性能, 优化存储占用. 第一时间想到的可能是各种 Prometheus 的兼容存储方案, 如 Thanos 或 VM、Mimir 等。但是实际上虽然集中存储、长期存储、存储降采样及存储压缩可以一定程度解决相关问题,但

aws 下 eks 部署 dashboard-多极客编程

一. 准备工作打开 AWS CloudShell安装 eksctlcurl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmpsudo mv /tmp/eksctl /usr/local

k8s使用群晖ds218+的nfs-多极客编程

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 群晖和K8S+ 学习K8S时经常用到网络存储,于是想找个稳定的NFS服务,正好家里的群晖DS218+长期开着,空间又充足,用来提供NFS服务挺合适,本文就是设置和使用的过程备忘; 下图是DS218+刚买来的样子,两块NAS硬盘,一直在稳定服务:

使用 helm 安装 mqtt 服务器-emqx-多极客编程

EMQX ℹ️ Info: 使用 EMQX 通过 Helm3 在 Kubernetes 上部署 EMQX 4.0 集群 | EMQ emqx/deploy/charts/emqx at main-v4.4 · emqx/emqx (github.com) emqx/values.yaml at main-v4.4 · emqx/emqx (github.com) emqx/emqx-operat

45-docker-架构解析和配置优化及镜像管理-多极客编程

Docker 和虚拟机,物理主机传统虚拟机是虚拟出一个主机硬件,并且运行一个完整的操作系统 ,然后在这个系统上安装和运行软件容器内的应用直接运行在宿主机的内核之上,容器并没有自己的内核,也不需要虚拟硬件,相当轻量化每个容器间是互相隔离,每个容器内都有一个属于自己的独立文件系统,独立的进程空间,网络空间,用户空间等,所以在同一个宿主机上的多个容器之间彼此不会相互影响Docker 的组成docker

安装docker环境(centos平台,详细版)-多极客编程

 概述       Docker是一种开源的容器化技术,可以构建容器化的应用,并且可以使多个容器都有同样的环境,避免因环境差异造成程序运行异常。与之类似的容器化技术还有​​Containerd​​,一款号称专为K8S而生的容器。Docker官方安装教程:​​https://docs.docker.com/engine/install/centos/​​        里面涵盖了在CentOs、De