目前 grafana 流行的模板都是通过 InfluxDB 为数据源,使用 Telegraf 来收集数据。
需求
个人家中采购了一台 Dell 的小型工作站服务器,由于不经常登陆控制台就需要查看服务器资源占用的情况。之前服务器被挖矿了我都不知道,后面意外看到虚拟机负载特别高,发现了是服务器被挖矿了。
目前针对 VMware 的 exporter 比较少,大家可能需求不多。所以我找了个 github 比较火的 expoter,但是有很多坑的地方。
准备工作
本次环境依赖于 vcenter、prometheus、grafana、linux、docker,需要提前安装好,VMware_exporter 需要连接 vcenter 获取数据,所以需要安装 vcenter。对于服务的安装到每一步我都会有跳转安装界面的文档。
同时 vcenter 属于 VMware 商业系统,所以我这里不提供下载地址,需要可单独联系我
安装 VMware center
由于目前的 VMware exporter 是基于 vcenter 获取的资源监控,所以我们需要安装一下 vcenter。
配置 Vcenter 安装在哪台 ESXI 节点上,我这里只有一台,我就写一台了
- ESXI 节点
- ESXI 端口号(默认 443)
- ESXI 用户名
- ESXI 密码
这里提示我们证书不安全,直接忽略就可以
设置 vcenter 在 esxi 中的名字,并为 vcenter 配置 root 密码
这里需要根据虚拟机的数量安装给 vcenter 对应的配置,我这里就选择 Tiny 最小的一个即可,家用 esxi 一般不超过 30 个 VMware
这里需要设置 vcenter 存储位置,我就随便选择一个了
这一步是检查我们前两步添加的配置
没有内部 DNS 请在 FQDN 写 IP
接下来等待就可以了
接下来配置 Vcenter
是否开启 SSH,以及时间同步,此处默认
配置 SSO 域
域没有内网 DNS 写 IP
等待结束即可
登录 vcenter
访问地址:https://192.168.31.200:5480/#/login
用户名为administrator@vcenter ip
,密码就是我们设置的密码
添加完 esxi 节点后显示如下
Linux 运行 VMware_exporter
通过 docker -v 将变量写入到环境中
VMware_exporter 不需要做持久化
#docker 运行的方式
$ docker run -d -p 9272:9272
-e VSPHERE_USER=administrator@192.168.31.200
-e VSPHERE_PASSWORD=密码
-e VSPHERE_HOST=主机
-e VSPHERE_IGNORE_SSL=True
-e VSPHERE_SPECS_SIZE=2000
--name vmware_exporter
pryorda/vmware_exporter
#Linux直接运行
#需要安装python3.6 我这里就不演示了
Requires Python >= 3.6
1.Install with $ python setup.py install or via pip $ pip install vmware_exporter. The docker command below is preferred.
2.Create config.yml based on the configuration section. Some variables can be passed as environment variables
3.Run $ vmware_exporter -c /path/to/your/config
4.Go to http://localhost:9272/metrics?vsphere_host=vcenter.company.com to see metrics
VSPHERE_USERNAME
vcenter 用户名VSPHERE_PASSWORD
vcenter 密码VSPHERE_HOST
vcenter 地址
环境变量配置信息
变量名 | 默认值 | 注释 |
VSPHERE_HOST | 连接地址 | |
VSPHERE_USER | 用户名 | |
VSPHERE_PASSWORD | 密码 | |
VSPHERE_SPECS_SIZE | 5000 | 查询统计功能的规格列表大小 |
VSPHERE_IGNORE_SSL | False | 忽略与 vsphere 主机的连接上的 ssl 证书 |
VSPHERE_FETCH_CUSTOM_ATTRIBUTES | False | 设置为 true 以收集对象自定义属性作为度量标签 |
VSPHERE_FETCH_TAGS | False | 设置为 true 以收集对象标签作为度量标签 |
VSPHERE_FETCH_ALARMS | False | 获取对象触发警报,并且在主机 hdw 警报的情况下也是如此 |
VSPHERE_COLLECT_HOSTS | True | 设置为 false 以禁用主机指标收集 |
VSPHERE_COLLECT_DATASTORES | True | 设置为 false 以禁用数据存储指标的收集 |
VSPHERE_COLLECT_VMS | True | 设置为 false 以禁用收集虚拟机指标 |
VSPHERE_COLLECT_VMGUESTS | True | 设置为 false 以禁用虚拟机来宾指标的收集 |
VSPHERE_COLLECT_SNAPSHOTS | True | 设置为 false 以禁用快照指标的收集 |
访问测试http://192.168.31.10:9272/metrics
访问 docker 主机的 9272 端口,也可以自己定义。
群晖 Docker 运行 VMware_exporter
很多情况下我们家里可能只有群晖,没有 Linux 相关服务,又不想进入群晖执行 shell 命令,那么就可以通过控制面板的 Docker 工具来直接进行配置及管理
打开Docker
搜索 VMware_exporter
选中镜像,安装
点击高级设置
勾选启动自动重启容器
网络默认即可
设置 docker 端口号
接下来是配置环境变量,步骤就是上面的方法
没有问题,我们点击启动
可以点到 VMware_exporter 容器查看一下状态
同样我们访问群晖的http://ip:9272/metrics 就可以看到值了
Kubernetes 运行 VMware_exporter
官方文档已经设置了对应 Kubernetes 的 yaml 文件,我们按照需求修改一下
创建一个命名空间
$ kubectl create ns abcdocker
设置 configmap 环境信息
cat >vmware_exporter_config.yaml<<EOF
apiVersion: v1
kind: ConfigMap
metadata:
namespace: abcdocker
name: vmware-exporter-config
data:
VSPHERE_USER: "administrator@192.168.31.200"
VSPHERE_HOST: "192.168.31.200"
VSPHERE_IGNORE_SSL: "True"
VSPHERE_COLLECT_HOSTS: "True"
VSPHERE_COLLECT_DATASTORES: "True"
VSPHERE_COLLECT_VMS: "True"
EOF
考虑密码的安全性,密码不存放在变量中
使用 read 命令以交互方式输入密码,在使用 secret 的方式存储
$ read -s VSPHERE_PASSWORD #执行完后输入密码
$ kubectl create -n abcdocker secret generic vmware-exporter-password --from-literal=VSPHERE_PASSWORD=$VSPHERE_PASSWORD
$ cat >>vmware-exporter_deployment.yaml<<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: vmware-exporter
namespace: abcdocker
spec:
selector:
matchLabels:
app: vmware-exporter
template:
metadata:
labels:
app: vmware-exporter
release: vmware-exporter
annotations:
prometheus.io/path: "/metrics"
prometheus.io/port: "9272"
prometheus.io/scrape: "true"
spec:
containers:
- name: vmware-exporter
image: "pryorda/vmware_exporter:latest"
imagePullPolicy: Always
ports:
- containerPort: 9272
name: http
envFrom:
- configMapRef:
name: vmware-exporter-config
- secretRef:
name: vmware-exporter-password
EOF
这里还需要在创建一个 service,我这里默认使用 NodePort
$ cat >>vmware-exporter_svc.yaml<<EOF
apiVersion: v1
kind: Service
metadata:
name: vmware-exporter
namespace: abcdocker
spec:
selector:
app: vmware-exporter
type: NodePort
ports:
- protocol: TCP
port: 9272
targetPort: 9272
nodePort: 30009
EOF
接下来创建所有 yaml
$ kubectl apply -f .
deployment.apps/vmware-exporter created
configmap/vmware-exporter-config created
service/vmware-exporter created
查看对应的 pod、secret、configmap
$ kubectl get all -n abcdocker
NAME READY STATUS RESTARTS AGE
pod/vmware-exporter-9997f7d9d-42wkn 1/1 Running 0 7m34s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/vmware-exporter NodePort 10.104.225.76 <none> 9272:30009/TCP 3m8s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/vmware-exporter 1/1 1 1 7m34s
NAME DESIRED CURRENT READY AGE
replicaset.apps/vmware-exporter-9997f7d9d 1 1 1 7m34s
接下来我们测试一下 svc 的地址和 nodeport 都是否可以 curl 通
$ kubectl get svc -n abcdocker
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
vmware-exporter NodePort 10.104.225.76 <none> 9272:30009/TCP 3m45s
测试 nodeport
$ curl -s -q 192.168.31.10:30009/metrics|tail -n 1
vmware_host_net_usage_average{cluster_name="abcdocker",dc_name="Datacenter",host_name="192.168.31.100"} 8.0
页面访问测试
路由器端口转发
因为我是想在我云服务器上统一查看监控报警,家里的 esxi 和腾讯云服务器又不在一个内网,所以需要跨公网通信。企业环境中可能不需要做路由器端口转发,这个针对我家用的。如果是企业环境可以跳过
前提是要有公网 IP 哈,不然只能考虑用 FRP 的方式
进入路由器-->高级设置
点击端口转发
我们新创建一个规则即可
这里的 ip 和端口号就是我们部署 VMware_exporter 的节点
测试公网可以访问
Prometheus 添加监控项
vmware_exporter 安装完成只是第一步,我们需要在 Prometheus 中添加针对 VMware_exporter 信息的收集
修改 Prometheus 配置文件
$ cd /etc/prometheus/
$ vim prometheus.yml
#添加下面的配置
- job_name: 'vmware_vcenter'
metrics_path: '/metrics'
static_configs:
- targets:
- 'esxi.frps.cn'
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: dsm.frps.cn:9272
#targets 在Prometheus中显示的名称
#replacement VMware_exporter地址
#relabel_configs中配置了自动发现
Grafana 设置
Prometheus 中已经有数据了,接下来导入模板~ https://grafana.com/grafana/dashboards/11243
目前使用的是11243
模板,没有找到更好的,后续自己改一个
点击导入
需要选择数据源
效果图如下
AlertManager 告警配置
实际上 grafana 的效果图我们可能半年才上去看一次,主要的告警还是要通过 alert 直接触发
针对 VMware_exporter 我们需要添加 rule 规则,对 VMware_exporter 状态进行触发告警
添加 rule 文件
#注意格式,格式错误会让prometheus无法启动
$ vim /etc/prometheus/rules/vmware_exporter.yaml
groups:
- name: vmware status
rules:
- alert: HighNumberOfSnapshots #大量快照模板
expr: vmware_vm_snapshots > 5
for: 30m
labels:
severity: warning
annotations:
summary: High Number of Snapshots (instance {{ $labels.instance }})
description: "High snapshots number on {{ $labels.instance }}: {{ $value }}n Num = {{ $value }}n VMware_Name = {{ $labels.vm_name }}"
- alert: VirtualMachineMemoryWarning #虚拟机内存警告模板
expr: vmware_vm_mem_usage_average / 100 >= 80 and vmware_vm_mem_usage_average / 100 < 50
for: 30m
labels:
severity: warning
annotations:
summary: Virtual Machine Memory Warning (instance {{ $labels.instance }})
description: "High memory usage on {{ $labels.instance }}: {{ $value | printf "%.2f"}}%n VALUE = {{ $value }}n VMware_Name = {{ $labels.vm_name }}"
- alert: VirtualMachineMemoryCritical #虚拟机内存严重模板
expr: vmware_vm_mem_usage_average / 100 >= 90
for: 30m
labels:
severity: error
annotations:
summary: Virtual Machine Memory Critical (instance {{ $labels.instance }})
description: "High memory usage on {{ $labels.instance }}: {{ $value | printf "%.2f"}}%n VALUE = {{ $value }}n VMware_Name = {{ $labels.vm_name }}"
- alert: OutdatedSnapshots #过时的快照模板 (单位是舔)
expr: (time() - vmware_vm_snapshot_timestamp_seconds) / (60 * 60 * 24) >= 90
for: 30m
labels:
severity: warning
annotations:
summary: Outdated Snapshots (instance {{ $labels.instance }})
description: "Outdated snapshots on {{ $labels.instance }}: {{ $value | printf "%.0f"}} daysn VALUE = {{ $value }}n VMware_Name = {{ $labels.vm_name }}"
- alert: EsxiHostMemoryCritical #esxi内存使用百分比模板
expr: ((vmware_host_memory_usage / vmware_host_memory_max) * 100) > 50
for: 5m
labels:
severity: warning
annotations:
summary: Esxi Host Memory Warning (instance {{ $labels.instance }})
description: "Outdated Host Esxi Memory on {{ $labels.instance }}: {{ $value | printf "%.0f"}} %n VALUE = {{ $value }}n VMware_Name = {{ $labels.host_name }}"
- alert: EsxiHostCPUCritical #esxi cpu 百分比
expr: ((vmware_host_cpu_usage / vmware_host_cpu_max) * 100) > 50
for: 5m
labels:
severity: warning
annotations:
summary: Esxi Host CPU Warning (instance {{ $labels.instance }})
description: "Outdated Host Esxi CPU on {{ $labels.instance }}: {{ $value | printf "%.0f"}} %n VALUE = {{ $value }}n VMware_Name = {{ $labels.host_name }}"
这里我根据我自己的需求单独添加了 2 个,针对 esxi cpu 和内存的触发器报警。它的监控项比较多,大家可以根据自己的需求来添加告警。不一定要和我相同
添加完成后重启 prometheus 和 alert,我这里是 docker 我就直接重启镜像了
我这里使用微信报警,接下来我们看微信即可
温馨提示一下,可以把 prometheus 告警值设置低一点,来测试是否有问题,后面在修改回去
最终效果图
参考文档:https://github.com/pryorda/vmware_exporter