前言
监控域名和 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 装置和配置
应用 Helm 装置 Blackbox Exporter
Blackbox Exporter 的装置很简略,能够通过 Helm Chart 装置:
# 增加 repohelm repo add prometheus-community https://prometheus-community.github.io/helm-chartshelm repo update# Install charthelm 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) 依据你的配置返回胜利/失败。以下面配置为例,具体阐明下 module
和 http
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 methodheaders:
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
是否启用 http2preferred_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/v1kind: Probemetadata: name: ewhisper namespace: monitoringspec: 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 有以下探测场景:
- 探测内部 URL
- 探测 K8S 集群外部 service
- 探测 K8S 集群外部 Ingress
- 探测 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 验证生成的指标
一旦更改被 apply,Blackbox Exporter 的资源被部署,咱们能够在 Prometheus 中验证指标的状态。咱们能够通过跳转到状态选项卡,而后在 Prometheus UI 中抉择 targets,来查看 Blackbox Exporter 是否与注册的指标一起启动。
在这里你能够看到咱们应用https://rancher.ewhisper.cn
作为内部指标来参考,其状态是 404。咱们还能够通过寻找以probe_
结尾的指标来查看指标是否被收集。
在这里你能够看到一些生成的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 的指标:
点这里Blackbox Grafana 搜寻和下载对应的 Grafana Dashboard.
Blackbox 的劣势梳理
- 开源收费的 Blackbox Endpoint 监控工具;
- 除了 HTTP/S, 还反对 DNS、TCP、ICMP 和 grpc
- 丰盛的 HTTP 黑盒监控配置,如 Header、认证、代理、正则匹配等。
- 利用 Prometheus + Kubernetes 的 kubernetes_sd_config 性能动静地产生指标,并可用于动静 Endpoint 监控。
- 能够监控证书过期工夫。
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