4. 环境准备:Prometheus Stack 部署、Alertmanager 配置、Webhook 接收器搭建
本章是《Runbook 模板化:快速生成 Prometheus 自愈剧本》课程的实践起点。在编写任何自愈剧本之前,必须搭建一套完整可用的监控告警基础设施。本节将引导你完成 Prometheus Stack 的部署、Alertmanager 的规则配置,以及一个用于接收告警并触发自愈流程的 Webhook 接收器。
4.1 整体架构概览
下图展示了自愈剧本运行所需的核心组件及其数据流关系。Prometheus 负责采集指标与评估告警规则,Alertmanager 负责告警去重、分组与路由,Webhook 接收器则是连接监控系统与自愈执行引擎的桥梁。
4.2 Prometheus Stack 部署
推荐使用 kube-prometheus-stack(Helm Chart)进行一键部署,它集成了 Prometheus、Alertmanager、Grafana 及多种默认告警规则。以下为生产环境常用配置要点。
4.2.1 Helm 部署命令
# 添加 Helm 仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
# 创建命名空间
kubectl create namespace monitoring
# 安装 kube-prometheus-stack
helm install prometheus-stack prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--set alertmanager.enabled=true \
--set prometheus.prometheusSpec.ruleSelectorNilUsesHelmValues=false \
--set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false
4.2.2 核心组件清单
| 组件 | 默认副本数 | 关键配置项 | 说明 |
|---|---|---|---|
| Prometheus | 2 | retention: 15d, resources.requests.memory: 2Gi | 指标存储与告警评估 |
| Alertmanager | 3 | configSecret: alertmanager-config, cluster.peer: 自动 | 告警路由与高可用 |
| Grafana | 1 | adminPassword: prom-operator, datasources: Prometheus | 可视化仪表盘 |
| Prometheus Operator | 1 | manageCRDs: true | 管理 Prometheus/Alertmanager 实例 |
生产建议: 如果集群规模较大(>100 节点),建议将 Prometheus 的
storage.tsdb.retention.time 调整为 7d,并启用 --storage.tsdb.retention.size 限制存储大小,避免磁盘写满。
4.3 Alertmanager 配置
Alertmanager 的核心配置包含在 alertmanager-config Secret 中。我们需要配置一个 Webhook 接收器,将告警转发给自愈剧本的触发端点。
4.3.1 配置结构
# alertmanager.yaml 核心配置
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.example.com:587'
smtp_from: 'alertmanager@example.com'
route:
receiver: 'default-receiver'
group_wait: 10s
group_interval: 2m
repeat_interval: 4h
routes:
- match:
severity: 'critical'
receiver: 'webhook-selfheal'
repeat_interval: 10m
receivers:
- name: 'default-receiver'
email_configs:
- to: 'ops@example.com'
- name: 'webhook-selfheal'
webhook_configs:
- url: 'http://selfheal-webhook.monitoring.svc.cluster.local:8080/alert'
send_resolved: true
4.3.2 关键参数说明
| 参数 | 推荐值 | 作用 |
|---|---|---|
| group_wait | 10s ~ 30s | 等待同类告警聚合的时间,避免告警风暴 |
| group_interval | 2m ~ 5m | 发送新告警组的最小间隔 |
| repeat_interval | 4h(普通) / 10m(critical) | 重复告警的发送间隔,自愈场景建议缩短 |
| send_resolved | true | 发送恢复通知,自愈剧本据此判断是否执行回滚 |
注意: 自愈剧本依赖
send_resolved: true 来感知故障恢复。如果未配置,剧本无法判断是否需要执行回滚操作,可能导致重复执行修复动作。
4.4 Webhook 接收器搭建
Webhook 接收器是一个轻量级 HTTP 服务,负责接收 Alertmanager 的告警推送,解析告警内容,并触发对应的自愈剧本。我们使用 Python + Flask 快速搭建。
4.4.1 接收器代码示例
# webhook_receiver.py
from flask import Flask, request, jsonify
import json
import subprocess
import logging
app = Flask(__name__)
logging.basicConfig(level=logging.INFO)
SELFHEAL_PLAYBOOKS = {
"HighCpuUsage": "/opt/playbooks/cpu_selfheal.sh",
"HighMemoryUsage": "/opt/playbooks/memory_selfheal.sh",
"DiskFull": "/opt/playbooks/disk_selfheal.sh",
}
@app.route('/alert', methods=['POST'])
def handle_alert():
alert_data = request.json
app.logger.info(f"Received alert: {json.dumps(alert_data, indent=2)}")
for alert in alert_data.get('alerts', []):
alert_name = alert.get('labels', {}).get('alertname')
status = alert.get('status') # firing / resolved
if alert_name in SELFHEAL_PLAYBOOKS and status == 'firing':
playbook_path = SELFHEAL_PLAYBOOKS[alert_name]
instance = alert.get('labels', {}).get('instance', 'unknown')
app.logger.info(f"Triggering selfheal for {alert_name} on {instance}")
# 异步执行剧本,避免阻塞告警确认
subprocess.Popen([playbook_path, instance])
return jsonify({"status": "received"}), 200
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)
4.4.2 部署为 Kubernetes Service
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: selfheal-webhook
namespace: monitoring
spec:
replicas: 2
selector:
matchLabels:
app: selfheal-webhook
template:
metadata:
labels:
app: selfheal-webhook
spec:
containers:
- name: webhook
image: python:3.9-slim
command: ["python", "/app/webhook_receiver.py"]
ports:
- containerPort: 8080
volumeMounts:
- name: playbooks
mountPath: /opt/playbooks
- name: code
mountPath: /app
volumes:
- name: playbooks
configMap:
name: selfheal-playbooks
- name: code
configMap:
name: webhook-code
---
apiVersion: v1
kind: Service
metadata:
name: selfheal-webhook
namespace: monitoring
spec:
selector:
app: selfheal-webhook
ports:
- port: 8080
targetPort: 8080
4.5 验证与测试
部署完成后,按以下步骤验证链路是否通畅:
- 检查 Pod 状态:
kubectl get pods -n monitoring | grep -E 'prometheus|alertmanager|selfheal' - 触发测试告警: 使用
amtool或直接调用 Alertmanager API 发送测试告警。 - 查看 Webhook 日志:
kubectl logs -n monitoring -l app=selfheal-webhook --tail=50 - 确认剧本执行: 检查自愈剧本的输出日志或执行结果。
测试命令示例:
如果 Webhook 日志中出现
curl -X POST http://localhost:9093/api/v1/alerts -d '[{"labels":{"alertname":"HighCpuUsage","instance":"node-01","severity":"critical"}}]'如果 Webhook 日志中出现
Triggering selfheal for HighCpuUsage on node-01,则链路验证成功。
4.6 环境就绪清单
在进入下一章之前,请确认以下项目全部完成:
| 检查项 | 状态 | 备注 |
|---|---|---|
| Prometheus Stack 部署完成 | ☐ | 确认 Prometheus、Alertmanager、Grafana Pod 均 Running |
| Alertmanager Webhook 路由配置 | ☐ | 确认 alertmanager-config 中包含 webhook 接收器 |
| Webhook 接收器服务运行 | ☐ | 确认 selfheal-webhook Service 可正常接收 POST 请求 |
| 测试告警链路 | ☐ | 确认告警从 Prometheus → Alertmanager → Webhook 完整流转 |
环境准备就绪后,我们将进入第 5 章,学习如何设计标准化的自愈剧本模板结构。