本文发布于Cylon的收藏册,转载请著名原文链接~


背景

在云原生环境中,特别是基于 Kubernetes,集群中的 “服务” 在与外部交互时,例如,一个外部的第三方 Web 服务/API 等,而监控这些不同的 endpoint 诊断服务可用性的一个关键点,这里将阐述基于 Kube-prometheus-stacks 如果做到可以监控外部 IP/URL,例如,HTTP/TCP/ICMP 等。

blackbox_exporter 是 Prometheus 官方维护的 exporter之一,是提供一种用于检测 HTTP/S、DNS、TCP 和 ICMP 端点的可用性。

基于 kube-prometheus-stack 安装 blackbox

本文使用了 helm 安装的 prometheus-community/prometheus-blackbox-exporter ,在安装前,需要自行修改要启动的 prober,与是否开启默认的 servicemonitor

secretConfig: false
config:
  modules:
    ping:
      prober: icmp
      timeout: 5s
      icmp:
        preferred_ip_protocol: "ip4"
    http_2xx:
      prober: http
      timeout: 5s
      http:
        valid_http_versions: ["HTTP/1.1", "HTTP/2.0"]
        follow_redirects: true
        preferred_ip_protocol: "ip4"

安装

helm install prometheus-blackbox-exporter -n monitoring . -f values.yaml

配置 servicemonitor

blackbox-exporter 实现了多种探针,因此可以传递多个 endpoint 进行探测,下列是 ServiceMonitor 实现的检测外部IP/URL,使用了 icmp 探针,也就是说是在 blackbox-exporter 中配置的模块,探针通过抓取 Kubernetes service 下挂的 endpoint,通过访问 blackbox service 的 /probe 抓取暴露的指标 metrics

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: blackbox-exporter-probe
spec:
  endpoints:
  - interval: 1m
    path: /probe
    scrapeTimeout: 10s
    params:
      module: [tcp_prober]
    relabelings:
    - sourceLabels: [__address__]
      targetLabel: __param_target
    - targetLabel: __address__
      replacement:  black-prometheus-blackbox-exporter:9115 # is the name:port of the blackbox exporter service
    - sourceLabels: [__param_target]
      targetLabel: instance
    - action: labelmap
      regex: __meta_kubernetes_service_label_(.+) # specify to monitor kubernets services
  jobLabel: blackbox-exporter
  selector:
    matchLabels:
      app.kubernetes.io/action: probe # monitor the services only with this label

这个 ServiceMonitor 会通过标签匹配对应的 Kubernets service,标签为 app.kubernetes.io/action: probe所有 namespace 中的存在 这个 Label 的 service。 如果有需要,可以通过指定抓取的 namespace,使用namespaceSelector

创建一个外部 service

这里使用了 Kubernetes 外部 service 方式将外部IP引入到内部

apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/action: probe
  name: icmp-prober
spec:
  clusterIP: None
  ports:
  - name: db
    protocol: TCP
    port: 9100
    targetPort: 9100
---
apiVersion: v1
kind: Endpoints
metadata:
  labels:
    app.kubernetes.io/action: probe
  name: rahasak # name is same as service name
subsets:
- addresses:
  - ip: 10.0.0.4
  - ip: 10.0.0.5
  ports:
  - name: db
    protocol: TCP
    port: 9100

创建 servicemonitor

创建一个 ServiceMonitor 来探测每个 endpoint,使用了 icmp 探针来抓取 带有标签 app.kubernetes.io/action: probe 的Kubernets service

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: blackbox-exporter
spec:
  endpoints:
  - interval: 1m
    path: /probe
    scrapeTimeout: 10s
    params:
      module: [ping]
    relabelings:
    - sourceLabels: [__address__]
      targetLabel: __param_target
    - targetLabel: __address__
    # blackbox_service_name.namespace:port
      replacement:  prometheus-blackbox-prometheus-blackbox-exporter:9115
    - sourceLabels: [__param_target]
      targetLabel: instance
    - action: labelmap
      regex: __meta_kubernetes_endpoints_label_(.+) # specify to monitor kubernetes endpoints 
  jobLabel: blackbox-exporter
  selector:
    matchLabels:
      app.kubernetes.io/action: probe # monitor endpoints only with the given label

Notes

blackbox_exporter 如果想要使用 icmp 探针,必须拥有 root 权限,直接修改 runAsGroup: 0 即可

对于 直接使用 servicemonitor 中的 endpoint 只能识别出一个 IP,原因是,balckbox 暴漏的指标需要带参数访问,下列格式

"http://10.104.202.8:9115/probe?module=ping&target=10.0.0.5"

而传入多个 target 没有用,只会返回第一个 target 的指标,所以说会出现多个 endpoint 只会出现一个,同样的问题,如果 service 设置为 ClusterIP,也会只有一个指标,必须 type: None 才可以,这就是只有多个 endpoint 才会在拉去指标时请求多个 balckbox exporter 的 API

image-20230713005706664

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: blackbox-probe-tcp
  namespace: default 
  labels:
    release: kube-prometheus-stacks
spec:
  endpoints:
  - port: http
    path: /probe
    interval: 5s
    scrapeTimeout: 5s
    params:
      module:
      - ping
      target:
      - 10.0.0.4
      - 10.0.0.5
    relabelings:
    - action: replace
      regex: (.*)
      replacement: $1
      sourceLabels:
      - __meta_kubernetes_service_label_cluster
      targetLabel: cluster
    - action: replace
      regex: (.*)
      replacement: $1
      sourceLabels:
      - __param_module
      targetLabel: module
    - action: labelmap
      regex: (.*)
      replacement: $1
      sourceLabels: [__param_target]
      targetLabel: __address__
  selector:
    matchLabels:
      app.kubernetes.io/instance: prometheus-blackbox

目前暂未找到有效的解决方法,但是在清单配置多个 endpoint 就出现多条 serivcemonitor 记录,持续更进该问题,可能可以通过 additionalScrapeConfigs 可以解决该问题

Reference

[1] Monitor Kubernets Services/Endpoints with Prometheus Blackbox Exporter

[2] Prometheus Operator + Blackbox exporter

本文发布于Cylon的收藏册,转载请著名原文链接~

链接:https://www.oomkill.com/2023/07/blackbox_exporter-in-k8s/

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」 许可协议进行许可。