如何在Kubernetes中基于Prometheus Community Helm Chart自动生成持久化卷使用率告警规则?
问题:如何自动生成Kubernetes PV使用率的Prometheus告警规则?
我已经通过Prometheus Community Helm Chart在Kubernetes中部署了Prometheus实例,目前实现了当持久化卷(Persistent Volume)使用率达到70%时,通过Slack发送告警通知。这个功能是在Helm Chart的values文件中添加告警规则实现的,相关配置示例如下:
additionalPrometheusRulesMap: rule-name: groups: - name: storage rules: - alert: grafanaStorageAt70% expr: ( sum(kubelet_volume_stats_capacity_bytes{job="kubelet", namespace="kube-logging", persistentvolumeclaim="prom-grafana"}) - sum(kubelet_volume_stats_available_bytes{job="kubelet", namespace="kube-logging", persistentvolumeclaim="prom-grafana"})) / sum(kubelet_volume_stats_capacity_bytes{job="kubelet", namespace="kube-logging", persistentvolumeclaim="prom-grafana"}) > 0.7 for: 15m labels: severity: warning annotations: summary: The Storage of Grafana is 70% full. Maybe increase the storage size? - alert: lokiStorageAt70% expr: ( sum(kubelet_volume_stats_capacity_bytes{job="kubelet", namespace="kube-logging", persistentvolumeclaim="storage-loki-0"}) - sum(kubelet_volume_stats_available_bytes{job="kubelet", namespace="kube-logging", persistentvolumeclaim="storage-loki-0"})) / sum(kubelet_volume_stats_capacity_bytes{job="kubelet", namespace="kube-logging", persistentvolumeclaim="storage-loki-0"})> 0.7 for: 15m labels: severity: warning annotations: summary: The Storage of Loki is 70% full. Maybe increase the storage size?
当前方案运行正常,但有个痛点:每新增一个持久化卷,我都得手动添加一条对应的告警规则。想请教有没有更高效的方式,能自动生成这类告警规则(或者通过变量定义通用规则)?
回答
当然有!你可以利用Prometheus的向量运算和标签变量来写一条通用的告警规则,这样不管新增多少PV,都不需要手动修改规则。核心思路是去掉persistentvolumeclaim的固定值,让Prometheus自动遍历所有符合条件的PVC,然后基于每个PVC的指标计算使用率并触发告警。
下面是修改后的通用告警规则,直接替换你values文件里的rules部分即可:
additionalPrometheusRulesMap: rule-name: groups: - name: storage rules: - alert: PersistentVolumeUsageAt70% # 去掉固定PVC筛选,让Prometheus自动处理所有符合条件的PVC指标 expr: (kubelet_volume_stats_capacity_bytes{job="kubelet", namespace="kube-logging"} - kubelet_volume_stats_available_bytes{job="kubelet", namespace="kube-logging"}) / kubelet_volume_stats_capacity_bytes{job="kubelet", namespace="kube-logging"} > 0.7 for: 15m labels: severity: warning annotations: # 用标签变量动态生成告警内容 summary: "Storage of PVC {{ $labels.persistentvolumeclaim }} is 70% full" description: "PVC {{ $labels.persistentvolumeclaim }} in namespace {{ $labels.namespace }} has reached 70% usage. Current usage: {{ $value | humanizePercentage }}. Consider increasing storage size."
关键细节说明:
- 移除硬编码PVC筛选:原来的规则里固定了
persistentvolumeclaim的值,现在去掉后,Prometheus会自动遍历kube-logging命名空间下的所有PVC指标。 - 保留维度计算:不需要用
sum()聚合(除非你有同PVC的多副本指标需要合并),直接用原始指标运算,Prometheus会自动按persistentvolumeclaim、namespace等标签维度分别计算每个PVC的使用率。 - 动态告警内容:通过
{{ $labels.persistentvolumeclaim }}和{{ $labels.namespace }}可以自动插入PVC和命名空间名称,{{ $value | humanizePercentage }}还能把数值转换成易读的百分比格式,让告警信息更直观。
进阶优化(可选):
- 如果想监控所有命名空间的PVC,直接去掉
namespace="kube-logging"的筛选条件即可。 - 可以添加存储类筛选,只监控特定类型的PVC:
storageclass="your-storage-class"。 - 若有不需要监控的PVC,用
!=排除:persistentvolumeclaim!="exclude-this-pvc"。
这样以后新增PVC时,只要符合规则的标签筛选条件,就会自动被纳入监控,完全不用手动修改告警规则啦!
内容的提问来源于stack exchange,提问作者Manuel
相关产品推荐
相关产品推荐

