基于 vmware_exporter 的 ESXi 监控方案技术分析
一、概述
1. 背景
A. 业务场景
数据中心和边缘节点大量使用 VMware ESXi 承载计算资源。稳定性和容量可视化是基础运维诉求,统一监控体系需要纳入 ESXi 与 vCenter 的指标。
B. 技术挑战
- 多集群、多 vCenter 环境下的统一监控
- ESXi 与 vCenter 指标的标准化采集
- 监控数据的统一存储与可视化展示
- 告警规则的统一管理与路由分发
2. 设计目标
A. 功能目标
- 使用 vmware_exporter 采集 ESXi/vCenter 指标
- 通过 Docker Compose 编排部署监控组件
- 将指标接入 Prometheus 进行时序存储
- 使用 Grafana 构建可视化仪表盘
- 通过 Watchalert 实现端到端告警管理
B. 非功能目标
- 支持多数据中心、多 vCenter 并行采集
- 提供开箱即用的配置模板
- 支持自签证书场景
- 实现高可用的监控架构
二、架构设计
1. 系统架构
graph TB
subgraph VMware基础设施
ESXi1[ESXi主机集群1]
ESXi2[ESXi主机集群2]
vCenter[vCenter服务器]
end
subgraph 采集层
Exp1[vmware_exporter<br/>北京集群:9272]
Exp2[vmware_exporter<br/>南京集群:9273]
end
subgraph 存储层
Prometheus[Prometheus<br/>时序数据库]
end
subgraph 告警层
Watchalert[Watchalert<br/>告警路由与通知]
end
subgraph 可视化层
Grafana[Grafana<br/>仪表盘]
end
ESXi1 --> vCenter
ESXi2 --> vCenter
vCenter --> Exp1
vCenter --> Exp2
Exp1 --> Prometheus
Exp2 --> Prometheus
Prometheus --> Watchalert
Prometheus --> Grafana
Watchalert -->|告警通知|运维团队2. 组件说明
A. vmware_exporter
- 版本:0.18.4
- 功能:连接 vCenter 或直接 ESXi,暴露 Prometheus 格式的 /metrics 接口
- 开源地址:https://github.com/pryorda/vmware_exporter
B. Prometheus
- 版本:3.5.0 LTS
- 功能:抓取 exporter 指标,存储时序数据
- 提供 PromQL 查询语言
C. Watchalert
- 版本:3.8.0
- 功能:接收 Prometheus 数据,配置监控项与告警表达式,支持 webhook 通知
- 支持告警聚合、抑制、路由
D. Grafana
- 版本:10.2.3
- 功能:可视化查询与仪表盘展示
- 支持多种数据源和丰富的图表类型
三、环境准备
1. 前置条件
A. 网络与账户
- 确保可访问 vCenter 或 ESXi 的网络连通性
- 准备只读账户,避免使用管理员账户
- 密码通过环境变量或外部秘密管理,禁止硬编码
B. Docker 环境
- 安装 Docker 与 Docker Compose
- 确保容器间网络通信正常
C. 监控基础设施
- 部署好 Prometheus、Watchalert 与 Grafana
- 确保各组件间网络可达
2. 组件版本清单
| 组件名称 | 版本 | 说明 |
|---|---|---|
| vmware_exporter | 0.18.4 | ESXi/vCenter 指标采集 |
| Prometheus | 3.5.0 LTS | 时序数据存储 |
| Watchalert | 3.8.0 | 告警管理 |
| Grafana | 10.2.3 | 可视化展示 |
四、部署实施
1. vmware_exporter 部署
A. 环境变量配置
支持多集群、多 vCenter 场景,为每个集群创建独立的配置文件:
config-bj.env(北京集群):
VSPHERE_USER=administrator@vsphere.local
VSPHERE_PASSWORD='xxxxxx'
VSPHERE_HOST=172.10.30.1
VSPHERE_IGNORE_SSL=TRUE
VSPHERE_SPECS_SIZE=2000config-nj.env(南京集群):
VSPHERE_USER=administrator@vsphere.local
VSPHERE_PASSWORD='xxxxxx'
VSPHERE_HOST=172.22.33.1
VSPHERE_IGNORE_SSL=TRUE
VSPHERE_SPECS_SIZE=2000B. Docker Compose 编排
version: '3.8'
services:
vmware_exporter_nj:
image: docker.cnb.cool/srebro/docker-images-chrom/pryorda-vmware_exporter:latest_amd64
container_name: vmware_exporter_nj
restart: always
ports:
- "9272:9272"
env_file:
- ./config-nj.env
healthcheck:
test: ["CMD", "nc", "-z", "localhost", "9272"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
vmware_exporter_bj:
image: docker.cnb.cool/srebro/docker-images-chrom/pryorda-vmware_exporter:latest_amd64
container_name: vmware_exporter_bj
restart: always
ports:
- "9273:9272"
env_file:
- ./config-bj.env
healthcheck:
test: ["CMD", "nc", "-z", "localhost", "9272"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60sC. 健康检查机制
- 检测本地 9272 端口
- 检测间隔 30 秒
- 单次检测超时 10 秒
- 连续失败 3 次后标记为不健康
- 启动后 60 秒开始检测
D. 验证部署
启动后访问 metrics 接口:
curl http://<host>:9272/metrics
curl http://<host>:9273/metrics检查容器日志,确认认证与连接正常:
docker logs vmware_exporter_nj
docker logs vmware_exporter_bj2. Prometheus 接入配置
A. 抓取配置
在 Prometheus 的 scrape_configs 中添加 vmware_exporter 任务:
scrape_configs:
- job_name: 'vmware_vcenter'
metrics_path: '/metrics'
static_configs:
- targets: ['172.22.33.218:9272']
labels:
project_name: "Datacenter-srebro"
nodename: "EXSI-172.1.5.17"
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- source_labels: [__address__]
regex: '(.*):9272$'
target_label: datacenter
replacement: 'Datacenter-srebro'
metric_relabel_configs:
- action: replace
target_label: host_name
replacement: 'EXSI-172.1.5.17'
- action: replace
target_label: dc_name
replacement: 'EXSI-172.1.5.17'B. 标签管理
通过 relabel_configs 和 metric_relabel_configs 实现标签自定义:
- project_name:项目名称
- nodename:节点名称
- datacenter:数据中心标识
- host_name:主机名称
- dc_name:数据中心名称
C. 验证接入
- Prometheus Targets 页面确认 vmware_exporter 处于 UP 状态
- 使用 PromQL 查询 vmware_* 前缀指标
- 确认指标标签正确应用
3. Grafana 可视化配置
A. 数据源配置
- 添加 Prometheus 数据源
- 指向 Prometheus HTTP 地址
- 配置访问权限和认证信息
B. 仪表盘导入
可导入社区仪表盘:
- 仪表盘 ID:15446(VMware 总览)
- 仪表盘 ID:11243(VMware 详细)
根据实际情况可能需要微调查询语句和变量。
C. 推荐监控面板
- ESXi 主机状态概览
- CPU 使用率趋势
- 内存使用率趋势
- 存储容量与使用率
- 虚拟机状态分布
- 网络流量统计
五、告警规则设计
1. 告警规则配置
以下规则可导入 Watchalert,根据实际环境调整阈值:
rules:
- alert: ESXi宿主机离线
expr: vmware_host_power_state == 0
for: 30s
labels:
severity: 1
annotations:
summary: "ESXi宿主机离线"
description: "区域:{{ $labels.project_name }} 宿主机:{{ $labels.host_name }} ESXi宿主机离线,当前值 {{ $value }},请登录vCenter查看"
- alert: ESXi存储使用率超阈值
expr: ((1-(vmware_datastore_freespace_size/vmware_datastore_capacity_size))*100) > 85
for: 1m
labels:
severity: 1
annotations:
summary: "ESXi存储使用率超阈值"
description: "区域:{{ $labels.project_name }} 存储名:{{ $labels.ds_name }} 使用率超过85%,当前值 {{ $value }}%"
- alert: ESXi虚拟机CPU使用率过高
expr: vmware_vm_cpu_usage_average/100 >= 85
for: 30s
labels:
severity: 3
annotations:
summary: "ESXi虚拟机CPU使用率过高"
description: "区域:{{ $labels.project_name }} 主机:{{ $labels.nodename }} CPU使用率超过85%,当前值 {{ $value }}%"
- alert: ESXi虚拟机内存使用率过高
expr: vmware_vm_mem_usage_average/100 >= 90
for: 30s
labels:
severity: 3
annotations:
summary: "ESXi虚拟机内存使用率过高"
description: "区域:{{ $labels.project_name }} 主机:{{ $labels.nodename }} 内存使用率超过90%,当前值 {{ $value }}%"
- alert: ESXi实例CPU负载过高
expr: (vmware_host_cpu_usage/vmware_host_cpu_max)*100 > 70
for: 1m
labels:
severity: 1
annotations:
summary: "ESXi实例CPU负载过高"
description: "区域:{{ $labels.project_name }} 宿主机:{{ $labels.host_name }} CPU负载超过70%,当前值 {{ $value }}%"
- alert: ESXi实例内存使用率过高
expr: (vmware_host_memory_usage/vmware_host_memory_max)*100 > 85
for: 30s
labels:
severity: 1
annotations:
summary: "ESXi实例内存使用率过高"
description: "区域:{{ $labels.project_name }} 宿主机:{{ $labels.nodename }} 内存使用率超过85%,当前值 {{ $value }}%"
- alert: ESXi虚拟机快照数量过多
expr: vmware_vm_snapshots > 5
for: 30s
labels:
severity: 3
annotations:
summary: "ESXi虚拟机快照数量过多"
description: "区域:{{ $labels.project_name }} 主机:{{ $labels.nodename }} 快照数量超过5个,当前值 {{ $value }}"2. 告警级别说明
| 级别 | 说明 | 典型场景 |
|---|---|---|
| severity: 1 | 严重告警 | 宿主机离线、存储超阈值、资源过载 |
| severity: 3 | 一般告警 | 虚拟机资源使用过高、快照过多 |
3. Watchalert 配置要点
- 支持告警聚合:相同告警合并发送
- 支持告警抑制:依赖关系避免告警风暴
- 支持 webhook 通知:对接企业微信、钉钉等
六、监控数据流
1. 指标采集流程
sequenceDiagram
participant ESXi as ESXi/vCenter
participant Exporter as vmware_exporter
participant Prometheus as Prometheus
participant Grafana as Grafana
participant Watchalert as Watchalert
participant User as 运维人员
ESXi->>Exporter: 暴露指标接口
Exporter->>Exporter: 转换为Prometheus格式
Prometheus->>Exporter: 定期抓取/metrics
Prometheus->>Prometheus: 存储时序数据
Grafana->>Prometheus: 查询指标数据
Grafana->>User: 展示仪表盘
Prometheus->>Watchalert: 推送告警评估
Watchalert->>User: 发送告警通知2. 关键指标说明
| 指标名称 | 说明 | 单位 |
|---|---|---|
| vmware_host_power_state | 主机电源状态 | 0/1 |
| vmware_datastore_freespace_size | 数据存储空闲空间 | 字节 |
| vmware_datastore_capacity_size | 数据存储总容量 | 字节 |
| vmware_vm_cpu_usage_average | 虚拟机 CPU 使用率 | 百分比 |
| vmware_vm_mem_usage_average | 虚拟机内存使用率 | 百分比 |
| vmware_host_cpu_usage | 主机 CPU 使用量 | 兆赫兹 |
| vmware_host_cpu_max | 主机 CPU 总量 | 兆赫兹 |
| vmware_host_memory_usage | 主机内存使用量 | 字节 |
| vmware_host_memory_max | 主机内存总量 | 字节 |
| vmware_vm_snapshots | 虚拟机快照数量 | 个 |
七、扩展功能
1. 鉴权功能增强
原版 vmware_exporter 未提供鉴权功能,存在安全风险。增强版已添加鉴权支持:
- 代码仓库:https://cnb.cool/sro/vmware_exporter
- 镜像地址:docker.cnb.cool/sro/vmware_exporter:0.18.4
- 使用文档:https://cnb.cool/sro/vmware_exporter/-/blob/master/README.md
2. 镜像加速
使用国内镜像加速地址:
- docker.cnb.cool/srebro/docker-images-chrom/pryorda-vmware_exporter:latest_amd64
八、最佳实践
1. 安全建议
- 使用只读账户进行监控采集
- 密码通过环境变量或外部秘密管理
- 启用 exporter 鉴权功能
- 限制网络访问范围
2. 性能优化
- 合理设置 VSPHERE_SPECS_SIZE 参数
- 使用 healthcheck 确保服务可用性
- 调整 Prometheus 抓取间隔
- 配置合理的指标保留策略
3. 运维建议
- 定期检查容器健康状态
- 监控 exporter 自身的资源消耗
- 及时更新组件版本
- 建立告警值班机制