V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
BaymaxK
V2EX  ›  程序员

监听 pve 主机上的内网服务

  •  
  •   BaymaxK · 15 天前 · 803 次点击

    画板 1

    前言

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

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

    方案调研

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

    • -s: 静默模式,不显示进度信息。

    • -o /dev/null: 忽略返回的内容,只关心状态码。

    • -w "%{http_code}": 打印 HTTP 状态码。

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

    image-20241211195335451

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

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

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

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

    blackbox_exporter 监控

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

    image-20241211104742514

    image-20241211104852617

    实现过程

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

    安装扩展包

    通过 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
    

    添加下述内容:

    • ExecStart 为 blackbox_exporter 服务的启动文件
    • WorkingDirectory 为 blackbox_exporter 的存放路径
    [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命令,如果正常运行,你将看到如下所示的内容:

    image-20241211111158613

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

    image-20241211111431889

    测试能否正常工作

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

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

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

    • probe_success的值为 1 ,表示服务正常运行。为 0 ,表示服务异常。

    image-20241211111942055

    配置 prometheus

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

    nvim /etc/prometheus/prometheus.yml
    

    添加下述内容

    • targets 替换为你要监听的内网服务地址
    • replacement 替换为你的 blackbox_exporter 服务的部署地址,默认端口是 9115
    • scrape_interval 为采集间隔
      # 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 为邮件标题
    • expr 为 graph 的表达式,将instancejob的值替换为上一步中填写的targetsjob_name的值
    • summary 和 description 为你要通知的内容
          - 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 界面,你将看到如下内容:

    image-20241211113726814

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

    image-20241211104852617

    写在最后

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

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

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

    • 文中如有错误,欢迎在评论区指正,如果这篇文章帮到了你,欢迎点赞和关注😊
    • 本文首发于神奇的程序员公众号,未经许可禁止转载💌
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1726 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 16:37 · PVG 00:37 · LAX 08:37 · JFK 11:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.