# 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