Proxmox VE 监控:把集群指标秒级推送到 InfluxDB 2.x,Grafana 大屏一步到位

适用版本:PVE 6/7/8 全系列
示例环境:InfluxDB 2.7 + Grafana 10(均 Docker 一键启动)


前言

PVE 自带的 pvestatd 每 30 秒就把 CPU、内存、磁盘、网络、虚拟机/容器等 200+ 指标采了个遍,

可惜默认只躺在 /var/log/pvestats/*.log 里。

打开「Datacenter → Metric Server → InfluxDB」开关,数据会实时推送到 InfluxDB 2.x,再用官方 Grafana 模板,

3 分钟就能拥有带标签的「下一代监控大屏」,支持 Flux 查询、告警、容量预测,全程无代理、零成本。


1. 架构 30 秒速览

复制代码
+----------------+      HTTP 8086 + Token      +------------------+
|  PVE Node 1-8  | ----------------------------> | InfluxDB 2.x     |
|  pvestatd      |   Line Protocol / TLS 可选   | Bucket: proxmox  |
+----------------+                               +------------------+
                                                        ↑
                                               Grafana 10 (Flux/InfluxQL)
  • • 协议:HTTP(S) + Token 鉴权,端口 8086

  • • 格式:InfluxDB Line Protocol,自动带 tag(node、vmid、type)

  • • 压缩:gzip 默认开启,内网 1 Gbps 下 300 节点无压力。


2. 准备 InfluxDB 2.x 接收端

2.1 Docker 30 秒启动(推荐)

复制代码
docker run -d --name influxdb2 \
  -p 8086:8086 \
  -v influxdb2-data:/var/lib/influxdb2 \
  -e DOCKER_INFLUXDB_INIT_MODE=setup \
  -e DOCKER_INFLUXDB_INIT_USERNAME=admin \
  -e DOCKER_INFLUXDB_INIT_PASSWORD=proxmox.2025 \
  -e DOCKER_INFLUXDB_INIT_ORG=homelab \
  -e DOCKER_INFLUXDB_INIT_BUCKET=proxmox \
  influxdb:2.7

容器日志出现 http:://localhost:8086 即启动完成。

2.2 生成专用 Write Token

浏览器打开 http://<宿主机IP>:8086

用上面账号登录 →

Load Data →

API Tokens →

Generate API Token →

Read/Write Token →

Buckets 勾选 proxmox

复制 Token(88 位字符串,关闭窗口后不可再查看!)。


3. PVE 侧 3 步连线

    1. 登录任意节点 Web UI → 左侧 DatacenterMetric ServerAddInfluxDB
    1. 填写:
    • Protocol : http(必须,才能自定义 org/bucket;https 需额外证书)

    • Server : 192.168.10.20:8086

    • Organization : homelab

    • Bucket : proxmox

    • Token: 刚才复制的 88 位字符串

    • Max. Retention: 0(使用 bucket 自身策略,默认 30 天可后改)

    1. Create → 重启统计服务

      systemctl restart pvestatd


4. 30 秒验证:指标真的到了吗?

    1. InfluxDB Web → Data Explorer → Bucket 选 proxmox
    1. 过滤 _measurement=system、_field=active → 点击「Submit」
    1. 右侧出现折线,说明数据已入库!

5. Grafana 可视化:一键导入官方模板

5.1 启动 Grafana(同一宿主机示例)

复制代码
docker run -d --name grafana10 \
  -p 3000:3000 \
  -e GF_SECURITY_ADMIN_PASSWORD=proxmox.2025 \
  grafana/grafana:10.0.0

5.2 添加 InfluxDB 2.x 数据源

  • • URL: http://192.168.10.20:8086

  • • Organization: homelab

  • • Token: 刚才的 88 位 Token(具备 Read 权限)

  • • Default Bucket: proxmox

  • • Query Language: 选 InfluxQL (社区模板多)或 Flux(新特性多),本文以 InfluxQL 为例。

5.3 导入爆款 Dashboard

Grafana →

Import →

Dashboard ID 「23309」(Proxmox VE Detailed)→

选择刚才的 DataSource →

Import。

打开 Dashboard,即可看到:

  • • 集群总览:CPU、内存、磁盘、网络聚合

  • • 单节点详情:温度、负载、IOPS、网卡流量

  • • 虚拟机/容器:单 VM cpu、mem、disk io、net rx/tx

    所有面板均已自动关联 tag,支持下拉框切换 node/vmid。


6. 常见踩坑清单

现象 原因&解决
PVE 保存时报「422 Unprocessable Entity」 Token 没给 Write 权限,或 bucket/organization 拼写错误
Grafana 无数据 Bucket 区分大小写;确认 Token 具备 Read 权限;时间区域选 UTC 或本地
多节点集群 只需在任一 PVE 节点配置一次,整个集群共用;建议用内网 IP,避免跨机房写延迟
想保留 1 年数据 InfluxDB UI → Bucket → Edit → Retention 改为 365d,或新建下行 Bucket 做降采样
HTTPS 自签证书 把 CA 证书放到 /etc/pve/influxdb-ca.crt 并在 PVE 填写 https://... 即可

zabbix主动模式监控ProxmoxVE平台基础指标

1、客户端为pve7.4环境,使用对应agent7.0版本(测试其他低版本获取不到数据)

zabbix agent客户端安装

zabbix-agent7.0官网指引地址 https://www.zabbix.com/cn/download?zabbix=7.0&os_distribution=debian&os_version=11&components=agent&db=&ws=

wget https://repo.zabbix.com/zabbix/7.0/debian/pool/main/z/zabbix-release/zabbix-release_7.0-2+debian11_all.deb

dpkg -i zabbix-release_7.0-2+debian11_all.deb

apt update #必须更新安装包才能获取7.0版本

apt install zabbix-agent

systemctl restart zabbix-agent

systemctl enable zabbix-agent

2、agent主动模式配置

在agent端的配置文件添加如下参数

模板化配置文件只确定如下参数:

ServerActive=xxxxx:30051 #服务端映射出来的10051端口(建议把10051和10050同时映射出来)

Hostname=192.168.100.11_myy01 #主机名称,主机名称必须跟web页面的名称一致

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 实际配置文件信息 root@myy01:/etc/zabbix# cat zabbix_agentd.conf | grep -v "^\\\|\^#" PidFile=/run/zabbix/zabbix_agentd.pid LogFile=/var/log/zabbix/zabbix_agentd.log LogFileSize=0 Server=127.0.0.1 ServerActive=xxxxx:30051 Hostname=192.168.11.253_qh_fhcjf_myy01 Include=/etc/zabbix/zabbix_agentd.d/\*.conf UserParameter=cpu.used,top -b -n1\| awk 'NR==3' \| awk '{print 100-8}' UserParameter=mem.used,free -m | awk 'NR==2{printf "%.2f\n",100-4/2*100}' UserParameter=mem.top,free -g | awk 'NR==2{print2}' UserParameter=swap.used,free -m \| awk 'NR==3{printf "%.2f\\n",3/2\*100}' \| sed 's/-nan/0/p' \| head -1 UserParameter=os.uptime,cat /proc/uptime \|awk '{days=int(1/86400); hours=int((1%86400)/3600); minutes=int((1%3600)/60); seconds=int(1%60); print days "天 " hours ":" minutes ":" seconds}' UserParameter=os.version,pveversion \| awk -F '/' '{print2}' UserParameter=vm.count,ls /etc/pve/qemu-server/| awk -F'.' '1\>1000' \| wc -l UserParameter=temp.cpu0,sensors \| grep "\^Package id 0" \| awk -F'+' '{print2}' | awk -F'°C' '{print1}' UserParameter=temp.cpu1,sensors \| grep "\^Package id 1" \| awk -F'+' '{print2}' | awk -F'°C' '{print1}' UserParameter=temp.connect,sensors \| grep "\^temp1:" \| awk -F'+' '{print2}' | awk -F'°C' '{print1}' UserParameter=clamscan.top,cat /etc/zabbix/scripts/clamscan/clamscan.log \| awk '/Infected files:/{print3}' UserParameter=clamscan.log,cat /etc/zabbix/scripts/clamscan/clamscan.log |

3、添加主机并套用做好的模板

4、模板信息

模板包含基础指标和自定义指标

基础指标如下,根据agent配置文件的UserParameter参数进行实现

自定义指标如下

5、自定义指标获取方式

目录结构

1)通过脚本获取本地需要的日志文件信息,日志文件格式必须首行为表头字段说明,其他行为数据行,首列为监控项名称,其他列为值

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| root@myy01:/etc/zabbix/scripts/pve_mv_status# cat vm_used.sh #!/bin/bash . /etc/profile Os_used_logfile='/etc/zabbix/scripts/pve_mv_status/vm_used.log' Os_status_logfile='/etc/zabbix/scripts/pve_mv_status/vm_status.log' Vm_info_logfile='/etc/zabbix/scripts/pve_mv_status/pve_vm_info.log' Datas=`qm list | awk '{print1"\\t"2"\t"3}' \| awk '{if(1>1000)print}'` echo "{Datas}"\>{Os_status_logfile} Vids=`echo "{Datas}" \| awk 'NR\>1{print1}'` echo -n "">{Os_used_logfile} for i in \`echo "{Vids}"` do Cpu_used=`qm guest exec {i} --timeout 30 wmic cpu get loadpercentage \| grep 'out-data" :' \| grep -o "\[\[:digit:\]\]\*" \| awk '{printf "%.2f\\n",1}'` if [ "{Cpu_used}a" = "a" \];then Cpu_used='0' fi Mem_used=\`qm guest exec {i} --timeout 30 wmic OS get FreePhysicalMemory, TotalVisibleMemorySize /format:list | grep 'out-data" :' | grep -o "[[:digit:]]*" | xargs echo | awk '{printf "%.2f\n",(1-1/2)*100}'` if [ "{Mem_used}a" = "a" \];then Mem_used='0' fi Disk_used=\`qm guest exec {i} --timeout 30 wmic logicaldisk get size,freespace,caption | grep 'out-data" :' | grep -o "[[:digit:]]*" | xargs echo | awk '{print "C "(1-1/2)*100" D "(1-3/4)*100}'` echo "{i} {Cpu_used} {Mem_used} {Disk_used}">>{Os_used_logfile} done printf "%-8s%-16s%-10s%-8s%-8s%-8s%-2s%-8s%-2s%-8s\\n" Vid Name Status Used Cpu Mem C C_used D D_used \>{Vm_info_logfile} for i in `echo "{Vids}"\` do Os_used_data=\`cat {Os_used_logfile} | grep "^{i}" \| awk '{1=""; print}'` Os_status_data=`cat {Os_status_logfile} \| grep "\^{i}"` echo "{Os_status_data} {Os_used_data}">>${Vm_info_logfile} done root@myy01:/etc/zabbix/scripts/pve_mv_status# |

脚本获取的日志文件

2)zabbix自动发现规则所自定义的脚本

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| root@myy01:/etc/zabbix/scripts/pve_mv_status# cat pve_status_check.sh #!/bin/bash EQ_DATA="2" ZBX_REQ_DATA_TAB="1" SOURCE_DATA='/etc/zabbix/scripts/pve_mv_status/pve_vm_info.log' case 2 in Status) grep -E "\^{ZBX_REQ_DATA_TAB}[[:blank:]]" {SOURCE_DATA} \| awk '{print 3}' ;; Cpu) grep -E "^{ZBX_REQ_DATA_TAB}\[\[:blank:\]\]" {SOURCE_DATA} | awk '{print 4}' ;; Mem) grep -E "\^{ZBX_REQ_DATA_TAB}[[:blank:]]" {SOURCE_DATA} \| awk '{print 5}' ;; Cdisk) grep -E "^{ZBX_REQ_DATA_TAB}\[\[:blank:\]\]" {SOURCE_DATA} | awk '{print 7}' ;; Ddisk) grep -E "\^{ZBX_REQ_DATA_TAB}[[:blank:]]" {SOURCE_DATA} \| awk '{print 9}' ;; *) echo ERROR_WRONG_PARAM; exit 1;; esac exit 0 root@myy01:/etc/zabbix/scripts/pve_mv_status# | | root@myy01:/etc/zabbix/scripts/pve_mv_status# cat pve_status_discovery.sh #!/bin/bash SPLEXPORT2=\`cat /etc/zabbix/scripts/pve_mv_status/pve_vm_info.log \| awk '{print 1}' | awk 'NR > 1{print}' | wc -l` if [ {SPLEXPORT2} -ne 0 \];then SPLEXPORT=\`cat /etc/zabbix/scripts/pve_mv_status/pve_vm_info.log \| awk '{print 1}' | awk 'NR > 1{print}'` COUNT=`echo "{SPLEXPORT}" \| wc -l\` INDEX=0 echo '{"data":\[' echo "{SPLEXPORT}" | while read LINE; do echo -n '{"{#SPLEXPORT}":"'{LINE}'"}' INDEX=\`expr {INDEX} + 1` if [ {INDEX} -lt {COUNT} ];then echo "," fi done echo ']}' fi |

3)zabbix 自定义监控项阈值参数

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| root@myy01:/etc/zabbix/scripts/pve_mv_status# cd /etc/zabbix/zabbix_agentd.d/ root@myy01:/etc/zabbix/zabbix_agentd.d# cat pve_status.conf UserParameter=pve.status.discovery, /bin/sh /etc/zabbix/scripts/pve_mv_status/pve_status_discovery.sh UserParameter=pve.status[*], /bin/sh /etc/zabbix/scripts/pve_mv_status/pve_status_check.sh 1 2 |

4)配置计划任务,实现自动获取监控数据

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| root@myy03:/etc/zabbix/zabbix_agentd.d# crontab -l #zabbix */30 * * * * sh /etc/zabbix/scripts/pve_mv_status/vm_used.sh */5 * * * * sh /etc/zabbix/scripts/pve_sysfile_info/pve_sysfile_info.sh |

6、配置zabbix模板

1)创建模板

2)创建自动发现规则

3)创建监控项

4)创建触发器

6、查看监监控项数据

7、查看告警信息

相关推荐
i建模4 小时前
在 Rocky Linux 上安装轻量级的 XFCE 桌面
linux·运维·服务器
Data_Journal4 小时前
Scrapy vs. Crawlee —— 哪个更好?!
运维·人工智能·爬虫·媒体·社媒营销
YMWM_5 小时前
不同局域网下登录ubuntu主机
linux·运维·ubuntu
zmjjdank1ng5 小时前
restart与reload的区别
linux·运维
Suchadar5 小时前
Docker常用命令
运维·docker·容器
你才是臭弟弟5 小时前
MinIo开发环境配置方案(Docker版本)
运维·docker·容器
Bruk.Liu5 小时前
Gitea Actions 的概念及基础使用
运维·ci/cd·持续集成
yanlou2335 小时前
[C++/Linux HTTP项目] HTTP服务器基于muduo高性能服务器搭载【深入详解】
运维·服务器·http·muduo库·http高性能服务器
杨江5 小时前
frp macbook 的18789到 公网服务器上,访问报错:disconnected (1008): unauthorized:
运维
天空属于哈夫克35 小时前
企微第三方 RPA API:非官方接口与官方接口的差异解析及选型建议
运维·服务器