Prometheus 监控VMware_ESXI并配置AlertManager告警

目前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获取的资源监控,所以我们需要安装一下vcenterPrometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
配置Vcenter安装在哪台ESXI节点上,我这里只有一台,我就写一台了

  • ESXI 节点
  • ESXI 端口号(默认443)
  • ESXI用户名
  • ESXI密码
  • Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    这里提示我们证书不安全,直接忽略就可以Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    设置vcenter在esxi中的名字,并为vcenter配置root密码Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    这里需要根据虚拟机的数量安装给vcenter对应的配置,我这里就选择Tiny最小的一个即可,家用esxi一般不超过30个VMwarePrometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    这里需要设置vcenter存储位置,我就随便选择一个了Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    这一步是检查我们前两步添加的配置

    没有内部DNS请在FQDN写IP

    Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    接下来等待就可以了Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    接下来配置Vcenter
    Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    是否开启SSH,以及时间同步,此处默认Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    配置SSO域

    域没有内网DNS写IP

    Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    等待结束即可Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    登录vcenter

    访问地址:https://192.168.31.200:5480/#/login

    Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    用户名为administrator@vcenter ip,密码就是我们设置的密码
    添加完esxi节点后显示如下
    1645308329808.png

    三、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_SIZE5000查询统计功能的规格列表大小
    VSPHERE_IGNORE_SSLFalse忽略与 vsphere 主机的连接上的 ssl 证书
    VSPHERE_FETCH_CUSTOM_ATTRIBUTESFalse设置为 true 以收集对象自定义属性作为度量标签
    VSPHERE_FETCH_TAGSFalse设置为 true 以收集对象标签作为度量标签
    VSPHERE_FETCH_ALARMSFalse获取对象触发警报,并且在主机 hdw 警报的情况下也是如此
    VSPHERE_COLLECT_HOSTSTrue设置为 false 以禁用主机指标收集
    VSPHERE_COLLECT_DATASTORESTrue设置为 false 以禁用数据存储指标的收集
    VSPHERE_COLLECT_VMSTrue设置为 false 以禁用收集虚拟机指标
    VSPHERE_COLLECT_VMGUESTSTrue设置为 false 以禁用虚拟机来宾指标的收集
    VSPHERE_COLLECT_SNAPSHOTSTrue设置为 false 以禁用快照指标的收集

    访问测试http://192.168.31.10:9272/metrics 访问docker主机的9272端口,也可以自己定义。
    1645338130298.png

    四、群晖Docker 运行VMware_exporter

    很多情况下我们家里可能只有群晖,没有Linux相关服务,又不想进入群晖执行shell命令,那么就可以通过控制面板的Docker工具来直接进行配置及管理
    打开Docker搜索VMware_exporterPrometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    选中镜像,安装Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    点击高级设置
    Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    勾选启动自动重启容器Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    网络默认即可Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    设置docker端口号
    Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    接下来是配置环境变量,步骤就是上面的方法
    Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    没有问题,我们点击启动
    Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    可以点到VMware_exporter容器查看一下状态
    Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    同样我们访问群晖的http://ip:9272/metrics 就可以看到值了1645350713558.png

    五、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

    页面访问测试1645353360676.png

    六、路由器端口转发

    因为我是想在我云服务器上统一查看监控报警,家里的esxi和腾讯云服务器又不在一个内网,所以需要跨公网通信。企业环境中可能不需要做路由器端口转发,这个针对我家用的。如果是企业环境可以跳过

    前提是要有公网IP哈,不然只能考虑用FRP的方式

    进入路由器-->高级设置Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    点击端口转发
    Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    我们新创建一个规则即可

    这里的ip和端口号就是我们部署VMware_exporter的节点

    Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    测试公网可以访问
    1645353730561.png

    七、Prometheus 添加监控项

    vmware_exporter安装完成只是第一步,我们需要在Prometheus中添加针对VMware_exporter信息的收集
    本次案例文章基于

    Prometheus 监控MySQL数据库

    新闻联播老司机

  • 20年6月9日
  • 喜欢:0
  • 浏览:4k
  • 修改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中配置了自动发现

    1645354461451.png

    八、Grafana设置

    Prometheus中已经有数据了,接下来导入模板~https://grafana.com/grafana/dashboards/11243
    目前使用的是11243模板,没有找到更好的,后续自己改一个
    Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    点击导入
    Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    需要选择数据源
    Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    效果图如下Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    1645358009089.png

    九、AlertManager 告警配置

    alertmanager基于下方文章搭建

    AlertManager 微信告警配置

    新闻联播老司机

  • 22年2月14日
  • 喜欢:2
  • 浏览:2.3k
  • 实际上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 监控VMware_ESXI并配置AlertManager告警-每日运维
    我这里使用微信报警,接下来我们看微信即可Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    温馨提示一下,可以把prometheus告警值设置低一点,来测试是否有问题,后面在修改回去
    最终效果图Prometheus 监控VMware_ESXI并配置AlertManager告警-每日运维
    参考文档:https://github.com/pryorda/vmware_exporter

    相关文章:

    1. Kubernetes 1.14 二进制集群安装
    2. CentOS 7 ETCD集群配置大全
    3. Prometheus监控Kubernetes 集群节点及应用
    4. Kuerbernetes 1.11 集群二进制安装