# Kubernetes Deployment Guide

> 历史部署资料，不是当前生产入口。生产统一使用仓库根目录 `docker-compose.yml`
> 启动 `ad-control-service` 和 `ad-daily-service`；旧 `cronjob.yaml` 已删除，禁止再启动
> `execute_once.py`。

## 部署模式选择

### 模式 A：Deployment + APScheduler（推荐）

**优势**：
- 常驻 Pod，资源占用稳定
- HTTP 健康检查支持
- 可通过 API 手动触发任务
- 日志集中输出，易于查看
- 启动速度快

**部署步骤**：

```bash
# 1. 创建命名空间
kubectl apply -f namespace.yaml

# 2. 部署 PVC（持久化存储）
kubectl apply -f pvc.yaml

# 3. 部署 ConfigMap（公开配置）
kubectl apply -f configmap.yaml

# 4. 部署 Secret（敏感信息）
# 注意：先修改 secret.yaml 中的实际值
kubectl apply -f secret.yaml

# 5. 部署 Deployment 和 Service
kubectl apply -f deployment.yaml

# 6. （可选）部署网络策略
kubectl apply -f network-policy.yaml

# 7. 验证部署
kubectl get all -n ad-automation
kubectl get pvc -n ad-automation

# 8. 查看日志
kubectl logs -f -n ad-automation deployment/auto-put-ad-mini

# 9. 端口转发（本地测试）
kubectl port-forward -n ad-automation svc/auto-put-ad-mini 8080:8080

# 10. 测试健康检查
curl http://localhost:8080/health | jq .

# 11. 手动触发任务
curl -X POST http://localhost:8080/trigger | jq .
```

## 配置修改

### 修改定时调度

**Deployment 模式**：
```bash
kubectl patch configmap ad-config -n ad-automation \
  --patch '{"data":{"CRON_SCHEDULE":"0 3 * * *"}}'  # 改为凌晨3点

kubectl rollout restart deployment/auto-put-ad-mini -n ad-automation
```

**CronJob 模式**：
```bash
kubectl edit cronjob auto-put-ad-mini -n ad-automation
# 修改 spec.schedule 字段
```

### 启用自动执行

```bash
# 测试通过后，启用执行开关
kubectl patch configmap ad-config -n ad-automation \
  --patch '{"data":{"EXECUTION_ENABLED":"true"}}'

kubectl rollout restart deployment/auto-put-ad-mini -n ad-automation
```

### 修改白名单账户

```bash
# 方式1：通过 Secret（推荐）
kubectl patch secret ad-secrets -n ad-automation \
  --patch '{"stringData":{"WHITELIST_ACCOUNTS":"80769799,71305011,12345678"}}'

kubectl rollout restart deployment/auto-put-ad-mini -n ad-automation

# 方式2：修改 whitelist.json 并重新构建镜像
```

## 监控和故障排查

### 查看 Pod 状态

```bash
kubectl get pods -n ad-automation
kubectl describe pod <pod-name> -n ad-automation
```

### 查看日志

```bash
# 实时日志
kubectl logs -f -n ad-automation deployment/auto-put-ad-mini

# 最近 100 行日志
kubectl logs -n ad-automation deployment/auto-put-ad-mini --tail=100

# CronJob 模式查看特定 Job 日志
kubectl logs -n ad-automation job/<job-name>
```

### 检查配置

```bash
# 查看 ConfigMap
kubectl get configmap ad-config -n ad-automation -o yaml

# 查看 Secret（base64 编码）
kubectl get secret ad-secrets -n ad-automation -o yaml

# 解码 Secret 值
kubectl get secret ad-secrets -n ad-automation -o jsonpath='{.data.WHITELIST_ACCOUNTS}' | base64 -d
```

### 访问输出文件

```bash
# 进入 Pod 查看输出
POD_NAME=$(kubectl get pods -n ad-automation -l app=auto-put-ad-mini -o jsonpath='{.items[0].metadata.name}')
kubectl exec -it -n ad-automation $POD_NAME -- bash

# 在 Pod 内查看输出
ls -lh /app/outputs/reports/
cat /app/outputs/reports/llm_decisions_*.csv | head

# 或直接执行命令
kubectl exec -n ad-automation $POD_NAME -- ls -lh /app/outputs/reports/
```

## 回滚

### Deployment 模式

```bash
# 查看历史版本
kubectl rollout history deployment/auto-put-ad-mini -n ad-automation

# 回滚到上一个版本
kubectl rollout undo deployment/auto-put-ad-mini -n ad-automation

# 回滚到指定版本
kubectl rollout undo deployment/auto-put-ad-mini --to-revision=2 -n ad-automation
```

### CronJob 模式

```bash
# 暂停 CronJob
kubectl patch cronjob auto-put-ad-mini -n ad-automation -p '{"spec":{"suspend":true}}'

# 删除失败的 Job
kubectl delete job -l app=auto-put-ad-mini -n ad-automation

# 更新镜像
kubectl set image cronjob/auto-put-ad-mini \
  decision-engine=your-registry/auto-put-ad-mini:v0.9.0 \
  -n ad-automation

# 恢复 CronJob
kubectl patch cronjob auto-put-ad-mini -n ad-automation -p '{"spec":{"suspend":false}}'
```

## 清理资源

```bash
# 删除所有资源
kubectl delete -f deployment.yaml
kubectl delete -f pvc.yaml
kubectl delete -f configmap.yaml
kubectl delete -f secret.yaml
kubectl delete -f network-policy.yaml

# 或删除整个命名空间（慎用）
kubectl delete namespace ad-automation
```

## 安全建议

1. **Secret 管理**：
   - 不要将真实 Secret 提交到 Git
   - 使用 Kubernetes External Secrets 或 Sealed Secrets
   - 定期轮换敏感凭据

2. **网络隔离**：
   - 启用 NetworkPolicy
   - 仅允许必要的出站连接
   - 限制 Pod 间通信

3. **资源限制**：
   - 合理设置 CPU 和内存 limits
   - 使用 LimitRange 和 ResourceQuota
   - 监控资源使用情况

4. **最小权限**：
   - 不使用 root 用户运行
   - 禁用特权容器
   - 使用 readOnlyRootFilesystem（如可行）
