# DR-K8s-awoooi — K8s Pod 全掛復原 SOP

**目標時間**: < 15 分鐘  
**觸發場景**: awoooi-prod namespace 所有 Pod 無法啟動，或 K3s 節點失效  
**工具**: Velero, kubectl, ArgoCD  
**最後更新**: 2026-04-11 (Claude Sonnet 4.6 Asia/Taipei)

---

## 前提確認

```bash
# 確認 Velero 可存取備份
kubectl get backups -n velero --sort-by='.metadata.creationTimestamp' | tail -5

# 確認 BackupStorageLocation 狀態
kubectl get backupstoragelocations -n velero
# 期望: default Available
```

---

## 步驟 1：確認最新可用備份（1 分鐘）

```bash
# 列出最近備份
kubectl get backups -n velero | grep daily-awoooi-prod | tail -3

# 確認備份完整
BACKUP_NAME=daily-awoooi-prod-$(date -d yesterday +%Y%m%d)020005
kubectl describe backup $BACKUP_NAME -n velero | grep -E "Phase|Errors|Warnings"
# 期望: Phase: Completed, Errors: 0
```

---

## 步驟 2：暫停 ArgoCD 自動 Sync（2 分鐘）

> ⚠️ 必須先暫停，否則 ArgoCD selfHeal 會與 Velero restore 競爭

```bash
kubectl patch application awoooi-prod -n argocd \
  --type merge \
  -p '{"spec":{"syncPolicy":{"automated":null}}}'

echo "✅ ArgoCD auto-sync 已暫停"
```

---

## 步驟 3：執行 Velero Restore（5 分鐘）

```bash
# 使用最新備份恢復
BACKUP_NAME=$(kubectl get backups -n velero --sort-by='.metadata.creationTimestamp' \
  -o jsonpath='{.items[-1:].metadata.name}')
echo "使用備份: $BACKUP_NAME"

velero restore create awoooi-restore-$(date +%H%M) \
  --from-backup $BACKUP_NAME \
  --include-namespaces awoooi-prod \
  --wait

# 監控進度
velero restore describe awoooi-restore-$(date +%H%M) --details
```

---

## 步驟 4：驗證服務恢復（3 分鐘）

```bash
# 確認 Pod 全部 Running
kubectl get pods -n awoooi-prod

# Health Check
curl -f http://192.168.0.121:32334/api/v1/health
# 期望: {"status": "healthy"}

# Web 服務
curl -s -o /dev/null -w '%{http_code}' https://awoooi.wooo.work
# 期望: 200
```

---

## 步驟 5：恢復 ArgoCD 自動 Sync（1 分鐘）

```bash
kubectl patch application awoooi-prod -n argocd \
  --type merge \
  -p '{"spec":{"syncPolicy":{"automated":{"prune":true,"selfHeal":true}}}}'

# 觸發一次同步確認一致
kubectl annotate application awoooi-prod -n argocd \
  argocd.argoproj.io/refresh=hard

echo "✅ ArgoCD auto-sync 已恢復"
```

---

## 回滾方案

若 restore 失敗，直接從 Git 重新部署：

```bash
# 強制 ArgoCD sync（從 Git 最新狀態重建）
kubectl patch application awoooi-prod -n argocd \
  --type merge \
  -p '{"operation":{"sync":{"force":true}}}'
```
