资讯详情

VMware ESXI 被挖矿了,赶紧上个云原生监控

c013296325dde8643b02df73736750de.gif

目前 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

点击 "阅读原文" 获取

标签: hdw306微型拉压传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台