docs: Phase O 可觀測性終極補完計畫設計規格
SigNoz 統一派架構,解決 6 大盲區 (Event/Log/Metrics/Descheduler/kubectl/MinIO-Kali) + Monitoring Master Plan Wave A-D 收尾 + 5 個首席架構師 Review 節點 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,329 @@
|
||||
# AWOOOI 可觀測性終極補完計畫
|
||||
|
||||
> **代號**: Phase O (Observability)
|
||||
> **決策**: 路線 A — SigNoz 統一派
|
||||
> **批准**: 統帥 2026-04-02
|
||||
> **架構師**: Claude Code (首席架構師)
|
||||
> **預估工時**: 12-15h (含 Wave A-D 收尾)
|
||||
|
||||
---
|
||||
|
||||
## 1. 戰略背景
|
||||
|
||||
### 1.1 問題起源
|
||||
|
||||
2026-04-02 K3s 健康檢查中發現「0 Pod 重啟」的數據,經深入分析確認為 **可觀測性盲區** 而非真實穩定:
|
||||
|
||||
- K8s Event 僅保留 ~1 小時
|
||||
- Pod Log 隨容器消亡
|
||||
- Prometheus 預設 ~15 天保留
|
||||
- Descheduler PodSecurity 違規持續失敗
|
||||
- kubectl 存取需 sudo 密碼
|
||||
- MinIO/Kali 無監控
|
||||
|
||||
### 1.2 架構決策
|
||||
|
||||
| 選項 | 決策 | 理由 |
|
||||
|------|------|------|
|
||||
| A. SigNoz 統一派 | **採用** | 複用 ClickHouse、少一個故障點、單一查詢介面 |
|
||||
| B. Loki 獨立派 | 否決 | .188 已過載、增加維運複雜度、查詢分散 |
|
||||
|
||||
---
|
||||
|
||||
## 2. 六大盲區解決方案
|
||||
|
||||
### O1: K8s Event 長期保留 (🔴 致命)
|
||||
|
||||
**現狀**: Event 保留 ~1 小時,RCA 不可能
|
||||
**目標**: 30 天可查詢
|
||||
|
||||
**方案**: 部署 `kubernetes-event-exporter` 為 K3s Deployment
|
||||
|
||||
```
|
||||
K8s API Server (Event Watch)
|
||||
→ kubernetes-event-exporter (K3s Deployment)
|
||||
→ OTEL Collector (192.168.0.188:24318)
|
||||
→ SigNoz ClickHouse (結構化 Log 儲存)
|
||||
```
|
||||
|
||||
**關鍵配置**:
|
||||
- 輸出格式: JSON Log (含 namespace, reason, involvedObject, message)
|
||||
- 過濾: 排除 Normal/Scheduled 高頻事件,保留 Warning + Error 全量
|
||||
- 保留期: SigNoz ClickHouse TTL 30 天
|
||||
|
||||
### O2: Pod Log 集中聚合 (🔴 致命)
|
||||
|
||||
**現狀**: Pod 死亡 = Log 永失
|
||||
**目標**: 所有 Pod Log 集中儲存 30 天
|
||||
|
||||
**方案**: 部署 OTEL Collector DaemonSet (filelog receiver)
|
||||
|
||||
```
|
||||
/var/log/pods/*/*/*.log (K3s 節點)
|
||||
→ OTEL Collector DaemonSet (K3s 節點本地)
|
||||
→ batch processor + filter processor
|
||||
→ OTEL Exporter → 192.168.0.188:24318
|
||||
→ SigNoz ClickHouse
|
||||
```
|
||||
|
||||
**關鍵配置**:
|
||||
- Receiver: `filelog` 讀取 `/var/log/pods/*/*/*.log`
|
||||
- Processor:
|
||||
- `k8s_attributes`: 自動注入 Pod name, namespace, node, labels
|
||||
- `filter`: 捨棄 kube-system debug 等無用 log
|
||||
- `batch`: 批次發送 (200 條/5 秒)
|
||||
- Resource Limits: CPU 100m / Memory 128Mi (DaemonSet 輕量)
|
||||
- 保留期: SigNoz ClickHouse TTL 30 天
|
||||
|
||||
### O3: 長期指標儲存 (🔴 盲區)
|
||||
|
||||
**現狀**: Prometheus ~15 天本地保留
|
||||
**目標**: 關鍵指標 90 天
|
||||
|
||||
**方案**: Prometheus `remote_write` → SigNoz OTLP
|
||||
|
||||
```
|
||||
Prometheus (192.168.0.188)
|
||||
→ remote_write (metric relabeling 過濾)
|
||||
→ SigNoz OTLP/HTTP (192.168.0.188:24318)
|
||||
→ ClickHouse (長期儲存)
|
||||
```
|
||||
|
||||
**關鍵配置**:
|
||||
- `remote_write` 端點: `http://localhost:24318/api/v1/write` (同機免跨網路)
|
||||
- Metric Relabeling: **只轉發關鍵指標** (降低 ClickHouse 負擔)
|
||||
- `node_cpu_seconds_total`, `node_memory_*` (節點)
|
||||
- `container_cpu_*`, `container_memory_*` (容器)
|
||||
- `kube_pod_container_status_restarts_total` (重啟)
|
||||
- `http_request_duration_*`, `http_requests_total` (API)
|
||||
- `awoooi_*` (自訂業務指標)
|
||||
- `pg_*`, `redis_*` (資料庫)
|
||||
- 預估: ~50 個關鍵 metric series,90 天約 2-5 GB ClickHouse 儲存
|
||||
- Prometheus 本地保留維持 15 天 (全量)
|
||||
|
||||
### O4: Descheduler PodSecurity 修復 (🔴 故障)
|
||||
|
||||
**現狀**: CronJob 因 PodSecurity `restricted` 違規持續失敗
|
||||
**目標**: 正常執行
|
||||
|
||||
**方案**: 修正 descheduler.yaml 加入 securityContext
|
||||
|
||||
```yaml
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
securityContext:
|
||||
runAsNonRoot: true
|
||||
runAsUser: 65534 # nobody
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
containers:
|
||||
- name: descheduler
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
readOnlyRootFilesystem: true
|
||||
capabilities:
|
||||
drop: ["ALL"]
|
||||
```
|
||||
|
||||
### O5: kubectl 免密碼存取 (🔴 盲區)
|
||||
|
||||
**現狀**: wooo 需 sudo 密碼
|
||||
**目標**: wooo 免密碼 + Mac 本機直接查詢
|
||||
|
||||
**方案 (兩步)**:
|
||||
|
||||
1. **K3s 節點**: 複製 kubeconfig 到 wooo home
|
||||
```bash
|
||||
# 在 120 和 121 上
|
||||
sudo cp /etc/rancher/k3s/k3s.yaml /home/wooo/.kube/config
|
||||
sudo chown wooo:wooo /home/wooo/.kube/config
|
||||
sudo chmod 600 /home/wooo/.kube/config
|
||||
# 修改 server 為 VIP
|
||||
sed -i 's|127.0.0.1|192.168.0.125|' /home/wooo/.kube/config
|
||||
```
|
||||
|
||||
2. **Mac 本機**: 建立 kubeconfig
|
||||
```bash
|
||||
mkdir -p ~/.kube
|
||||
scp wooo@192.168.0.120:/home/wooo/.kube/config ~/.kube/config
|
||||
# server 已指向 VIP 192.168.0.125:6443
|
||||
```
|
||||
|
||||
### O6: MinIO / Kali 監控補齊 (🟠 盲區)
|
||||
|
||||
**MinIO (192.168.0.188)**:
|
||||
- 啟用內建 Prometheus 端點: `MINIO_PROMETHEUS_AUTH_TYPE=public`
|
||||
- Prometheus scrape config 新增 target
|
||||
- 告警規則: `MinioDiskUsageHigh`, `MinioOffline`
|
||||
|
||||
**Kali (192.168.0.112)**:
|
||||
- 部署 node-exporter (系統層級監控)
|
||||
- Blackbox Exporter TCP probe (8080 Scanner API)
|
||||
- 告警規則: `KaliScannerDown`, `KaliDiskFull`
|
||||
|
||||
---
|
||||
|
||||
## 3. Monitoring Master Plan 收尾 (Wave A-D)
|
||||
|
||||
### 3.1 Wave A 剩餘 (P0)
|
||||
|
||||
| # | 任務 | 狀態 | 工時 |
|
||||
|---|------|------|------|
|
||||
| A.1 | Sentry API Token 注入 K8s Secret | ⏳ | 15min |
|
||||
| A.2 | SignOz 告警規則部署到 SigNoz | ⏳ | 30min |
|
||||
| A.3 | SignOz Webhook Handler | ⏳ | 45min |
|
||||
| A.4 | Sentry Comment API 整合 | ⏳ | 30min |
|
||||
| A.5 | Alert Chain Metrics | ✅ 已完成 | — |
|
||||
| A.6 | Smoke Test Script | ⏳ | 45min |
|
||||
|
||||
### 3.2 Wave B (P1) — CD 鏈路保護
|
||||
|
||||
| # | 任務 | 工時 |
|
||||
|---|------|------|
|
||||
| B.1 | Alert Chain PrometheusRule | ✅ 已完成 |
|
||||
| B.2 | CD Pipeline Smoke Test 整合 | 45min |
|
||||
| B.3 | 文檔 + E2E 驗證 | 30min |
|
||||
|
||||
### 3.3 Wave C (P2) — 監控即代碼
|
||||
|
||||
| # | 任務 | 工時 |
|
||||
|---|------|------|
|
||||
| C.1 | generate_monitoring.py 自動發現 | 1h |
|
||||
| C.2 | CI coverage 驗證 | 45min |
|
||||
| C.3 | Docker 容器自動發現 | 1h |
|
||||
|
||||
### 3.4 Wave D (P3) — 視覺化
|
||||
|
||||
| # | 任務 | 工時 |
|
||||
|---|------|------|
|
||||
| D.1 | NVIDIA Grafana Dashboard | 1.5h |
|
||||
| D.2 | 監控覆蓋率報告 | 1.5h |
|
||||
|
||||
---
|
||||
|
||||
## 4. SigNoz ClickHouse 容量規劃
|
||||
|
||||
| 資料類型 | 每日估算 | 30天 | 90天 | 壓縮率 |
|
||||
|----------|---------|------|------|--------|
|
||||
| K8s Events (O1) | ~5 MB | 150 MB | — | 10:1 |
|
||||
| Pod Logs (O2) | ~200 MB | 6 GB | — | 5:1 |
|
||||
| 指標 Remote Write (O3) | ~50 MB | — | 4.5 GB | 20:1 |
|
||||
| Traces (現有) | ~100 MB | 3 GB | — | 10:1 |
|
||||
| **合計** | **~355 MB/天** | **~10 GB** | **~15 GB** | — |
|
||||
|
||||
**.188 磁碟現況**: 使用中 ~60%(估計),新增 15 GB 完全可承受。
|
||||
|
||||
**清理策略**: ClickHouse TTL 自動過期,無需人工介入。
|
||||
|
||||
---
|
||||
|
||||
## 5. 細化實施步驟 (16 Steps)
|
||||
|
||||
### Phase O-1: 基礎設施修復 (2h)
|
||||
> 🏗️ **首席架構師 Review 節點: O-1 完成後**
|
||||
|
||||
| Step | 任務 | 工時 | 類型 |
|
||||
|------|------|------|------|
|
||||
| **1.1** | Descheduler securityContext 修復 + 部署驗證 | 30min | K8s YAML |
|
||||
| **1.2** | kubectl 免密碼 (120/121 kubeconfig + Mac 本機) | 30min | 基礎設施 |
|
||||
| **1.3** | MinIO Prometheus 端點啟用 + scrape config | 30min | 監控 |
|
||||
| **1.4** | Kali node-exporter + Blackbox probe 設定 | 30min | 監控 |
|
||||
|
||||
**Review 重點**: Descheduler PSA 合規性、kubeconfig 權限安全性、監控 target 覆蓋率
|
||||
|
||||
### Phase O-2: OTEL Log 收集管線 (3h)
|
||||
> 🏗️ **首席架構師 Review 節點: O-2 完成後**
|
||||
|
||||
| Step | 任務 | 工時 | 類型 |
|
||||
|------|------|------|------|
|
||||
| **2.1** | OTEL Collector DaemonSet YAML (filelog receiver) | 1h | K8s YAML |
|
||||
| **2.2** | kubernetes-event-exporter Deployment YAML | 45min | K8s YAML |
|
||||
| **2.3** | SigNoz ClickHouse TTL 設定 (Log 30天 / Metrics 90天) | 30min | 基礎設施 |
|
||||
| **2.4** | 部署到 K3s + Log 流入驗證 | 45min | 驗證 |
|
||||
|
||||
**Review 重點**: OTEL Collector 配置 (filter/batch processor)、NetworkPolicy egress 規則、ClickHouse TTL 正確性、資源限制合理性
|
||||
|
||||
### Phase O-3: 長期指標 + Prometheus Remote Write (1.5h)
|
||||
> 🏗️ **首席架構師 Review 節點: O-3 完成後**
|
||||
|
||||
| Step | 任務 | 工時 | 類型 |
|
||||
|------|------|------|------|
|
||||
| **3.1** | Prometheus remote_write 配置 + metric relabeling | 45min | 配置 |
|
||||
| **3.2** | 部署驗證: SigNoz Metrics Explorer 確認資料流入 | 30min | 驗證 |
|
||||
| **3.3** | 告警規則: MinIO + Kali + ClickHouse 磁碟 | 15min | 監控 |
|
||||
|
||||
**Review 重點**: metric relabeling 白名單是否遺漏關鍵指標、ClickHouse 寫入效能、告警閾值合理性
|
||||
|
||||
### Phase O-4: Wave A 收尾 — 告警鏈路完整化 (2.5h)
|
||||
|
||||
| Step | 任務 | 工時 | 類型 |
|
||||
|------|------|------|------|
|
||||
| **4.1** | Sentry API Token 注入 + K8s Secret | 15min | Secret |
|
||||
| **4.2** | SignOz 告警規則部署 | 30min | 配置 |
|
||||
| **4.3** | SignOz Webhook Handler (signoz_webhook.py) | 45min | 程式碼 |
|
||||
| **4.4** | Sentry Comment API 整合 | 30min | 程式碼 |
|
||||
| **4.5** | Smoke Test Script + CD 整合 (A.6 + B.2) | 30min | 程式碼 |
|
||||
|
||||
### Phase O-5: Wave B-C — CD 保護 + 監控即代碼 (3h)
|
||||
> 🏗️ **首席架構師 Review 節點: O-5 完成後 (含 O-4)**
|
||||
|
||||
| Step | 任務 | 工時 | 類型 |
|
||||
|------|------|------|------|
|
||||
| **5.1** | CD Pipeline Smoke Test 整合到 cd.yaml | 30min | CI/CD |
|
||||
| **5.2** | generate_monitoring.py 自動發現 | 1h | 程式碼 |
|
||||
| **5.3** | CI coverage 驗證 + Docker 容器自動發現 | 1h | 程式碼 |
|
||||
| **5.4** | E2E 告警鏈路驗證文檔 | 30min | 文檔 |
|
||||
|
||||
**Review 重點**: Webhook handler 程式碼品質、CD smoke test 可靠性、generate_monitoring 邏輯正確性、**告警鏈路 E2E 端到端測試**
|
||||
|
||||
### Phase O-6: Wave D — 視覺化 + 最終驗收 (3h)
|
||||
> 🏗️ **首席架構師 Final Review: 全量驗收**
|
||||
|
||||
| Step | 任務 | 工時 | 類型 |
|
||||
|------|------|------|------|
|
||||
| **6.1** | NVIDIA Grafana Dashboard | 1.5h | 視覺化 |
|
||||
| **6.2** | 監控覆蓋率報告 | 1h | 文檔 |
|
||||
| **6.3** | ADR-052 撰寫 (可觀測性統一架構決策) | 30min | ADR |
|
||||
|
||||
**Final Review 重點**: 全部 6 大盲區驗證、監控覆蓋率 ≥95%、ClickHouse 資源消耗實測、OpenClaw RCA 查詢路徑驗證
|
||||
|
||||
---
|
||||
|
||||
## 6. 首席架構師 Review 矩陣
|
||||
|
||||
| Review 節點 | Phase | 審查類型 | 審查重點 |
|
||||
|-------------|-------|----------|----------|
|
||||
| **R1** | O-1 完成 | 基礎設施 | PSA 合規、權限安全、監控覆蓋 |
|
||||
| **R2** | O-2 完成 | 架構 + 配置 | OTEL 管線正確性、TTL、NetworkPolicy、資源限制 |
|
||||
| **R3** | O-3 完成 | 配置 + 效能 | Remote write 白名單、ClickHouse 寫入效能 |
|
||||
| **R4** | O-4+O-5 完成 | 程式碼 + E2E | Webhook code quality、CD smoke test、告警鏈路 E2E |
|
||||
| **R5 (Final)** | O-6 完成 | 全量驗收 | 6 大盲區全數封閉、覆蓋率報告、ADR 品質 |
|
||||
|
||||
**Review 標準**: 沿用現有評分體系 (100 分制,90+ OUTSTANDING)
|
||||
|
||||
---
|
||||
|
||||
## 7. 風險與緩解
|
||||
|
||||
| 風險 | 機率 | 影響 | 緩解 |
|
||||
|------|------|------|------|
|
||||
| ClickHouse OOM (.188 記憶體不足) | 低 | 高 | TTL 嚴格控制 + 日誌過濾 + 監控 ClickHouse memory |
|
||||
| OTEL DaemonSet 影響 K3s 節點效能 | 低 | 中 | 資源限制 100m/128Mi + 實測 |
|
||||
| Prometheus remote_write 高基數爆炸 | 中 | 高 | metric relabeling 白名單,只轉 ~50 series |
|
||||
| Log Storm 衝垮 SigNoz | 低 | 高 | filter processor 捨棄 debug + batch 限流 |
|
||||
|
||||
---
|
||||
|
||||
## 8. 驗收標準 (Definition of Done)
|
||||
|
||||
- [ ] kubectl 可從 Mac 本機免密碼查詢所有 namespace
|
||||
- [ ] K8s Event 可在 SigNoz 查到 7 天前的 Warning 事件
|
||||
- [ ] 已死亡的 Pod Log 可在 SigNoz 查到
|
||||
- [ ] Prometheus 90 天前的關鍵指標可在 SigNoz 查到
|
||||
- [ ] Descheduler CronJob 成功執行至少 3 次
|
||||
- [ ] MinIO + Kali 出現在 Prometheus targets 且 UP
|
||||
- [ ] Wave A-D 全部任務完成
|
||||
- [ ] 告警鏈路 E2E 測試通過 (Alertmanager → API → Telegram)
|
||||
- [ ] ClickHouse 磁碟使用增長 < 預估 120%
|
||||
- [ ] ADR-052 已撰寫並 commit
|
||||
Reference in New Issue
Block a user