目前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节点上,我这里只有一台,我就写一台了
这里提示我们证书不安全,直接忽略就可以
设置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
[root@k8s-01 vmware-exporter]# kubectl apply -f . deployment.apps/vmware-exporter created configmap/vmware-exporter-config created service/vmware-exporter created
查看对应的pod、secret、configmap
[root@k8s-01 vmware-exporter]# 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通
[root@k8s-01 vmware-exporter]# 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
[root@k8s-01 vmware-exporter]# 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 监控MySQL数据库
新闻联播老司机
修改Prometheus配置文件
[root@prometheus ~]# cd /etc/prometheus/ [root@prometheus 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 告警配置
alertmanager基于下方文章搭建
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
相关文章:
- Kubernetes 1.14 二进制集群安装
- CentOS 7 ETCD集群配置大全
- Prometheus监控Kubernetes 集群节点及应用
- Kuerbernetes 1.11 集群二进制安装