本文发布于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
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
本文发布于Cylon的收藏册,转载请著名原文链接~
链接:https://www.oomkill.com/2023/07/blackbox_exporter-in-k8s/
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」 许可协议进行许可。