如何使用 Blackbox Exporter 监控 URL?

news2024/9/28 19:18:45

前言

监控域名和 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_lengthHTTP 内容响应的长度

使用 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

  • How to Monitor Endpoints in Kubernetes using Blackbox Exporter (infracloud.io)
  • prometheus/blackbox_exporter: Blackbox prober exporter (github.com)
  • Probing Endpoints with Blackbox-Exporter. How ? Why ? | by Yasintahaerol | Trendyol Tech | Medium

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/130524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

离散变量贝叶斯决策简介

贝叶斯决策 最小风险&#xff1a; min⁡R(αi∣x)∑j1cλ(αi∣ωj)P(ωj∣x)\min R\left(\alpha_i \mid \mathrm{x}\right)\sum_{j1}^c \lambda\left(\alpha_i \mid \omega_j\right) P\left(\omega_j \mid \mathrm{x}\right) minR(αi​∣x)j1∑c​λ(αi​∣ωj​)P(ωj​∣x…

django笔记《内置用户认证系统》

文章目录1 前言2 django.contrib.auth3 使用django的用户认证系统3.1 创建一个新的django项目3.2 做数据库迁移3.3 auth_user表结构3.4 创建一个新用户3.5 User对象3.5.1 创建用户 create_user3.5.2 request.user3.5.3 用户在视图函数中登录3.5.4 关键函数3.6 保护视图函数的方…

每日一问-ChapGPT-20221231-关于中医的各国看法

文章目录每日一问-ChapGPT系列起因每日一问-ChapGPT-20221231-关于中医的各国看法各个国家对伤寒论的看法日本对于中医的看法韩国对于中医的看法欧美对于中医的看法中国对于中医的看法当日总结每日一问-ChapGPT系列起因 近来看了新闻&#xff0c;看了各种媒体&#xff0c;抖音…

程序员必须要了解的内存知识——硬件

最近阅读了Ulrich Drepper大牛的论文《What Every Programmer Should Know About Memory》&#xff0c;全文114页&#xff0c;尽管2007年出版&#xff0c;但如今看过来&#xff0c;仍干货满满。接来下对文中提及的知识&#xff0c;结合自己对内存知识的理解&#xff0c;对程序员…

前端面试题汇总-Vue篇

1. Vue的基本原理 当一个Vue实例创建时&#xff0c;Vue会遍历data中的属性&#xff0c;用 Object.defineProperty&#xff08;vue3.0使用proxy &#xff09;将它们转为 getter/setter&#xff0c;并且在内部追踪相关依赖&#xff0c;在属性被访问和修改时通知变化。 每个组件实…

APP专项测试

一、安装/卸载/升级更新 分类测试点安装1. 通过第三方软件协助安装是否正常 2. 在不同的操作系统下安装是否正常 3. 安装过程中断网&#xff0c;安装是否正常 4. 安装后的文件夹以及文件是否写到了指定的目录里 5. 软件安装过程是否可以取消&#xff0c;点击取消后&#xff0c…

Windows 10/11玩游戏时第二显示器延迟怎么办?

现在很多人都会给自己的电脑外接一个显示屏&#xff0c;来提高工作效率&#xff0c;或增强游戏体验&#xff0c;但有时候第二块显示器会出现延迟、卡顿、掉帧等问题。 不过驱动小百科整理了几个缓解Win 10/Win 11上第二显示器延迟的方法&#xff1a; 更改显示器刷新率关闭占用…

阿里云物联网智能视频服务接入

物联网视频服务&#xff08;LinkVisual&#xff09;支持视频流上云、存储、转发、告警事件等视频基础能力&#xff0c;提供丰富的视频算法以及云边协同&#xff08;算法云端训练、云端下发、边缘计算推理&#xff09;服务。旨在帮助视频设备厂商、方案商与服务提供商&#xff0…

Mac退出移动硬盘时显示“磁盘无法推出,因为一个或多个程序正在使用它”解决方案

解决方法1. 重启访达2. 重启电脑3. 终端命令行方法4. df -lh不显示移动磁盘名称时的解决方法1. 重启访达 按住option键&#xff0c;在底部程序坞的访达图标右键&#xff0c;选择重新启动。此时访达app会重启&#xff0c;之后尝试推出即可。 或&#xff1a;点击左上角苹果标&a…

CSDN 2021-2022年微博情感数据分析

微博情感分析是一种用于提取微博文本中的情感倾向的方法。它可以帮助企业了解人们对于某个主题的看法和态度。 如果要进行微博情感分析&#xff0c;需要准备一些微博数据。可以使用爬虫程序爬取相关微博数据&#xff0c;这里使用的 Scrapy 框架进行的数据爬虫。可以使用文本分…

JavaWeb:Servlet概述

1.1 简介 Servlet是JavaWeb最为核心的内容&#xff0c;它是Java提供的一门动态web资源开发技术。 使用Servlet就可以实现&#xff0c;根据不同的登录用户在页面上动态显示不同内容。 Servlet是JavaEE规范之一&#xff0c;其实就是一个接口&#xff0c;将来我们需要定义Servle…

产品经理的需求分析四个层次

产品经理的需求分析四个层次&#xff1a; 1、第一层次是实现需求&#xff0c;即客户要啥做啥。 2、第二层次是分析转换需求&#xff0c;即客户的真正需求&#xff0c;可能实际和他提的需求不一样&#xff0c;比如客户只是要过河&#xff0c;却提出造一个轮船。所以产品经理需要…

MPS | 简单易用的工业电源模块

工业与医疗应用中&#xff0c;在较高输入电压条件下&#xff0c;输出正压和负压的应用需求越来越多。 在应对输出负压条件时&#xff0c;传统解决方案电路复杂且体积庞大&#xff0c;研发周期较长。以半导体测试为例&#xff0c;新一代的测试机通常需要具备以下特点&#xff1…

TCP三次握手四次挥手详解

三次握手 第一次&#xff1a;客户端发送请求连接的报文&#xff1b;SYN1&#xff0c;表请求建立连接的报文&#xff1b;seq,序列号&#xff0c;随机。 第二次&#xff1a;服务端发送请求连接和同意连接的报文&#xff1b;ACK1&#xff0c;表示确认号有用&#xff1b;ackx1&am…

【一起从0开始学习人工智能】0x01机器学习基础+初次实践

从零开始----到敲出一个推荐系统 文章目录人工智能概述流派能做什么什么是机器学习数据集构成机器学习算法分类机器学习开发流程学习框架和资料怎么做机器学习库与框架可用数据集sklearn使用自带数据集sklearn数据集使用拿到的数据是否全部用来训练模型人工智能概述 人工智能-…

Linux下对文件权限的理解

一、权限的概念 Linux下有两种用户&#xff1a;超级用户&#xff08;root&#xff09;、普通用户。 超级用户&#xff1a;可以再linux系统下做任何事情&#xff0c;不受限制 普通用户&#xff1a;在linux下做有限的事情。 超级用户的命令提示符是“#”&#xff0c;普通用户的命…

【Python爬虫 • selenium】selenium4新版本自动获取驱动的常见问题

文章目录前言一、安装驱动二、使用步骤1.导入包2.生成驱动3.打开网站二、selenium闪退问题处理1. selenium版本与代码不匹配2. selenium代码异常三、代码示例1.selenium4代码示例1. Chrome2. Chromium3. Brave4. Firefox5. IE6. Edge7. Opera2.selenium3代码示例1. Chrome2. Ch…

蓄热式加热炉燃烧技术

通过阅读前辈们的一些文章&#xff0c;关于蓄热式加热炉燃烧技术方面进行了总结。 一个蓄热燃烧单元至少由两个烧嘴本体、两个体积紧凑的蓄热室、换向阀和与之配套的控制系统组成&#xff0c;即应用蓄热式 (高温空气 )燃烧技术的炉子烧嘴需成对安装&#xff0c;当烧嘴 A 工作时…

【云原生】K8s PSP 和 securityContext 介绍与使用

文章目录一、概述二、PodSecurityPolicy 的发展1&#xff09;以前为什么需要 PodSecurityPolicy&#xff1f;2&#xff09;现在为什么 PodSecurityPolicy 要消失&#xff1f;三、PSP 简单使用1&#xff09;开启PSP2&#xff09;示例演示1、没有PSP场景测试2、定义PSP【1】资源限…

C++中的多态(原理篇)

多态的原理 虚函数表 下面这一串代码 class A { public:virtual void func(){cout << "func1()" << endl;} private:int _a; };我们看到了a对象的大小是8bit大小&#xff0c;但是a对象里面不应该只是一个_a吗&#xff1f;当我们打开监视窗口发现 a对象…