家里的软路由是跑在一台Dell的小机器(Optiplex 5050)上,使用Proxmox做的虚拟化,跑的Openwrt。前不久发现家里有时候网络会很卡顿,后来在Proxmox上看监控发现openwrt虚拟机在这个时间段内,CPU跑到了100%,难怪会非常卡。
我还有一台Dell的小机器(Optiplex 5080),也是Proxmox的虚拟化,两台Dell加起来一共有5个虚拟机,是时候上个监控了。
社区对于Proxmox的监控一般有 +Prometheus 和 +influxdb 两种方式,我这里采用的是 +Prometheus。
和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 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
注意namespaceSelector
和selector.matchLabels
和上面创建的pve-exporter
要匹配起来。
ServiceMonitor创建后,Prometheus Operator会自动刷新Prometheus配置,之后在Prometheus上可以查看pve的监控信息(例如pve_up)。
Proxmox数据收集到Prometheus后,就可以通过Grafana展示了。这里我使用的是Proxmox via Prometheus by Pietro Saccardi。
至此,就可以比较方便的统一展示所有Proxmox虚拟机的状态了。