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

相关文章

使用EasyExcel实现简单的Excel表格解析操作

《使用EasyExcel实现简单的Excel表格解析操作》:本文主要介绍如何使用EasyExcel完成简单的表格解析操作,同时实现了大量数据情况下数据的分次批量入库,并记录每条数据入库的状态,感兴... 目录前言固定模板及表数据格式的解析实现Excel模板内容对应的实体类实现AnalysisEventLis

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

golang获取prometheus数据(prometheus/client_golang包)

《golang获取prometheus数据(prometheus/client_golang包)》本文主要介绍了使用Go语言的prometheus/client_golang包来获取Prometheu... 目录1. 创建链接1.1 语法1.2 完整示例2. 简单查询2.1 语法2.2 完整示例3. 范围值

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.