Prometheus 监控VMware_ESXI并配置AlertManager告警

2023年 5月 4日 74.3k 0

目前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获取的资源监控,所以我们需要安装一下vcenter1645276657924.png
1645276715238.png
1645276733054.png
1645276749783.png
配置Vcenter安装在哪台ESXI节点上,我这里只有一台,我就写一台了

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

    没有内部DNS请在FQDN写IP

    1645308180155.png
    接下来等待就可以了1645277343296.png
    接下来配置Vcenter
    20220219_224433.png
    是否开启SSH,以及时间同步,此处默认1645281900801.png
    配置SSO域

    域没有内网DNS写IP

    1645308267731.png
    等待结束即可1645282018225.png
    登录vcenter

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

    1645289610090.png
    用户名为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_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端口,也可以自己定义。
    1645338130298.png

    四、群晖Docker 运行VMware_exporter

    很多情况下我们家里可能只有群晖,没有Linux相关服务,又不想进入群晖执行shell命令,那么就可以通过控制面板的Docker工具来直接进行配置及管理
    打开Docker搜索VMware_exporter1645350015765.png
    选中镜像,安装1645350066754.png
    点击高级设置
    1645350101446.png
    勾选启动自动重启容器1645350125905.png
    网络默认即可1645350533701.png
    设置docker端口号
    1645350204692.png
    接下来是配置环境变量,步骤就是上面的方法
    1645350658250.png
    没有问题,我们点击启动
    1645350354600.png
    可以点到VMware_exporter容器查看一下状态
    1645350386588.png
    同样我们访问群晖的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的方式

    进入路由器-->高级设置1645353430849.png
    点击端口转发
    1645353497264.png
    我们新创建一个规则即可

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

    1645353569669.png
    测试公网可以访问
    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模板,没有找到更好的,后续自己改一个
    1645357846248.png
    点击导入
    1645357888781.png
    需要选择数据源
    1645357933735.png
    效果图如下1645357968395.png
    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我就直接重启镜像了1645372466307.png
    我这里使用微信报警,接下来我们看微信即可1645372586307.png
    温馨提示一下,可以把prometheus告警值设置低一点,来测试是否有问题,后面在修改回去
    最终效果图1645373532725.png
    参考文档:https://github.com/pryorda/vmware_exporter

    相关文章:

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

    相关文章

    KubeSphere 部署向量数据库 Milvus 实战指南
    探索 Kubernetes 持久化存储之 Longhorn 初窥门径
    征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
    那些年在 Terraform 上吃到的糖和踩过的坑
    无需 Kubernetes 测试 Kubernetes 网络实现
    Kubernetes v1.31 中的移除和主要变更

    发布评论