1. 为什么需要主动拨测监控?
指标监控回答的是服务内部视角的问题——进程活着吗、资源够吗、延迟高吗。但用户能不能访问到服务,是外部视角的问题,中间隔着 DNS、防火墙、负载均衡、证书过期、证书链错误、后端假死(进程活着但不响应)。
拨测(主动探测)就是模拟用户的视角:从一台独立的机器上,定时向服务发起真实的 HTTP 请求/TCP 连接/Ping,问一个问题——"现在,这个服务能访问吗?"
指标监控和拨测监控各自只能看到一半真相:
/ / /
2. Uptime Kuma 是什么?
一个开源自托管的拨测监控系统,GitHub 60k+ star,单容器即可跑起来。
- -
项目:https://github.com/louislam/uptime-kuma - -
技术栈:Node.js + Vue.js + SQLite + Socket.IO - -
默认端口:3001
核心能力四件套:
- [01]多协议探测
:HTTP(s)、TCP/Ping、ICMP、DNS、Keyword(页面内容)、Push(被动心跳)等 90+ 监控类型 - [02]告警通知
:状态翻转时推送到飞书/企业微信/Telegram/Slack/邮件/Webhook 等 90+ 渠道 - [03]状态页
:对外公开展示服务可用性,类似 GitHub Status - [04]维护窗口
:计划内维护期间静默告警,且有审计记录
:零依赖单实例部署,被监控方完全无改造。
/ / /
3. Uptime Kuma 与 Prometheus/夜莺的区别
一句话定位:Kuma 回答"通不通",Prometheus/夜莺回答"健不健康"。
选型结论:拨测用 Kuma,性能容量趋势用夜莺/Prometheus。两者数据打通的场景:Kuma 的心跳数据可通过 API 导出,接入夜莺做统一告警面板。
/ / /
4. Uptime Kuma 核心架构
记住"SQLite 单写者"这一条,K8s 上所有部署决策(单副本、Recreate、local PV)都是从它推出来的。
/ / /
5. 部署实践(K8s)
四个资源:PV + PVC + Deployment + Service(NodePort)。
apiVersion: apps/v1kind: Deploymentspec: replicas: 1 # 生死线1:永远单副本 strategy: type: Recreate # 生死线2:禁 RollingUpdate,防双实例并发写库 template: spec: nodeSelector: kubernetes.io/hostname: cve2183-w1 # 生死线3:钉在 PV 节点 containers: - name: uptime-kuma image: louislam/uptime-kuma:1 volumeMounts: - name: data mountPath: /app/data # kuma.db 所在 volumes: - name: data persistentVolumeClaim: claimName: uptime-kuma-data部署检查清单:
- -
PV 用 local path(节点 /data/uptime-kuma),禁 NFS/RWX——SQLite 文件锁在 NFS 上不可靠 -无 StorageClass 的集群:PV 和 PVC 用同名 storageClassName 手动绑定
- -
健康探针 httpGet :3001/,资源 100-500m CPU / 128-512Mi - -
关键运行参数:
/ / /
6. 通知告警配置
触发逻辑:心跳 DOWN → 连续失败超过 maxretries → 触发通知;恢复 UP 再发一条恢复通知。状态翻转记为 important heartbeat(= 告警历史,可 API 查询)。
渠道配置(以飞书为例):
- [01]
飞书群 → 设置 → 群机器人 → 添加自定义机器人 → 拿 Webhook URL - [02]
Kuma → Settings → Notifications → 新建 Feishu/Lark → 填 URL → Test on")

/ / /
7. Status Page 设计
对外展示服务可用性的公开页面,访问 http://<host>/status/<slug>。
核心概念:
- -slug
:URL 路径标识,只允许小写字母数字连字符 - -Group 分组
:按业务域分组(如"公网服务"/"内部依赖"),避免一屏堆几十个监控项 - -Incident 故障公告
:出现故障时挂公告(时间线 + 说明),用户看到"已知故障,修复中"而不是一片红 

- -theme/auto
:自动深浅色,可配 customCSS
API 创建(实测参数顺序坑):
设计建议:状态页只放用户关心的入口服务(网站/API 网关),不放内部中间件细节;每个入口服务配三层探测(HTTP 状态码 + Keyword 内容 + 依赖 TCP)。
/ / /
夜雨聆风