Prometheus BlackBox简单监控

2023-10-17 23:59

本文主要是介绍Prometheus BlackBox简单监控,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Prometheus 监控简介

Prometheus 监控分为两种:

  • 白盒监控

  • 墨盒监控

白盒监控:是指我们日常监控主机的资源用量、容器的运行状态、数据库中间件的运行数据。这些都是支持业务和服务的基础设施,通过白盒能够了解其内部的实际运行状态,通过对监控指标的观察能够预判可能出现的问题,从而对潜在的不确定因素进行优化。

墨盒监控:即以用户的身份测试服务的外部可见性,常见的黑盒监控包括 HTTP探针TCP探针DnsIcmp等用于检测站点、服务的可访问性、服务的连通性,以及访问效率等。

两者比较:黑盒监控相较于白盒监控最大的不同在于黑盒监控是以故障为导向当故障发生时,黑盒监控能快速发现故障,而白盒监控则侧重于主动发现或者预测潜在的问题。一个完善的监控目标是要能够从白盒的角度发现潜在问题,能够在黑盒的角度快速发现已经发生的问题。

部署 Prometheus Blackbox 服务

环境:

  • Prometheus Operator 版本 v0.29.0(Prometheus Operator手动部署)

  • Kubernetes 版本 1.15.6 (二进制部署)

  • Blackbox Exporter 版本 v0.16.0

Blackbox Exporter 部署

Exporter Configmap 定义,可以参考下面两个链接 https://github.com/prometheus/blackbox_exporter/blob/master/CONFIGURATION.md https://github.com/prometheus/blackbox_exporter/blob/master/example.yml

首先得声明一个 Blackbox 的 Deployment,并利用 Configmap 来为 Blackbox 提供配置文件。

$ vim prometheus-blackbox.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: blackbox-confignamespace: monitoring
data:blackbox.yml: |-modules:http_2xx:  # http 检测模块  Blockbox-Exporter 中所有的探针均是以 Module 的信息进行配置prober: httptimeout: 10shttp:valid_http_versions: ["HTTP/1.1", "HTTP/2"]valid_status_codes: [200]  # 默认 2xx,这里定义一个返回状态码,在grafana作图时,有明示。method: GETheaders:Host: prometheus.example.comAccept-Language: en-USOrigin: example.compreferred_ip_protocol: "ip4" # 首选IP协议no_follow_redirects: false # 关闭跟随重定向http_post_2xx: # http post 监测模块prober: httptimeout: 10shttp:valid_http_versions: ["HTTP/1.1", "HTTP/2"]method: POST# post 请求headers, body 这里可以不声明headers:  # 使用 json 格式Content-Type: application/jsonbody: '{"text": "hello"}'preferred_ip_protocol: "ip4"tcp_connect:  # TCP 检测模块prober: tcptimeout: 10sdns_tcp:  # DNS 通过TCP检测模块prober: dnsdns:transport_protocol: "tcp"  # 默认是 udppreferred_ip_protocol: "ip4"  # 默认是 ip6query_name: "kubernetes.default.svc.cluster.local" # 利用这个域名来检查 dns 服务器# query_type: "A"  # 如果是 kube-dns ,一定要加入这个,因为不支持Ipv6
---
apiVersion: apps/v1
kind: Deployment
metadata:name: blackboxnamespace: monitoring
spec:replicas: 1revisionHistoryLimit: 3selector:matchLabels:app: blackboxstrategy:rollingUpdate:maxSurge: 30%maxUnavailable: 30%type: RollingUpdatetemplate:metadata:labels:app: blackboxspec:containers:- image: prom/blackbox-exporter:v0.16.0name: blackboxargs:- --config.file=/etc/blackbox_exporter/blackbox.yml # ConfigMap 中的配置文件- --log.level=info  # 日志级别,可以把级别调到 errorports:- containerPort: 9115volumeMounts:- name: configmountPath: /etc/blackbox_exportervolumes:- name: configconfigMap:name: blackbox-config
---
apiVersion: v1
kind: Service
metadata:name: blackboxnamespace: monitoring
spec:selector:app: blackboxports:- port: 9115targetPort: 9115
# 部署
$ kubectl apply -f prometheus-blackbox.yamlconfigmap/blackbox-config created
deployment.apps/blackbox created
service/blackbox created

定义 BlackBox 在 Prometheus 抓取设置

下面抓取设置,都存放在 prometheus-additional.yaml 文件中,设置可参考 https://github.com/prometheus/prometheus/blob/master/documentation/examples/prometheus-kubernetes.yml

DNS 监控

- job_name: "blackbox-k8s-service-dns"scrape_interval: 30sscrape_timeout: 10smetrics_path: /probe # 不是 metrics,是 probeparams:module: [dns_tcp] # 使用 DNS TCP 模块static_configs:- targets:- kube-dns.kube-system:53  # 不要省略端口号relabel_configs:- source_labels: [__address__]target_label: __param_target- source_labels: [__param_target]target_label: instance- target_label: __address__replacement: blackbox:9115  # 服务地址,和上面的 Service 定义保持一致

更新 additional-configs secrets配置 ,Prometheus 会自动 reload

# 先删除,在重新创建
$ kubectl delete secrets -n monitoring additional-configs
$ kubectl create secret generic additional-configs --from-file=prometheus-additional.yaml -n monitoring

看到下面输出结果,说明 Prometheus 已重载

打开 Prometheus 的 Target 页面,就会看到 上面定义的 blackbox-k8s-service-dns 任务,到 graph 页面,可以使用 probe_success 和 probe_duration_seconds 等来检查历史结果

HTTP 监控(K8S 内部发现方法)

发现 Service 监控

- job_name: 'kubernetes-http-services'metrics_path: /probeparams:module: [http_2xx]  # 使用定义的http模块kubernetes_sd_configs:- role: service  # service 类型的服务发现relabel_configs:# 只有service的annotation中配置了 prometheus.io/http_probe=true 的才进行发现- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_http_probe]action: keepregex: true- source_labels: [__address__]target_label: __param_target- target_label: __address__replacement: blackbox:9115- source_labels: [__param_target]target_label: instance- action: labelmapregex: __meta_kubernetes_service_label_(.+)- source_labels: [__meta_kubernetes_namespace]target_label: kubernetes_namespace- source_labels: [__meta_kubernetes_service_name]target_label: kubernetes_name

按上面方法重载 Prometheus,打开 Prometheus 的 Target 页面,就会看到 上面定义的 blackbox-k8s-http-services 任务

自定义发现 Service 监控 端口 和 路径,可以如下设置:

- job_name: 'blackbox-k8s-http-services'scrape_interval: 30sscrape_timeout: 10smetrics_path: /probeparams:module: [http_2xx]  # 使用定义的http模块kubernetes_sd_configs:- role: service  # service 类型的服务发现relabel_configs:# 只有service的annotation中配置了 prometheus.io/http_probe=true 的才进行发现- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_http_probe]action: keepregex: true- source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_namespace, __meta_kubernetes_service_annotation_prometheus_io_http_probe_port, __meta_kubernetes_service_annotation_prometheus_io_http_probe_path]action: replacetarget_label: __param_targetregex: (.+);(.+);(.+);(.+)replacement: $1.$2:$3$4- target_label: __address__replacement: blackbox:9115- source_labels: [__param_target]target_label: instance- action: labelmapregex: __meta_kubernetes_service_label_(.+)- source_labels: [__meta_kubernetes_namespace]target_label: kubernetes_namespace- source_labels: [__meta_kubernetes_service_name]target_label: kubernetes_name

然后,需要在 Service 中配置这样的 annotation :

annotation:prometheus.io/http-probe: "true"prometheus.io/http-probe-port: "8080"prometheus.io/http-probe-path: "/healthCheck"

按上面方法重载 Prometheus,打开 Prometheus 的 Target 页面,就会看到 上面定义的 blackbox-k8s-http-services 任务

发现 Ingress

- job_name: 'blackbox-k8s-ingresses'scrape_interval: 30sscrape_timeout: 10smetrics_path: /probeparams:module: [http_2xx]  # 使用定义的http模块kubernetes_sd_configs:- role: ingress  # ingress 类型的服务发现relabel_configs:# 只有ingress的annotation中配置了 prometheus.io/http_probe=true 的才进行发现- source_labels: [__meta_kubernetes_ingress_annotation_prometheus_io_http_probe]action: keepregex: 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: blackbox:9115- source_labels: [__param_target]target_label: instance- action: labelmapregex: __meta_kubernetes_ingress_label_(.+)- source_labels: [__meta_kubernetes_namespace]target_label: kubernetes_namespace- source_labels: [__meta_kubernetes_ingress_name]target_label: kubernetes_name

按上面方法重载 Prometheus,会出现下面报错,报权限不足

解决方法:在 prometheus-clusterRole.yaml 后面添加下面内容

- apiGroups:- extensionsresources:- ingressesverbs:- get- list- watch
$ kubectl apply -f prometheus-clusterRole.yaml

打开 Prometheus 的 Target 页面,就会看到 上面定义的 blackbox-k8s-ingresses 任务

HTTP 监控(监控外部域名)

- job_name: "blackbox-external-website"scrape_interval: 30sscrape_timeout: 15smetrics_path: /probeparams:module: [http_2xx]static_configs:- targets:- https://www.example.com # 要检查的网址- https://test.example.comrelabel_configs:- source_labels: [__address__]target_label: __param_target- source_labels: [__param_target]target_label: instance- target_label: __address__replacement: blackbox:9115

打开 Prometheus 的 Target 页面,就会看到 上面定义的 blackbox-external-website 任务

HTTP Post 监控(监控外部域名)

- job_name: 'blackbox-http-post'metrics_path: /probeparams:module: [http_post_2xx]static_configs:- targets:- https://www.example.com/api # 要检查的网址relabel_configs:- source_labels: [__address__]target_label: __param_target- source_labels: [__param_target]target_label: instance- target_label: __address__replacement: blackbox:9115

打开 Prometheus 的 Target 页面,就会看到 上面定义的 blackbox-http-post 任务

Grafana Dashboard

Grafana 官网找到的一个Dashboard

  • https://grafana.com/grafana/dashboards/9965

小结

Prometheus Blackbox 除了支持对 HTTP 协议进行网络探测以外,Blackbox 还支持对 TCP、DNS、ICMP 等其他网络协议,大家感兴趣的可以从 Blackbox 的 Github项目中获取更多使用方法。

参考链接

  • https://github.com/prometheus/blackbox_exporter/blob/master/CONFIGURATION.md

  • https://github.com/prometheus/blackbox_exporter/blob/master/example.yml

  • https://www.qikqiak.com/post/blackbox-exporter-on-prometheus/

  • https://blog.fleeto.us/post/blackbox-monitor-dns-web/

往期精彩文章

  • Kubernetes Pod 生命周期

  • kubectl 创建 Pod 背后到底发生了什么?

  • Docker 必修课程 Dockerfile

  • 阿里开源 k8s 事件通知服务

  • Kubernetes之容器数据写满磁盘解决方法

  • Nginx 基于客户端IP分析

您的关注是小站的动力

欢迎大家关注交流,定期分享自动化运维、DevOps、Kubernetes、Service Mesh和Cloud Native

扫码『加群』交流技术

这篇关于Prometheus BlackBox简单监控的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/228820

相关文章

Python中Request的安装以及简单的使用方法图文教程

《Python中Request的安装以及简单的使用方法图文教程》python里的request库经常被用于进行网络爬虫,想要学习网络爬虫的同学必须得安装request这个第三方库,:本文主要介绍P... 目录1.Requests 安装cmd 窗口安装为pycharm安装在pycharm设置中为项目安装req

使用Python实现局域网远程监控电脑屏幕的方法

《使用Python实现局域网远程监控电脑屏幕的方法》文章介绍了两种使用Python在局域网内实现远程监控电脑屏幕的方法,方法一使用mss和socket,方法二使用PyAutoGUI和Flask,每种方... 目录方法一:使用mss和socket实现屏幕共享服务端(被监控端)客户端(监控端)方法二:使用PyA

Prometheus+cpolar如何在手机上也能监控服务器状态?

《Prometheus+cpolar如何在手机上也能监控服务器状态?》本文强调了通过Cpolar这一内网穿透工具,轻松突破Prometheus仅限于局域网访问的限制,实现外网随时随地访问监控数据,教你... 目录前言1.安装prometheus2.安装cpolar实现随时随地开发3.配置公网地址4.保留固定

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index:

GO语言实现串口简单通讯

《GO语言实现串口简单通讯》本文分享了使用Go语言进行串口通讯的实践过程,详细介绍了串口配置、数据发送与接收的代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录背景串口通讯代码代码块分解解析完整代码运行结果背景最近再学习 go 语言,在某宝用5块钱买了个

SpringBoot整合Apache Spark实现一个简单的数据分析功能

《SpringBoot整合ApacheSpark实现一个简单的数据分析功能》ApacheSpark是一个开源的大数据处理框架,它提供了丰富的功能和API,用于分布式数据处理、数据分析和机器学习等任务... 目录第一步、添加android依赖第二步、编写配置类第三步、编写控制类启动项目并测试总结ApacheS

C++简单日志系统实现代码示例

《C++简单日志系统实现代码示例》日志系统是成熟软件中的一个重要组成部分,其记录软件的使用和运行行为,方便事后进行故障分析、数据统计等,:本文主要介绍C++简单日志系统实现的相关资料,文中通过代码... 目录前言Util.hppLevel.hppLogMsg.hppFormat.hppSink.hppBuf

Python实现简单封装网络请求的示例详解

《Python实现简单封装网络请求的示例详解》这篇文章主要为大家详细介绍了Python实现简单封装网络请求的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装依赖核心功能说明1. 类与方法概览2.NetHelper类初始化参数3.ApiResponse类属性与方法使用实

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

springboot2.1.3 hystrix集成及hystrix-dashboard监控详解

《springboot2.1.3hystrix集成及hystrix-dashboard监控详解》Hystrix是Netflix开源的微服务容错工具,通过线程池隔离和熔断机制防止服务崩溃,支持降级、监... 目录Hystrix是Netflix开源技术www.chinasem.cn栈中的又一员猛将Hystrix熔