家里的软路由是跑在一台Dell的小机器(Optiplex 5050)上,使用Proxmox做的虚拟化,跑的Openwrt。前不久发现家里有时候网络会很卡顿,后来在Proxmox上看监控发现openwrt虚拟机在这个时间段内,CPU跑到了100%,难怪会非常卡。

我还有一台Dell的小机器(Optiplex 5080),也是Proxmox的虚拟化,两台Dell加起来一共有5个虚拟机,是时候上个监控了。

社区对于Proxmox的监控一般有 +Prometheus 和 +influxdb 两种方式,我这里采用的是 +Prometheus。

prometheus-pve-exporter

和Node exporter一样,也需要一个 Proxmox exporter,可以用prometheus-pve-exporter项目。prometheus-pve-exporter调用Proxmox的API采集指标,然后Prometheus再从 prometheus-pve-exporter 抓取metrics数据,最后通过Grafana展示。

prometheus-pve-exporter的配置可以使用配置文件,也可以使用环境变量。我这里传入了 PVE_USER/PVE_PASSWORD/PVE_VERIFY_SSL,用来调用Proxmox API时进行认证。由于是监控请求,因此建议在Proxmox上新建一个只读的用户,不要使用root。Proxmox新建用户很简单,在页面上操作即可,但给用户授权只能通过命令行进行。

如下,给用户 monitor@pve授予PVEAuditor权限。

pveum aclmod / -user monitor@pve -role PVEAuditor

注意,PVE_USER的格式是user@pve或者user@pam,两者的区别是,pve是proxmox的用户,比如我这里是2台Proxmox组成的集群,建立一个pve用户就可以访问2台Proxmox机器;pam是linux的用户,不同的Proxmox机器的用户名密码可能不同(Proxmox实际也是一台Linux机器)。

PVE_VERIFY_SSL需要设置为false,因为是自签的证书。

prometheus-pve-exporter可以直接启动,也可以容器化启动。因为后面要使用Prometheus来监控,所以我将prometheus-pve-exporter部署到了kubernetes上去,并创建了一个svc。Deployment的写法类似于:

docker run --name prometheus-pve-exporter -d -p 127.0.0.1:9221:9221 -v /path/to/pve.yml:/etc/pve.yml prompve/prometheus-pve-exporter

创建的svc:

apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: pve-exporter
  name: pve-exporter
  namespace: default
spec:
  ports:
  - name: pve-exporter-0
    port: 9221
    protocol: TCP
    targetPort: 9221
  selector:
    app: pvc-exporter-5050
  type: LoadBalancer

prometheus-pve-exporter启动后,可以通过http请求metrics:

http://{service loadbalancer ip}:9221/pve?target=1.2.3.4

一个prometheus-pve-exporter可以请求多个Proxmox(target)。

Prometheus

我这里使用的是Prometheus Operator,因此只要配置ServiceMonitor即可。endpoints配置2台Proxmox。

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    k8s-app: pve-exporter
  name: pve-exporter
spec:
  endpoints:
  - interval: 30s
    params:
      target:
      - 1.1.1.1
    path: /pve
    port: pve-exporter-0
    scheme: http
  - interval: 30s
    params:
      target:
      - 1.1.1.2
    path: /pve
    port: pve-exporter-0
    scheme: http
  jobLabel: k8s-app
  namespaceSelector:
    matchNames:
    - default
  selector:
    matchLabels:
      k8s-app: pve-exporter

注意namespaceSelectorselector.matchLabels和上面创建的pve-exporter要匹配起来。

ServiceMonitor创建后,Prometheus Operator会自动刷新Prometheus配置,之后在Prometheus上可以查看pve的监控信息(例如pve_up)。

Grafana

Proxmox数据收集到Prometheus后,就可以通过Grafana展示了。这里我使用的是Proxmox via Prometheus by Pietro Saccardi

至此,就可以比较方便的统一展示所有Proxmox虚拟机的状态了。