监听 pve 主机上的内网服务

1 天前
 BaymaxK

前言

上一篇文章,我分享了如何给pve 搭建一套告警服务,最近我碰到了内网主机上的某个服务崩溃导致无法访问的问题。于是乎,我就寻思着,如何利用这套告警服务来定时探测内网的某个服务是否可访问,无法访问时,就发送邮件进行通知。

本文就跟大家分享下我的实现思路,欢迎各位感兴趣的开发者阅读本文。

方案调研

我一开始的想法是,编写一个 sh 脚本,利用 linux 的 curl 命令来探测,每分钟执行一次,这个脚本也简单,如下所示:

不知道为啥,此处的代码 v 站不给贴,贴了就提示 Sorry, you have been blocked
You are unable to access v2ex.com

随后,执行crontab -e命令设置 cron 定时任务,每分钟执行一次这个脚本。

* * * * * /path/to/check_http_service.sh

探测任务完成了,但是,如何让Prometheus 监听到,并通过Alertmanager 来发送通知呢?找了一圈,没找到开箱即用的方案。需要自己整一个 http 服务器,把 sh 脚本返回的内容暴露出来,再通过 Prometheus 来抓取这个服务返回的内容。

这样做就太麻烦了,必要性不是很大。

blackbox_exporter 监控

自定义 sh 脚本的路走不通后,我将思路转变到了 Prometheus 本身,发现它有一个Blackbox Exporter扩展,可以监控外部的 HTTP 服务。只需要安装相关的软件包、编写配置文件即可实现监控,给大家看下我最终实现的效果。

实现过程

方案有了,接下来,我们看下具体的实现过程。

安装扩展包

通过 ssh 登陆到 pve 服务器,依次执行下述命令,将软件包下载到用户目录下。

# 下载
wget https://github.com/prometheus/alertmanager/releases/download/vX.Y.Z/alertmanager-X.Y.Z.linux-amd64.tar.gz
# 解压
tar -xvzf alertmanager-X.Y.Z.linux-amd64.tar.gz

使用你喜欢的编辑器(此处使用 nvim )来创建服务配置文件,便于管理服务的启动状态。

nvim /etc/systemd/system/blackbox_exporter.service

添加下述内容:

[Unit]
Description=Blackbox Exporter
After=network.target

[Service]
Type=simple
ExecStart=/root/blackbox_exporter-0.21.0.linux-amd64/blackbox_exporter
Restart=always
User=root
Group=root
WorkingDirectory=/root/blackbox_exporter-0.21.0.linux-amd64

[Install]
WantedBy=multi-user.target

保存后,执行systemctl daemon-reload来重载服务。

依次执行下述命令来启动服务,并将其添加至开机自启名单中。

systemctl start blackbox_exporter
systemctl enable blackbox_exporter

查看运行状态与日志

服务启动后,我们执行systemctl status blackbox_exporter命令,如果正常运行,你将看到如下所示的内容:

通过journalctl -u blackbox_exporter -f命令来查看运行日志。

测试能否正常工作

执行下述命令,将 target 换成你要检测的内网服务地址。

curl 'http://localhost:9115/probe?module=http_2xx&target=http://192.168.6.131:8080/chat-api'

如果你的服务正常运行,你将看到如下所示的输出。

配置 prometheus

用你喜欢的编辑器,打开 prometheus.yml 的配置文件。

nvim /etc/prometheus/prometheus.yml

添加下述内容

  # blackbox_ping 监听内网服务是否正常
  - job_name: 'blackbox_ping'
    metrics_path: /probe
    params:
      module: [http_2xx]  # 使用 HTTP 模块
    static_configs:
      - targets:
        - http://192.168.6.131:8080/chat-api  # 使用完整的 URL
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: localhost:9115  # blackbox_exporter 的地址和端口
    scrape_interval: 1m  # 每分钟采集一次  

配置 Alertmanager

用你喜欢的编辑器,打开 Alertmanager 的配置文件。

nvim /etc/prometheus/alert.rules.yml

添加下述内容

      - alert: "主机解析失败_192.168.6.131_8080"
        expr: probe_success{instance="http://192.168.6.131:8080/chat-api",job="blackbox_ping"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "HTTP 探测到 192.168.6.131:8080 失败"
          description: "对 192.168.6.131:8080 的 HTTP 探测在过去 1 分钟内连续失败,请检查网络或服务状态。"

重启并验证所有服务

依次执行下述命令

sudo systemctl restart blackbox_exporter
sudo systemctl restart prometheus
sudo systemctl restart alertmanager

sudo systemctl status blackbox_exporter
sudo systemctl status prometheus
sudo systemctl status alertmanager

如果一切正常的话,打开 prometheus 的 web 界面,你将看到如下内容:

此时,将你的内网服务关闭,1 分钟后,你将成功收到告警邮件。

写在最后

至此,文章就分享完毕了。

我是神奇的程序员,一位前端开发工程师。

如果你对我感兴趣,请移步我的个人网站,进一步了解。

626 次点击
所在节点    程序员
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1096812

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX