- docs/reference/ALERT-TAXONOMY-CATALOG.md:16大類、56筆alertname、24條Rule優先順序表 - docs/ai/AI-MODEL-CARDS.md:7個AI模型治理卡(deepseek/qwen/gemini/claude/nemotron)+fallback順序 - docs/templates/POSTMORTEM-TEMPLATE.md:對齊report_generation_service,[AUTO]欄位已標記 - docs/operations/ON-CALL-HANDBOOK.md:P0/P1 SOP、Kill Switch、SLO應對、常用指令速查 建立: 2026-04-14 台北時間 Claude Sonnet 4.6(戰術B Phase 1 完整收尾) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
430 lines
12 KiB
Markdown
430 lines
12 KiB
Markdown
# AWOOOI On-Call 值班手冊(On-Call Handbook)
|
||
|
||
> **文件類型**: 值班操作手冊
|
||
> **版本**: v1.0
|
||
> **建立日期**: 2026-04-14(台北時間)
|
||
> **建立者**: Claude Sonnet 4.6(首席架構師)
|
||
> **適用對象**: 統帥(首席)+ 未來 SRE 成員
|
||
> **相依文件**: `HUMAN-IN-THE-LOOP.md`、`SLO-SLI-DEFINITION.md`、`ALERT-TAXONOMY-CATALOG.md`
|
||
|
||
---
|
||
|
||
## 0. 哲學:你是機長,AI 是副駕駛
|
||
|
||
> **AI 永遠可以被覆蓋,你永遠是最後決策者。**
|
||
|
||
AWOOOI AIOps 系統設計為:
|
||
- **日常 P2/P3 告警** → AI 自動處理,你只需監控 Telegram 通知
|
||
- **P0/P1 高風險告警** → AI 分析後送審,你做最終決定
|
||
- **系統失控時** → Kill Switch 一鍵凍結所有自動操作
|
||
|
||
**值班的目標不是盯著告警,而是確保飛輪轉得順。**
|
||
|
||
---
|
||
|
||
## 1. 值班前準備(Shift Start Checklist)
|
||
|
||
每天(建議 08:00 台北時間)執行:
|
||
|
||
```bash
|
||
# 1. 確認系統健康
|
||
curl -s http://192.168.0.188:8000/health | python3 -m json.tool
|
||
|
||
# 2. 確認 Alertmanager 正常
|
||
curl -s http://192.168.0.110:9093/api/v1/status
|
||
|
||
# 3. 確認昨日 SLO 數字
|
||
curl -s http://192.168.0.188:8000/api/v1/slo/dashboard
|
||
|
||
# 4. 確認 AI 模型可用
|
||
curl -s http://192.168.0.111:11434/api/tags | python3 -c "import json,sys; [print(m['name']) for m in json.load(sys.stdin)['models']]"
|
||
|
||
# 5. 看 Telegram #awoooi-alerts 頻道最近 12 小時的告警
|
||
```
|
||
|
||
**每日晨報**: AIOps 系統於 08:00 台北時間自動發送前 24 小時摘要至 Telegram
|
||
|
||
---
|
||
|
||
## 2. 告警分級處理矩陣
|
||
|
||
### 告警嚴重度 → 處理方式
|
||
|
||
| 嚴重度 | P0 (CRITICAL) | P1 (HIGH) | P2 (MEDIUM) | P3 (LOW) |
|
||
|--------|--------------|-----------|-------------|----------|
|
||
| **AI 處理** | 分析 + 送審 | 分析 + 送審 | 自動執行 | 自動執行 |
|
||
| **你的角色** | 必須審核 | 必須審核 | 監控結果 | 可忽略 |
|
||
| **SLA** | 15 分鐘內 | 30 分鐘內 | 無強制 | 無強制 |
|
||
| **若超時** | 自動升級通知 | 自動升級通知 | 自動重試 | 自動記錄 |
|
||
|
||
### Telegram 卡片類型 → 你需要做什麼
|
||
|
||
| 卡片類型 | 外觀特徵 | 你的動作 |
|
||
|---------|---------|---------|
|
||
| **TYPE-1** INFO | `💚 INFO` 開頭 | 無需動作,系統已自動記錄 |
|
||
| **TYPE-2** AUTO | `⚡ AUTO REPAIR` | 觀察後續 RESULT 卡片即可 |
|
||
| **TYPE-3** REVIEW | `🔴 NEEDS REVIEW` + 按鈕 | **必須點擊 APPROVE 或 REJECT** |
|
||
| **TYPE-4** WAIT | `⏸️ WAITING` | 人工評估後決定要不要手動修復 |
|
||
| **TYPE-8M** SLO | `📊 SLO ALERT` | 評估是否暫停自動修復 |
|
||
|
||
---
|
||
|
||
## 3. 高頻場景 SOP
|
||
|
||
### 3.1 Pod CrashLoopBackOff
|
||
|
||
**Telegram 卡片**: TYPE-2 或 TYPE-3(視 P 等級)
|
||
|
||
自動修復路徑(AI 已執行):
|
||
```bash
|
||
kubectl rollout restart deployment/{name} -n {namespace}
|
||
```
|
||
|
||
若自動修復失敗,手動 SOP:
|
||
```bash
|
||
# 1. 查看 Pod 日誌
|
||
kubectl logs {pod-name} -n {namespace} --previous --tail=100
|
||
|
||
# 2. 確認 Pod 狀態
|
||
kubectl describe pod {pod-name} -n {namespace}
|
||
|
||
# 3. 手動重啟
|
||
kubectl rollout restart deployment/{name} -n {namespace}
|
||
|
||
# 4. 確認恢復
|
||
kubectl rollout status deployment/{name} -n {namespace}
|
||
```
|
||
|
||
---
|
||
|
||
### 3.2 MinIO 下線(或其他 188 主機上的 Docker 服務)
|
||
|
||
**Telegram 卡片**: TYPE-3(P1,需審核)
|
||
|
||
AI 建議的 SSH 修復:
|
||
```bash
|
||
ssh 192.168.0.188 'docker restart minio'
|
||
# 或
|
||
ssh 192.168.0.188 'docker ps | grep minio' # 先確認狀態
|
||
```
|
||
|
||
手動 SOP:
|
||
```bash
|
||
# 1. 確認 188 主機可達
|
||
ping 192.168.0.188
|
||
|
||
# 2. SSH 進入主機
|
||
ssh 192.168.0.188
|
||
|
||
# 3. 確認容器狀態
|
||
docker ps -a | grep minio
|
||
|
||
# 4. 重啟容器
|
||
docker restart minio
|
||
|
||
# 5. 確認恢復
|
||
docker logs minio --tail=20
|
||
curl -s http://localhost:9000/minio/health/live
|
||
```
|
||
|
||
⚠️ **禁止**: `systemctl restart docker`(會殺死 Gitea 等所有容器)
|
||
|
||
---
|
||
|
||
### 3.3 PostgreSQL 下線
|
||
|
||
**Telegram 卡片**: TYPE-3(CRITICAL,必須審核)
|
||
|
||
AI 會建議 kubectl rollout restart,但必須先確認:
|
||
|
||
```bash
|
||
# 1. 確認是服務問題還是 Pod 問題
|
||
kubectl get pods -n awoooi-prod | grep postgres
|
||
|
||
# 2. 若 Pod 崩潰 → 重啟
|
||
kubectl rollout restart deployment/postgresql -n awoooi-prod
|
||
|
||
# 3. 若 PVC 問題 → 不可自動處理,聯絡統帥
|
||
kubectl describe pvc postgres-pvc -n awoooi-prod
|
||
|
||
# 4. 確認 DB 可用
|
||
kubectl exec -n awoooi-prod deployment/postgresql -- psql -U postgres -c 'SELECT 1;'
|
||
```
|
||
|
||
**資料風險提示**: PostgreSQL 問題涉及持久化資料,`kubectl delete pvc` 被系統永久阻擋
|
||
|
||
---
|
||
|
||
### 3.4 告警鏈路斷裂(NoAlertsReceived2Hours)
|
||
|
||
這是最嚴重的情況:**你看不到告警 = 系統失明**
|
||
|
||
```bash
|
||
# 1. 確認 Alertmanager
|
||
curl http://192.168.0.110:9093/api/v1/status
|
||
curl http://192.168.0.110:9093/api/v1/alerts
|
||
|
||
# 2. 確認 AWOOOI API
|
||
curl http://192.168.0.188:8000/webhooks/test
|
||
|
||
# 3. 確認 Watchdog 心跳
|
||
# Watchdog 每分鐘送一個告警,若 2 小時沒收到 → 觸發此規則
|
||
|
||
# 4. 手動測試告警鏈路
|
||
curl -X POST http://192.168.0.110:9093/api/v1/alerts \
|
||
-H 'Content-Type: application/json' \
|
||
-d '[{"labels":{"alertname":"ManualTest","severity":"info"},"annotations":{"summary":"Manual test"}}]'
|
||
```
|
||
|
||
---
|
||
|
||
### 3.5 HostHighCpuLoad
|
||
|
||
**Telegram 卡片**: TYPE-1(INFO,系統自動記錄)
|
||
|
||
通常不需動作。若持續 > 30 分鐘:
|
||
|
||
```bash
|
||
# 確認高耗 CPU 程序
|
||
ssh 192.168.0.{110/120/121/188} 'top -bn1 | head -20'
|
||
|
||
# 若是 Ollama 模型推理(正常,等它結束)
|
||
ssh 192.168.0.188 'ps aux | grep ollama'
|
||
```
|
||
|
||
---
|
||
|
||
### 3.6 SSL 憑證到期告警
|
||
|
||
**Telegram 卡片**: TYPE-1(INFO)
|
||
|
||
```bash
|
||
# 確認哪個憑證快到期
|
||
# 通常是 Let's Encrypt 憑證需要 renew
|
||
|
||
# 若在 K8s 中由 cert-manager 管理
|
||
kubectl get certificates -A
|
||
kubectl describe certificate {cert-name} -n {namespace}
|
||
|
||
# 手動 renew(若 cert-manager 沒自動處理)
|
||
kubectl delete secret {tls-secret-name} -n {namespace} # 觸發重新申請
|
||
```
|
||
|
||
---
|
||
|
||
## 4. 審核決策指南(APPROVE / REJECT)
|
||
|
||
在 Telegram 收到 TYPE-3 審核卡時:
|
||
|
||
### 應 APPROVE 的情況
|
||
|
||
- AI 信心度 > 0.80,且 kubectl 指令是 `rollout restart` / `scale --replicas>0`
|
||
- 你已確認症狀與 AI 診斷吻合
|
||
- 修復操作是可回滾的(rollout restart 可 rollout undo)
|
||
- 這是已知的重複故障,上次 Playbook 記錄過
|
||
|
||
### 應 REJECT 的情況
|
||
|
||
- AI 信心度 < 0.65(系統通常會標記 LOW CONFIDENCE)
|
||
- kubectl 指令包含不熟悉的資源名稱(可能是 LLM 幻覺)
|
||
- 時機不對(業務高峰期,即使必要也要評估)
|
||
- 你懷疑這是誤報
|
||
|
||
### REJECT 後手動 SOP
|
||
|
||
```bash
|
||
# 1. 確認實際狀態
|
||
kubectl get pods -n {namespace}
|
||
kubectl logs {pod-name} -n {namespace} --tail=50
|
||
|
||
# 2. 若確認需要修復,手動執行
|
||
{manual command}
|
||
|
||
# 3. 在 Telegram 回覆告知已手動處理
|
||
```
|
||
|
||
---
|
||
|
||
## 5. Kill Switch — 緊急凍結
|
||
|
||
當你判斷 AI 系統行為異常(瘋狂重啟、錯誤修復),立即啟動:
|
||
|
||
```bash
|
||
# 方法 1:API Kill Switch(推薦)
|
||
curl -X POST http://192.168.0.188:8000/api/v1/kill-switch \
|
||
-H 'Authorization: Bearer {ADMIN_TOKEN}' \
|
||
-d '{"reason": "異常行為觀察到,手動凍結"}'
|
||
|
||
# 方法 2:直接修改 ConfigMap
|
||
kubectl set env deployment/awoooi-api AUTO_REPAIR_ENABLED=false -n awoooi-prod
|
||
kubectl rollout restart deployment/awoooi-api -n awoooi-prod
|
||
```
|
||
|
||
**Kill Switch 效果**: 所有 auto_repair 自動執行停止;TYPE-3 卡片不再自動批准;仍可手動操作
|
||
|
||
**重新啟動 Kill Switch**:
|
||
```bash
|
||
curl -X DELETE http://192.168.0.188:8000/api/v1/kill-switch \
|
||
-H 'Authorization: Bearer {ADMIN_TOKEN}'
|
||
```
|
||
|
||
---
|
||
|
||
## 6. SLO 監控與應對
|
||
|
||
### SLO 儀表板
|
||
|
||
```bash
|
||
curl -s http://192.168.0.188:8000/api/v1/slo/dashboard | python3 -m json.tool
|
||
```
|
||
|
||
### SLO 閾值與應對
|
||
|
||
| SLO | 指標 | 目標 | 警戒線 | 緊急線 | 應對 |
|
||
|-----|------|------|--------|--------|------|
|
||
| SLO-1 | 自動修復成功率(7天)| ≥ 80% | < 80% | < 50% | HITL-8:評估暫停自動修復 |
|
||
| SLO-2 | 告警分析延遲 P95 | < 20s | > 20s | > 30s | 檢查 LLM / 切 Expert System |
|
||
| SLO-3 | 決策引擎可用性 | ≥ 95% | < 95% | < 80% | 確認 Ollama + Gemini 狀態 |
|
||
| SLO-4 | 未解決 P0/P1 逾時 | 0 件 | > 0 | > 2 | 立即介入 |
|
||
|
||
### SLO-1 下降處理
|
||
|
||
若 SLO-1 < 80%:
|
||
1. 分析最近失敗的修復:`SELECT * FROM approval_requests WHERE execution_success=false ORDER BY created_at DESC LIMIT 20;`
|
||
2. 確認是新類型告警(知識庫沒有)還是已知告警修復失敗
|
||
3. 若是系統性問題 → 暫停自動修復,人工介入
|
||
4. 更新 `docs/postmortems/` 記錄分析結果
|
||
|
||
---
|
||
|
||
## 7. 常用指令速查
|
||
|
||
### Kubernetes
|
||
|
||
```bash
|
||
# 查看所有 Pod 狀態
|
||
kubectl get pods -n awoooi-prod
|
||
|
||
# 查看 Pod 日誌(最近 100 行)
|
||
kubectl logs {pod-name} -n awoooi-prod --tail=100
|
||
|
||
# 查看 Pod 日誌(上一個 Pod,崩潰後)
|
||
kubectl logs {pod-name} -n awoooi-prod --previous --tail=100
|
||
|
||
# 重啟 Deployment
|
||
kubectl rollout restart deployment/{name} -n awoooi-prod
|
||
|
||
# 查看 Deployment 狀態
|
||
kubectl rollout status deployment/{name} -n awoooi-prod
|
||
|
||
# 查看節點狀態
|
||
kubectl get nodes -o wide
|
||
|
||
# 查看所有資源
|
||
kubectl get all -n awoooi-prod
|
||
```
|
||
|
||
### Docker(188 主機)
|
||
|
||
```bash
|
||
# SSH 進入 188
|
||
ssh 192.168.0.188
|
||
|
||
# 查看所有容器
|
||
docker ps -a
|
||
|
||
# 重啟特定容器
|
||
docker restart {container_name}
|
||
|
||
# 查看容器日誌
|
||
docker logs {container_name} --tail=100 -f
|
||
|
||
# 查看容器狀態
|
||
docker inspect {container_name} | python3 -m json.tool
|
||
```
|
||
|
||
### AIOps API
|
||
|
||
```bash
|
||
# 系統健康
|
||
curl http://192.168.0.188:8000/health
|
||
|
||
# 最近 Incident 列表
|
||
curl http://192.168.0.188:8000/api/v1/incidents?limit=20
|
||
|
||
# SLO 儀表板
|
||
curl http://192.168.0.188:8000/api/v1/slo/dashboard
|
||
|
||
# 知識庫搜尋
|
||
curl "http://192.168.0.188:8000/api/v1/knowledge?q=minio+restart"
|
||
```
|
||
|
||
---
|
||
|
||
## 8. 主機快速參考
|
||
|
||
| 主機 | IP | 主要服務 | SSH |
|
||
|------|-----|---------|-----|
|
||
| 主控節點 | 192.168.0.110 | K3s Master, Prometheus, Alertmanager | `ssh 192.168.0.110` |
|
||
| 工作節點-1 | 192.168.0.120 | K3s Worker | `ssh 192.168.0.120` |
|
||
| 工作節點-2 | 192.168.0.121 | K3s Worker, Kali | `ssh 192.168.0.121` |
|
||
| AI 主機 | 192.168.0.188 | Ollama, Harbor, Gitea, MinIO, AWOOOI | `ssh 192.168.0.188` |
|
||
|
||
詳細 Port 分配 → [reference_four_hosts.md](~/.claude/projects/-Users-ogt-awoooi/memory/reference_four_hosts.md)
|
||
|
||
---
|
||
|
||
## 9. 升級聯絡矩陣
|
||
|
||
> 目前系統為統帥單人值班;未來擴展 SRE 團隊時使用
|
||
|
||
| 情況 | 聯絡對象 | 方式 | 優先度 |
|
||
|------|---------|------|--------|
|
||
| P0 持續 > 15min | 統帥 | Telegram 直接訊息 | 立即 |
|
||
| SLO-1 < 50% | 統帥 | Telegram #awoooi-alerts | 15min 內 |
|
||
| Kill Switch 啟動 | 統帥 | Telegram 直接訊息 | 立即 |
|
||
| 疑似資安事件 | 統帥 | 電話 | 立即 |
|
||
|
||
---
|
||
|
||
## 10. 值班後交接(Shift End Checklist)
|
||
|
||
```
|
||
□ 所有 TYPE-3 卡片已處理(APPROVE/REJECT)
|
||
□ 未解決 Incident 已記錄在 LOGBOOK.md
|
||
□ SLO-1 在 80% 以上(若低於 80% 記錄原因)
|
||
□ 若觸發了 Kill Switch,已確認原因並重啟或記錄保持凍結的理由
|
||
□ 有意義的新故障 → 撰寫 Postmortem(使用 docs/templates/POSTMORTEM-TEMPLATE.md)
|
||
□ 更新 docs/LOGBOOK.md 今日條目
|
||
```
|
||
|
||
---
|
||
|
||
## 附錄 A:事件等級速查
|
||
|
||
| 等級 | Severity | 定義 | 典型案例 |
|
||
|------|---------|------|---------|
|
||
| P0 | CRITICAL | 服務完全中斷,用戶無法使用 | DB 下線、K8s 節點故障 |
|
||
| P1 | HIGH | 核心功能受損,影響大多數用戶 | MinIO 下線、OpenClaw 下線 |
|
||
| P2 | MEDIUM | 部分功能受影響,有降級措施 | Pod CrashLoop、SSL 到期 |
|
||
| P3 | LOW | 輕微問題,無直接用戶影響 | CPU 高負載、備份失敗 |
|
||
|
||
---
|
||
|
||
## 附錄 B:相關文件索引
|
||
|
||
| 文件 | 路徑 | 說明 |
|
||
|------|------|------|
|
||
| HITL 規格書 | `docs/operations/HUMAN-IN-THE-LOOP.md` | 人工介入完整規格 |
|
||
| SLO 定義 | `docs/slo/SLO-SLI-DEFINITION.md` | SLO/SLI 量化定義 |
|
||
| 告警目錄 | `docs/reference/ALERT-TAXONOMY-CATALOG.md` | 告警分類完整列表 |
|
||
| 事後分析模板 | `docs/templates/POSTMORTEM-TEMPLATE.md` | Postmortem 標準格式 |
|
||
| AI 模型卡片 | `docs/ai/AI-MODEL-CARDS.md` | 各 AI 模型治理規格 |
|
||
| 服務端點 | `docs/reference/SERVICE-ENDPOINTS.md` | 所有服務 URL/Port |
|
||
| K3s 優化手冊 | `docs/runbooks/K3S-OPTIMIZATION-RUNBOOK.md` | 節點調優 SOP |
|
||
| 飛輪鐵律 | `memory/feedback_auto_repair_flywheel_v2.md` | ADR-068 五根因鐵律 |
|
||
|
||
---
|
||
|
||
*本文件由 Claude Sonnet 4.6 於 2026-04-14 台北時間建立*
|