5

如何使用 Blackbox Exporter 监控 URL? - 东风微鸣

 1 year ago
source link: https://www.cnblogs.com/east4ming/p/17016176.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

监控域名和 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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK