kube-prometheus 系列3 使用 blackbox-exporter 进行 icmp 和 http 监控

本文主要是介绍kube-prometheus 系列3 使用 blackbox-exporter 进行 icmp 和 http 监控,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

安装kube-prometheus 后默认在monitoring namespace中有创建 blackbox-exporter deployment。但默认没有icmp的module配置,无法执行ping探测。因为即使有icmp module,默认配置也是无法执行ping探测的(这篇文章要解决的就是这个问题),这可能也是默认没有icmp module的原因。

首先把icmp module加上,然后增加icmp 的probe配置:

第一步修改blackbox 的config map,添加icmp的modules:

kubectl -n monitoring edit cm blackbox-exporter-configuration
添加如下module配置"icmp_example":"prober": "icmp""timeout": "5s""icmp":"preferred_ip_protocol": "ip4"

创建probe

注意这里的module 名要与刚创建的对应

kind: Probe
apiVersion: monitoring.coreos.com/v1
metadata:name: example-pingnamespace: monitoring
spec:interval: 60smodule: icmp_exampleprober:url: blackbox-exporter.monitoring.svc.cluster.local:19115targets:staticConfig:static:- 127.0.0.1

至此,你的prometheus中应该有这个target了,并且状态也是up,类似如下
在这里插入图片描述
但是在Prometheus 中查询 probe_success 的结果时返回值是0,也就时ping不通。值为1表示ping成功。
也可以通过访问blackbox的如下url进行测试:

curl -s http://192.168.112.123:9115/probe?module=icmp_example&target=127.0.0.1

此时检查blcakbox-exporter的日志毫无发现。
下面调整日志级别为debug试试

在blackbox容器args新曾参数--log.level=debug
kubectl -n monitoring edit deployments.apps  blackbox-exporter containers:- args:- --config.file=/etc/blackbox_exporter/config.yml- --web.listen-address=:19115- --log.level=debug #新增行,开启debug模式

开启debug日志后再查看日志,将看到有如下报错

ts=2023-08-08T01:15:43.133Z caller=handler.go:184 module=icmp_example target=192.168.199.123 level=debug msg="Unable to do unprivileged listen on socket, will attempt privileged" err="socket: permission denied"
ts=2023-08-08T01:15:43.133Z caller=handler.go:184 module=icmp_example target=192.168.199.123 level=debug msg="Error listening to socket" err="listen ip4:icmp 0.0.0.0: socket: operation not permitted"
ts=2023-08-08T01:15:43.133Z caller=handler.go:184 module=icmp_example target=192.168.199.123 level=debug msg="Probe failed" duration_seconds=0.00031592

这看起来是权限问题导致的。找到如下解释:
https://github.com/prometheus/blackbox_exporter#permissions

The ICMP probe requires elevated privileges to function:
Windows: Administrator privileges are required.
Linux: either a user with a group within net.ipv4.ping_group_range, the CAP_NET_RAW capability or the root user is required.
1. Your distribution may configure net.ipv4.ping_group_range by default in /etc/sysctl.conf or similar. If not you can set net.ipv4.ping_group_range = 0 2147483647 to allow any user the ability to use ping.
2. Alternatively the capability can be set by executing setcap cap_net_raw+ep blackbox_exporter
BSD: root user is required.
bNo additional privileges are needed.

Linux ping 命令需要 “cap_net_raw”(或 “CAP_NET_RAW”)的 Capabilities 权限,因为该命令需要对数据包进行原始套接字访问。如果不具备此权限,则无法构建和发送 ICMP 包,或者无法接 ICMP 包的响应。
请注意,ping 命令需要在网络层上执行操作,因此它需要特殊的权限。使用 Capabilities 机制覆盖了普通 Linux 用户的权限限制。设置 “cap_net_raw” 权限时,用户将能够执行“ping”命令,而无需以 root 用户的身份登录到系统。
如果使用 root 用户运行 ping 命令,则无需为 ping 命令设置 “cap_net_raw” 的 Capabilities 权限即可成功运行。这是因为 root 用户具有所有系统资源和 Capabilities 权限。使用 root 用户时,系统将允许 ping 命令访问原始套接字,而无需 Capabilities 权限。

那么也就说应该有两种方式解决这个问题,一是简单粗暴使用root运行(安全性低)。二是给与容器NET_RAW权限。下面分别测试一下:

方案1,给root权限

kubectl -n monitoring edit deployments.apps  blackbox-exportersecurityContext部分修改为如下:securityContext:allowPrivilegeEscalation: falsereadOnlyRootFilesystem: truerunAsNonRoot: falserunAsUser: 0(注意这里去掉了原来的capabilities)也就是这部分,因为即使是有root权限,如果显示的移除了权限,也仍然没权限。capabilities:drop:          - ALL

这样修改之后再在Prometheus 中查询 probe_success 的结果值应该是1了。也就是正常了。

再看第二种方案:为容器增加NET_RAW
开始想直接修改deployment的capabilities配置,加上如下配置即可。

        capabilities:add:- NET_RAW

但是经过测试发现不行,初步判断是因为blackbox-exporter容器镜像本身处于安全性考虑的原因,禁用了一些权限,(如Alpine 镜像,加也没效果,可以通过进入容器内cat /proc/1/status命令查看CapPrm和CapEff的值。可参照文档 https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/security-context/)

在 Linux 操作系统中,进程的系统权限可以通过掩码方式进行控制。这些掩码通常被称为“capabilities”,每个掩码通常代表一项特定的系统操作功能。
如果 /proc/1/status 文件中 CapPrm 和 CapEff 的值都为 0,这意味着该进程没有启用任何权限。这可能是由于系统管理员将该进程的权限掩码设置为 0,或者该进程在启动时未显式启用任何额外的权限。另外一些 Linux 发行版(如 Alpine)默认在容器中禁用权限,因此 /proc/1/status 中的权限值通常为 0。如果您有特定的权限要求,请确保正确配置容器和 Pod 的权限

所以如果我们即不想用root用户运行blackbox,又想用icmp监控。则需要重新build一个镜像。
Dockerfile 如下

FROM scionproto/docker-caps as capsFROM prom/blackbox-exporter:v0.23.0
COPY --from=caps /bin/setcap /bin
RUN setcap cap_net_raw+ep /bin/blackbox_exporter && rm /bin/setcap

修改blackbox-exporter deployment 的镜像为刚刚build的镜像。再修改securityContext配置,去掉原有的:

        capabilities:drop:          - ALL
	securityContext部分修改为如下:securityContext:allowPrivilegeEscalation: falsereadOnlyRootFilesystem: truerunAsNonRoot: truerunAsUser: 65534

blackbox-extporter pod正常运行后在Prometheus 中查询 probe_success 的结果值应该是1了。也就是正常了。

如果使监控web站点,直接配置probe即可
参考文档:https://github.com/prometheus-operator/kube-prometheus/blob/main/docs/blackbox-exporter.md

kind: Probe
apiVersion: monitoring.coreos.com/v1
metadata:name: example-com-websitenamespace: monitoring
spec:interval: 60smodule: http_2xxprober:url: blackbox-exporter.monitoring.svc.cluster.local:19115targets:staticConfig:static:- http://example.com- https://example.com

参考资料
https://blog.csdn.net/qq_33745102/article/details/131042025
https://github.com/prometheus/blackbox_exporter/issues/689
https://github.com/scionproto/docker-caps

这篇关于kube-prometheus 系列3 使用 blackbox-exporter 进行 icmp 和 http 监控的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

CSS @media print 使用详解

《CSS@mediaprint使用详解》:本文主要介绍了CSS中的打印媒体查询@mediaprint包括基本语法、常见使用场景和代码示例,如隐藏非必要元素、调整字体和颜色、处理链接的URL显示、分页控制、调整边距和背景等,还提供了测试方法和关键注意事项,并分享了进阶技巧,详细内容请阅读本文,希望能对你有所帮助...

使用Folium在Python中进行地图可视化的操作指南

《使用Folium在Python中进行地图可视化的操作指南》在数据分析和可视化领域,地图可视化是一项非常重要的技能,它能够帮助我们更直观地理解和展示地理空间数据,Folium是一个基于Python的地... 目录引言一、Folium简介与安装1. Folium简介2. 安装Folium二、基础使用1. 创建

Java中Runnable和Callable的区别和联系及使用场景

《Java中Runnable和Callable的区别和联系及使用场景》Java多线程有两个重要的接口,Runnable和Callable,分别提供一个run方法和call方法,二者是有较大差异的,本文... 目录一、Runnable使用场景二、Callable的使用场景三、关于Future和FutureTa

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

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

使用国内镜像源优化pip install下载的方法步骤

《使用国内镜像源优化pipinstall下载的方法步骤》在Python开发中,pip是一个不可或缺的工具,用于安装和管理Python包,然而,由于默认的PyPI服务器位于国外,国内用户在安装依赖时可... 目录引言1. 为什么需要国内镜像源?2. 常用的国内镜像源3. 临时使用国内镜像源4. 永久配置国内镜

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

如何使用C#串口通讯实现数据的发送和接收

《如何使用C#串口通讯实现数据的发送和接收》本文详细介绍了如何使用C#实现基于串口通讯的数据发送和接收,通过SerialPort类,我们可以轻松实现串口通讯,并结合事件机制实现数据的传递和处理,感兴趣... 目录1. 概述2. 关键技术点2.1 SerialPort类2.2 异步接收数据2.3 数据解析2.

详解如何使用Python提取视频文件中的音频

《详解如何使用Python提取视频文件中的音频》在多媒体处理中,有时我们需要从视频文件中提取音频,本文为大家整理了几种使用Python编程语言提取视频文件中的音频的方法,大家可以根据需要进行选择... 目录引言代码部分方法扩展引言在多媒体处理中,有时我们需要从视频文件中提取音频,以便进一步处理或分析。本文

使用Dify访问mysql数据库详细代码示例

《使用Dify访问mysql数据库详细代码示例》:本文主要介绍使用Dify访问mysql数据库的相关资料,并详细讲解了如何在本地搭建数据库访问服务,使用ngrok暴露到公网,并创建知识库、数据库访... 1、在本地搭建数据库访问的服务,并使用ngrok暴露到公网。#sql_tools.pyfrom

使用mvn deploy命令上传jar包的实现

《使用mvndeploy命令上传jar包的实现》本文介绍了使用mvndeploy:deploy-file命令将本地仓库中的JAR包重新发布到Maven私服,文中通过示例代码介绍的非常详细,对大家的学... 目录一、背景二、环境三、配置nexus上传账号四、执行deploy命令上传包1. 首先需要把本地仓中要