目前 grafana 通过流行模板 InfluxDB 使用数据源 Telegraf 收集数据。为了统一管理,我找了很久 prometheus 对接数据源 VMware_exporter
需求
个人家里买了一个 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运行的方式 $dockerrun-d-p9272:9272 -eVSPHERE_USER=administrator@192.168.31.200 -eVSPHERE_PASSWORD=密码 -eVSPHERE_HOST=主机 -eVSPHERE_IGNORE_SSL=True -eVSPHERE_SPECS_SIZE=2000 --namevmware_exporter pryorda/vmware_exporter #Linux直接运行 #需要安装python3.6我不会在这里演示 RequiresPython>=3.6 1.Installwith$pythonsetup.pyinstallorviapip$pipinstallvmware_exporter.Thedockercommandbelowispreferred. 2.Createconfig.ymlbasedontheconfigurationsection.Somevariablescanbepassedasenvironmentvariables 3.Run$vmware_exporter-c/path/to/your/config 4.Gotohttp://localhost:9272/metrics?vsphere_host=vcenter.company.comtoseemetrics
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 状态进行触发告警
#注意格式,格式错误会让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 }}"
添加完成后重启 prometheus 和 alert,我这里是 docker 我就直接重启镜像了
我这里使用微信报警,接下来我们看微信即可
温馨提示一下,可以把 prometheus 告警值设置低一点,来测试是否有问题,后面在修改回去
最终效果图
参考文档:https://github.com/pryorda/vmware_exporter
原文链接:
点击下方图片即可阅读
会玩,使用 init 进程运行 Container点击 "阅读原文" 获取