Centos服务器接入Prometheus、Grafana、Alertmanager监控预警系统

471 阅读3分钟

前言

在这篇技术博文中,我将详细介绍如何在 CentOS 系统上安装和配置 Prometheus 的一个重要组件 —— node_exporternode_exporter 负责收集主机级别的性能指标,并将这些指标暴露给 Prometheus 服务器。我们还将介绍如何将这些监控数据接入到 Prometheus,并使用 Grafana 来创建一个漂亮的监控面板。

接下来,我们将一步步通过实际操作来完成整个过程。我会从 node_exporter 的安装和配置开始,然后配置 Prometheus 以收集 node_exporter 暴露的指标,最后通过 Grafana 创建仪表板来可视化这些指标。无论你是系统管理员还是开发人员,掌握这些技能都将有助于你更好地维护和优化你的系统。

环境准备

一定要注意各个组件的版本对应问题,博文在这方面吃了大亏,浪费了很多时间。

特别是 Grafana 版本 与 kafka-exporter 版本不能过高,不然不兼容,图标数据不展示

  • Prometheus版本: v2.36.2
  • Grafana版本: 9.1.2
  • Kafka版本: 2.5.0
  • Kafka-exporter版本: v1.0.0

环境准备可参考我的博文:

# Docker 安装 Prometheus 和 Grafana

安装node_exporter

本地安装【推荐】

  1. 下载安装包并上传到服务器

    https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
    
  2. 解压安装包到指定安装路径,并重命名

    mkdir -p /home/lbs/software/exporter
    tar -zxvf node_exporter-1.7.0.linux-amd64.tar.gz -C /home/lbs/software/exporter
    mv /home/lbs/software/exporter/node_exporter-1.7.0.linux-amd64 /home/lbs/software/exporter/node_exporter
    
  3. node_exporter目录下新增管理脚本manage_script.sh

    注意替换NODE_EXPORTER_ROOT的值为自己的安装路径

    echo '#!/bin/bash
    # node_exporter的根目录路径
    NODE_EXPORTER_ROOT="/home/lbs/software/exporter/node_exporter"
    # node_exporter的pid文件名称
    PID_FILE="node_exporter.pid"
    # node_exporter的日志文件名称
    LOG_FILE="node_exporter.log"
    
    function start {
        # 从根目录路径组合出完整的命令路径
        local cmd="$NODE_EXPORTER_ROOT/node_exporter"
        nohup $cmd > $LOG_FILE 2>&1 &
        echo $! > $PID_FILE
        echo "Started Node Exporter, pid: $(cat $PID_FILE)"
    }
    
    function stop {
        kill $(cat $PID_FILE)
        rm $PID_FILE
        echo "Stopped Node Exporter"
    }
    
    function status {
        if [ -f $PID_FILE ]; then
            local pid=$(cat $PID_FILE)
    
            if ps -p $pid > /dev/null; then
                echo "Node Exporter is running, pid: $pid"
                echo "Start time: $(ps -p $pid -o lstart=)"
                echo "Running time: $(ps -p $pid -o etime=)"
                echo "Started by user: $(ps -p $pid -o user=)"
            else
                echo "Node Exporter is not running"
            fi
        else
            echo "Node Exporter is not running"
        fi
    }
    
    case $1 in
        "start")
            start
            ;;
        "stop")
            stop
            ;;
        "status")
            status
            ;;
        *)
            echo "Usage: $0 {start|stop|status}"
            ;;
    esac' > manage_script.sh
    chmod +x manage_script.sh
    
  4. 使用manage_script.sh脚本启动node_exporter

    /home/lbs/software/exporter/node_exporter/manage_script.sh start
    
  5. 使用manage_script.sh查看node_exporter状态

    /home/lbs/software/exporter/node_exporter/manage_script.sh status
    

docker安装

node exporter官方更推荐使用本地部署,而不是docker

  1. 编写docker-compose.yml文件

    version: '3.8'
    
    services:
      node_exporter:
        image: prom/node-exporter:v1.6.1
        container_name: node_exporter
        restart: always
        network_mode: host
        pid: host
        volumes:
          - '/:/host:ro,rslave'
        command:
          - '--path.rootfs=/host'
    
  2. 启动容器

    docker-compose up -d
    

配置promethues

需要先进入prometheus容器内部

  1. 编辑/etc/prometheus/prometheus.yml配置文件,变动内容部分如下:

    alerting:
      alertmanagers:
        - static_configs:
            - targets:
              # 配置alertmanagers的ip与端口
              - 10.0.0.7:9093
    rule_files:
      # 新增的预警规则文件
      - /etc/prometheus/alert_rule.yml
    ......
    ......
    ......
    scrape_configs:
      ......
      ......
      ......
      - job_name: 'node1'
        static_configs:
        # 第一台服务器ndoe_exporter的ip端口
        - targets: ['10.0.0.7:9100']
      - job_name: 'node2'
        static_configs:
        # 第二器ndoe_exporter的ip端口
        - targets: ['10.0.0.7:9100']
      ......
      ......
      ......
    
  2. 新增的/etc/prometheus/alert_rule.yml配置文件,内容如下:

    groups:
      - name: Node Monitor
        rules:
          - alert: nodeSurvival
            expr: up == 0
            for: 30s
            labels:
              level: 
            annotations:
              summary: "宕机预警"
              description: "已经宕机30s,请尽快处理!"
          - alert: cpuUsage
            expr: 100 * (1 - avg(irate(node_cpu_seconds_total{mode="idle"}[2m])) by(instance)) > 90
            for: 1m
            labels:
              level: 
            annotations:
              summary: "主机CPU预警"
              description: "主机CPU使用率超过90% 已经持续1m"
          - alert: memoryUsage
            expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 90
            for: 1m
            labels:
              level: 
            annotations:
              summary: "主机内存预警"
              description: "主机内存使用率超过90% 已经持续1m"
          - alert: diskUsage
            expr: 100 * (node_filesystem_size_bytes{fstype=~"xfs|ext4"} - node_filesystem_avail_bytes) / node_filesystem_size_bytes > 90
            for: 1m
            labels:
              level: 
            annotations:
              summary: "主机磁盘预警"
              description: "主机磁盘使用率超过90% 已经持续1m"
    
  3. 重启promethues使其新增配置生效

    也可以采用热加载配置文件的方式:curl -XPOST localhost:9090/-/reload

  4. 验证node-exporter是否接入prometheus成功

    image.png

  5. 验证alertmanager是否接入prometheus成功

    image.png

配置grafana

  1. 登录grafana页面,新增node_exporter面板

    面版ID号为: 15172

    image.png

    image.png

    image.png

配置alertmanager

  1. 浏览器打开http://IP:9094

    账号/密码: alertuser/123456

    image.png

  2. 模板管理中新增自定义模板

    image.png

    image.png

    其实模板内容为:

    {{ range $k,$v:=.alerts }}{{if eq $v.status "resolved"}}<font color="green">**告警恢复信息**</font>
    级别: {{$v.labels.level}}
    类型:{{$v.status}}
    任务: {{$v.labels.job}}
    实例: {{$v.labels.instance}}
    事件: {{$v.annotations.summary}}
    详情: {{$v.annotations.description}}
    开始时间: {{GetCSTtime $v.startsAt}}
    结束时间: {{GetCSTtime $v.endsAt}}
    {{else}}<font color="red">**告警信息**</font>
    级别: {{$v.labels.level}}
    类型:{{$v.status}}
    任务: {{$v.labels.job}}
    实例: {{$v.labels.instance}}
    事件: {{$v.annotations.summary}}
    详情: {{$v.annotations.description}}
    开始时间: {{GetCSTtime $v.startsAt}}
    {{end}}
    {{ end }}
    

    最后直接点击《保存模板》即可

  3. 申请飞书机器人,获取webhook地址

    需要新建群组

    image.png

    image.png

    image.png

    复制图中红色圈起来的webhook地址

  4. 浏览器打开http://IP:9094,获取模板url

    image.png

    image.png

    复制图中红色圈起来的url地址,并将fsurl=后的内容替换为第一步中获取的webhook地址

  5. 编辑alertmanager容器/etc/alertmanager下的alertmanager.yml

    global:
      resolve_timeout: 5m
    route:
      group_by: ['instance']
      group_wait: 10s
      group_interval: 10s
      repeat_interval: 10m
      receiver: 'web.hook.prometheusalert'
    receivers:
      - name: 'web.hook.prometheusalert'
        webhook_configs:
          - url: 'http://10.0.0.87:9094/prometheusalert?type=fs&tpl=prometheus-feishu&fsurl=https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxxxxxxxxx'
    

    url的内容为第二步骤获取到的模块url

  6. 重启alertmanager容器

  7. 关闭监控的主机上的node-exporter, 30s 后飞书中接收到预警信息

    image.png

  8. 重新启动监控的主机上的node-exporter,再次接收到飞书中接收到恢复预警信息

    image.png

总结

通过本文的介绍,我们了解了如何在 CentOS 环境中安装和配置 node_exporter,以及如何将其与 Prometheus 和 Grafana 结合使用。通过这些步骤,我们可以轻松地将系统的监控工作自动化,更加直观地通过 Grafana 面板来观察系统的健康状况和性能指标。

如今,随着云计算和微服务架构的流行,系统监控变得更加重要。一个可靠的监控系统能够帮助我们在问题发生之前就进行预警,从而减少系统的停机时间,提高用户满意度。希望你能将本文的内容应用到实际的工作中,构建出强大的监控系统以支撑你的业务运行。

感谢你的阅读,如果你有任何问题或建议,欢迎在评论区留言讨论。