KVM宿主机监控,libvirt_exporter接入
很多刚接触虚拟化运维的同学会问:宿主机上的虚拟机状态怎么统一监控?
KVM本身没有自带Web界面,但通过libvirt_exporter可以把每台虚拟机的CPU、内存、磁盘、网络流量等指标暴露给Prometheus,再用Grafana展示。
本文就是一套完整可落地的接入方案,从零开始带你完成部署和验证。
一、准备工作:确认环境依赖
开始操作前,先确认宿主机满足以下条件:
- 操作系统为Linux,推荐CentOS 7/8、Ubuntu 20.04及以上版本
- KVM虚拟化正常使用,宿主机已安装
libvirt相关组件 - Prometheus服务已部署(部署方式不限,可以是二进制或Docker)
- 宿主机可以访问外网,或本地有
libvirt_exporter安装包
检查libvirt是否正常,可执行:
virsh list --all
能列出虚拟机列表就说明libvirt工作正常。
如果提示virsh命令不存在,先安装libvirt客户端:
# CentOS/RHEL
yum install -y libvirt-client
# Ubuntu/Debian
apt install -y libvirt-clients
二、部署libvirt_exporter:两种方式任选
libvirt_exporter是一个轻量级采集器,它通过libvirt API读取虚拟机信息,然后以Prometheus标准格式输出指标。
下面提供二进制和Docker两种部署方式。
方式一:二进制安装(适合不使用Docker的环境)
先到GitHub Releases页面下载对应架构的压缩包。
这里以libvirt_exporter-1.8.2.linux-amd64.tar.gz为例(版本号以实际发布为准):
wget https://github.com/kumina/libvirt_exporter/releases/download/1.8.2/libvirt_exporter-1.8.2.linux-amd64.tar.gz
tar -xzf libvirt_exporter-1.8.2.linux-amd64.tar.gz
cd libvirt_exporter-1.8.2.linux-amd64
将二进制文件复制到系统目录并启动:
sudo cp libvirt_exporter /usr/local/bin/
# 使用普通用户运行,避免权限过高
sudo useradd -r -s /bin/false libvirt_exporter
sudo -u libvirt_exporter /usr/local/bin/libvirt_exporter --libvirt.uri qemu:///system
默认监听端口为9273。
建议配合systemd管理,创建/etc/systemd/system/libvirt_exporter.service:
[Unit]
Description=Libvirt Exporter
After=libvirtd.service
[Service]
User=libvirt_exporter
ExecStart=/usr/local/bin/libvirt_exporter --libvirt.uri qemu:///system
Restart=always
[Install]
WantedBy=multi-user.target
启动并设置开机自启:
sudo systemctl daemon-reload
sudo systemctl enable --now libvirt_exporter
方式二:Docker运行(适合已有容器环境)
如果宿主机装了Docker,可这样启动:
docker run -d --name libvirt-exporter \
--restart=always \
-v /var/run/libvirt/libvirt-sock:/var/run/libvirt/libvirt-sock \
-p 9273:9273 \
--user 0 \
kumina/libvirt-exporter
注意挂载本机libvirt socket,否则容器内无法连接宿主机虚拟化服务。
三、接入Prometheus:修改抓取配置
在Prometheus的配置文件prometheus.yml中增加一个job,指向宿主机IP和Exporter端口:
scrape_configs:
- job_name: 'kvm-host'
static_configs:
- targets: ['192.168.1.10:9273']
labels:
instance: 'kvm-01' # 自定义名称,便于区分多台宿主机
改完后执行:
promtool check config prometheus.yml # 检查配置格式
curl -X POST http://localhost:9090/-/reload # 热加载配置
如果Prometheus使用Docker部署,挂载配置后也需要docker restart prometheus或调用reload接口。
四、验证监控数据:从Exporter到Grafana
1. 检查Exporter输出
直接在宿主机上访问指标接口:
curl http://127.0.0.1:9273/metrics | head -20
正常会看到以libvirt_开头的指标,例如:
libvirt_domain_meta
libvirt_domain_cpu_time_seconds_total
libvirt_domain_memory_stats_available_bytes
libvirt_domain_block_stats_write_bytes_total
libvirt_domain_interface_stats_receive_bytes_total
2. 在Prometheus中查询
打开Prometheus Web界面,进入Status -> Targets,确认kvm-host状态为UP。
然后在查询框输入:
libvirt_domain_memory_stats_available_bytes
点击Execute,能看到每个虚拟机对应的内存可用值,说明采集链路已打通。
3. 配置Grafana看板
Grafana中添加Prometheus数据源,然后导入现成的KVM Dashboard。
社区推荐ID为13500(KVM / Libvirt Exporter)的看板,导入后即可看到CPU、内存、网络、磁盘等维度图表。
如果该ID不可用,也可以按指标名自己创建面板。
五、避坑指南与常见问题
整个接入过程不难,但有几个坑容易让人卡住:
- 权限不足导致连不上libvirt。运行libvirt_exporter的用户需要能访问
/var/run/libvirt/libvirt-sock。建议将用户加入libvirt组:
sudo usermod -aG libvirt libvirt_exporter
然后重启服务。
若用Docker,必须在启动命令中加--user 0或指定组ID。
- Exporter启动后立即退出。先看日志:
sudo journalctl -u libvirt_exporter -e
通常提示failed to connect to libvirt,确认libvirtd服务是否运行:systemctl status libvirtd。
- Prometheus抓取超时。如果虚拟机数量很多,建议调大抓取间隔,在job中加
scrape_interval: 30s,避免每次抓取耗时过长。 - 指标重复标签。多台宿主机接入时,务必给不同宿主机的target设置不同的
instance标签,否则Grafana上会混淆。
如果验证时发现某些虚拟机指标缺失,先检查该虚拟机是否处于运行状态。libvirt_exporter默认只采集运行中的虚拟机,关机状态的不存在对应的运行时指标。
搭好这套链路后,后续再新增KVM宿主机,只需重复第二步和改一下Prometheus里的target配置。
监控数据统一进Prometheus,告警规则也可以直接针对libvirt_指标编写,非常方便。
建议你先把基础抓取跑通,再看板调整,不要一上来追求完整大屏。
如有其他问题,欢迎在评论区描述你的环境和具体报错。