如何基于Prometheus告警触发Pod运行 适配磁盘压力阈值场景
基于Prometheus告警触发Pod运行的实现方案
Prometheus本身不直接支持操作Kubernetes资源,你需要通过告警链路对接可调用K8s API的组件完成Pod触发,主流可落地的方案有两种:
方案1:自定义Webhook服务(灵活性最高,适配定制化业务逻辑)
- 第一步:配置Alertmanager路由,将目标告警(比如你配置的内存压力告警、后续要加的磁盘压力告警)转发到指定的Webhook服务,示例配置参考:
route: group_by: ['alertname'] routes: - match: alertname: node_memory_MemAvailable_percent_alert receiver: 'pod-trigger-webhook' receivers: - name: 'pod-trigger-webhook' webhook_configs: - url: 'http://<webhook服务的集群内地址/服务名>:<端口>/alert'
- 第二步:开发轻量Webhook服务(Python/Go等语言均可,几十行代码即可实现),给服务绑定拥有Pod/Job创建权限的ServiceAccount,服务接收到Alertmanager发来的告警请求后,调用Kubernetes API创建你提前定义好的业务Pod。可以在服务里加幂等校验逻辑,避免同一个告警重复触发Pod创建。
方案2:基于KEDA ScaledJob(无需自研代码,适合标准场景)
- 先在集群中安装KEDA组件,之后创建
ScaledJob资源,配置Prometheus触发器关联你的阈值规则,当指标达到阈值时KEDA会自动创建Job运行目标Pod,示例配置参考:
apiVersion: keda.sh/v1alpha1 kind: ScaledJob metadata: name: resource-pressure-handle-job spec: jobTargetRef: template: spec: containers: - name: business-handler image: <你的业务镜像地址> command: ["<业务执行脚本路径>"] restartPolicy: Never pollingInterval: 30 successfulJobsHistoryLimit: 2 failedJobsHistoryLimit: 2 triggers: - type: prometheus metadata: serverAddress: http://<Prometheus集群内地址>:9090 metricName: node_memory_usage_percent threshold: '80' query: | 100 - ((node_memory_MemAvailable_bytes{job="node-exporter"} * 100) / node_memory_MemTotal_bytes{job="node-exporter"})
注意事项
- 如果你需要触发的Pod要在告警对应的故障节点上执行,可以在创建Pod时通过
nodeSelector或者nodeName字段,读取告警携带的instance标签对应节点名,指定Pod调度到目标节点 - 你当前提供的告警规则是内存使用率阈值,如需适配磁盘压力场景,替换对应PromQL为磁盘使用率的表达式即可
- 可以给触发的Pod/Job配置TTL自动清理规则,避免集群残留过多已完成的任务资源
内容的提问来源于stack exchange,提问作者Rajendar Talatam
相关产品推荐
相关产品推荐

