# 回滾 Runbook 對應 spec.md FR-018、SC-006:任一次失敗更新可在 5 分鐘內回到前一可用版本。 ## 偵測更新失敗 更新後觀察: ```bash kubectl -n rollout status deploy/-ai-api --timeout=2m kubectl -n get pods -l app.kubernetes.io/instance= ``` 若 readiness probe 持續失敗、pods CrashLoopBackOff,或健康檢查回應異常, 即進入回滾流程。 ## 回滾步驟 ### 1. 確認 Helm release 與歷史 ```bash helm -n history ``` 選擇要回到的 revision(通常是上一個成功的)。 ### 2. 執行回滾 ```bash helm -n rollback ``` 此命令會: - 重新套用前一版的 manifests - 觸發新一輪 rolling update - migration Job 設為 `pre-upgrade` hook,會在每次 rollback 重跑(idempotent) ### 3. 驗證 ```bash kubectl -n rollout status deploy/-ai-api kubectl -n port-forward svc/-ai-api 8000:80 & curl -s localhost:8000/healthz # 應回 {"status":"ok"} ``` 並執行 quickstart §3 的撤回測試以確認核心功能可用。 ## 何時需要手動釘版本 若 Renovate PR 引入了破壞性 LiteLLM 升級,CI 沒擋住但生產出現問題: 1. 在 `values.yaml` 中明確指定上一個可用 image tag 2. 開新 PR,標記 `do-not-merge` 至原本的 Renovate PR 3. 在 issue 中記錄該版本的問題、最低支援版本 ## SLO 量測 於開發叢集執行: ```bash # 故意升級到不存在 tag helm -n ai-api upgrade ai-api ./deploy/helm/ai-api \ --reuse-values --set image.tag=does-not-exist # 等 readiness 失敗 sleep 60 # 計時回滾 time helm -n ai-api rollback ai-api time kubectl -n ai-api rollout status deploy/ai-api-ai-api --timeout=5m ``` 紀錄回滾耗時,必須 ≤ 5 分鐘。