4. 环境准备:Prometheus Stack 部署、Alertmanager 配置、Webhook 接收器搭建

本章是《Runbook 模板化:快速生成 Prometheus 自愈剧本》课程的实践起点。在编写任何自愈剧本之前,必须搭建一套完整可用的监控告警基础设施。本节将引导你完成 Prometheus Stack 的部署、Alertmanager 的规则配置,以及一个用于接收告警并触发自愈流程的 Webhook 接收器。

4.1 整体架构概览

下图展示了自愈剧本运行所需的核心组件及其数据流关系。Prometheus 负责采集指标与评估告警规则,Alertmanager 负责告警去重、分组与路由,Webhook 接收器则是连接监控系统与自愈执行引擎的桥梁。

自愈剧本基础设施架构 被监控目标 (Node / App / K8s) Prometheus Server (指标采集 + 告警评估) Alertmanager (告警路由 / 抑制 / 静默) Webhook 接收器 (自愈剧本触发器) 自愈执行引擎 (Ansible / Shell / K8s Job) 说明: 自愈剧本的核心链路:Prometheus 评估告警 → Alertmanager 路由 → Webhook 接收器 → 自愈执行引擎。 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 验证与测试

部署完成后,按以下步骤验证链路是否通畅:

  1. 检查 Pod 状态: kubectl get pods -n monitoring | grep -E 'prometheus|alertmanager|selfheal'
  2. 触发测试告警: 使用 amtool 或直接调用 Alertmanager API 发送测试告警。
  3. 查看 Webhook 日志: kubectl logs -n monitoring -l app=selfheal-webhook --tail=50
  4. 确认剧本执行: 检查自愈剧本的输出日志或执行结果。
测试命令示例:
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 章,学习如何设计标准化的自愈剧本模板结构。