Files
brunoandClaude 2848a75aa2 feat: 配置完整 CI/CD 流程和 Kubernetes 部署
## 🚀 CI/CD 流程

### Gitea Actions Workflow
- 自动构建 Backend 和 Frontend Docker 镜像
- 推送镜像到 Harbor (192.168.1.83:8080)
- 自动部署到 Kubernetes learn namespace
- 支持滚动更新和健康检查

### Docker 镜像
- **Backend**: Python 3.11 + FastAPI
  - 多阶段构建优化
  - 健康检查探针
  - 生产环境优化
- **Frontend**: Node 18 + Vue 3 + Nginx
  - 多阶段构建
  - Gzip 压缩
  - 静态资源缓存优化

## ☸️ Kubernetes 部署

### 基础设施
- Namespace: learn
- PostgreSQL 15 (持久化存储)
- ConfigMap 和 Secret 管理
- Service 和 Ingress 配置

### 应用部署
- Backend: 2 副本,资源限制
- Frontend: 2 副本,Nginx 服务
- 健康检查:Liveness + Readiness Probes
- 滚动更新策略

### 访问配置
- Ingress: pager.learn.local
- Frontend: http://pager.learn.local
- API: http://pager.learn.local/api
- API Docs: http://pager.learn.local/api/docs

## 📊 Grafana 监控

### ServiceMonitor
- Prometheus 自动服务发现
- Backend、Frontend、PostgreSQL 指标采集
- 30s 采集间隔

### Dashboard 面板
- HTTP 请求速率和响应时间
- Pod CPU 和内存使用
- 数据库连接数
- 错误率 (4xx/5xx)
- Pod 重启次数
- 磁盘使用率

## 📦 新增文件

### Docker
- `backend/Dockerfile` - 后端镜像构建
- `frontend/Dockerfile` - 前端镜像构建
- `frontend/nginx.conf` - Nginx 配置
- `.dockerignore` - 构建优化

### CI/CD
- `.gitea/workflows/ci-cd.yaml` - Gitea Actions 配置

### Kubernetes
- `k8s/namespace.yaml` - Namespace 定义
- `k8s/configmap.yaml` - 应用配置
- `k8s/secret.yaml` - 敏感信息
- `k8s/postgres.yaml` - PostgreSQL 部署
- `k8s/deployment.yaml` - 应用部署
- `k8s/service.yaml` - Service 配置
- `k8s/ingress.yaml` - Ingress 路由

### 监控
- `k8s/monitoring/servicemonitor.yaml` - Prometheus 采集
- `k8s/monitoring/grafana-dashboard.json` - Dashboard 定义
- `k8s/monitoring/install-dashboard.sh` - 安装脚本

### 文档和脚本
- `CICD_DEPLOY.md` - 完整部署文档
- `deploy.sh` - 快速部署脚本

## 🔧 配置要求

### Gitea Secrets
- `HARBOR_PASSWORD`: Harbor 密码
- `KUBECONFIG`: K8s 配置 (base64 编码)

### Harbor
- 项目: pager
- 认证: admin/admin123

### Kubernetes
- 版本: 1.24+
- Namespace: learn
- Ingress Controller: nginx

## 📝 使用说明

### 自动部署
```bash
git push origin master
# 自动触发 CI/CD 流程
```

### 手动部署
```bash
./deploy.sh
```

### 查看状态
```bash
kubectl get pods -n learn
kubectl logs -f -l app=pager-backend -n learn
```

### 监控
1. 部署 ServiceMonitor: `kubectl apply -f k8s/monitoring/`
2. 安装 Grafana Dashboard: `cd k8s/monitoring && ./install-dashboard.sh`

## 🎯 特性

- ✅ 自动化 CI/CD 流程
- ✅ Docker 多阶段构建优化
- ✅ Kubernetes 高可用部署
- ✅ 滚动更新零停机
- ✅ 健康检查和自动恢复
- ✅ Prometheus + Grafana 监控
- ✅ 完整的故障排查文档

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
2025-11-22 22:56:31 +08:00

397 lines
8.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CI/CD 部署指南
本文档介绍如何配置和使用 CI/CD 流程将 Pager 应用部署到 Kubernetes 集群,并使用 Grafana 监控。
## 📋 目录
- [环境要求](#环境要求)
- [配置步骤](#配置步骤)
- [部署流程](#部署流程)
- [监控配置](#监控配置)
- [故障排查](#故障排查)
## 🔧 环境要求
### 基础设施
- **Kubernetes 集群**: v1.24+
- **Harbor 镜像仓库**: http://192.168.1.83:8080 (admin/admin123)
- **Gitea**: http://192.168.1.83:33000
- **Namespace**: learn
- **Grafana**: 用于应用监控
- **Prometheus**: 用于指标采集
### 工具
- kubectl v1.24+
- docker 或 podman
- git
## 🚀 配置步骤
### 1. 配置 Gitea Secrets
在 Gitea 仓库中配置以下 secrets:
**路径**: http://192.168.1.83:33000/gao/pager/settings/secrets
| Secret 名称 | 说明 | 值 |
|------------|------|-----|
| `HARBOR_PASSWORD` | Harbor 密码 | `admin123` |
| `KUBECONFIG` | K8s 配置文件 (base64 编码) | 见下方说明 |
#### 生成 KUBECONFIG Secret
```bash
# 将 kubeconfig 文件编码为 base64
cat ~/.kube/config | base64 -w 0
```
将输出的 base64 字符串设置为 `KUBECONFIG` secret。
### 2. 创建 Harbor 项目
```bash
# 登录 Harbor
docker login 192.168.1.83:8080 -u admin -p admin123
# Harbor 已经自动创建 pager 项目(通过 UI 或 API)
```
或通过 Harbor UI 创建:
- 访问 http://192.168.1.83:8080
- 登录 (admin/admin123)
- 创建项目 `pager`
### 3. 配置 Kubernetes
#### 创建 Namespace 和基础资源
```bash
cd /Users/brunogao/work/codes/pingan/pager
# 创建 namespace
kubectl apply -f k8s/namespace.yaml
# 创建 secrets 和 configmap
kubectl apply -f k8s/secret.yaml
kubectl apply -f k8s/configmap.yaml
# 部署 PostgreSQL
kubectl apply -f k8s/postgres.yaml
# 等待 PostgreSQL 就绪
kubectl wait --for=condition=ready pod -l app=pager-postgres -n learn --timeout=300s
```
#### 验证基础设施
```bash
# 检查 namespace
kubectl get namespace learn
# 检查 secrets
kubectl get secret -n learn
# 检查 PostgreSQL
kubectl get pods -n learn
kubectl logs -l app=pager-postgres -n learn
```
### 4. 配置 Gitea Actions Runner
确保 Gitea Actions Runner 已配置并运行:
**查看 Runners**: http://192.168.1.83:33000/gao/pager/settings/actions/runners
如果没有 runner,需要注册一个:
```bash
# 下载 act_runner
wget https://dl.gitea.com/act_runner/0.2.6/act_runner-0.2.6-linux-amd64
# 注册 runner
./act_runner register --instance http://192.168.1.83:33000 --token YOUR_REGISTRATION_TOKEN
# 运行 runner
./act_runner daemon
```
## 📦 部署流程
### 自动部署(推荐)
当代码推送到 `master` 或 `main` 分支时,CI/CD 流程会自动触发:
```bash
git add .
git commit -m "feat: your changes"
git push origin master
```
CI/CD 流程包括:
1. **构建阶段**:
- 构建 Backend Docker 镜像
- 构建 Frontend Docker 镜像
- 推送镜像到 Harbor
2. **部署阶段**:
- 更新 K8s Deployment
- 滚动更新应用
- 健康检查
3. **验证阶段**:
- 检查 Pod 状态
- 验证服务可达性
### 手动部署
如需手动部署,可以执行:
```bash
cd k8s
# 部署应用
kubectl apply -f deployment.yaml -n learn
kubectl apply -f service.yaml -n learn
kubectl apply -f ingress.yaml -n learn
# 检查部署状态
kubectl rollout status deployment/pager-backend -n learn
kubectl rollout status deployment/pager-frontend -n learn
# 查看 Pod
kubectl get pods -n learn -l app=pager-backend
kubectl get pods -n learn -l app=pager-frontend
```
### 访问应用
添加 hosts 记录:
```bash
echo "192.168.1.83 pager.learn.local" | sudo tee -a /etc/hosts
```
访问应用:
- **前端**: http://pager.learn.local
- **后端 API**: http://pager.learn.local/api
- **API 文档**: http://pager.learn.local/api/docs
## 📊 监控配置
### 安装 ServiceMonitor
```bash
# 部署 ServiceMonitor (需要 Prometheus Operator)
kubectl apply -f k8s/monitoring/servicemonitor.yaml
```
### 安装 Grafana Dashboard
```bash
cd k8s/monitoring
# 设置 Grafana 访问信息
export GRAFANA_URL="http://grafana.your-domain.com"
export GRAFANA_USER="admin"
export GRAFANA_PASSWORD="admin"
# 安装 Dashboard
./install-dashboard.sh
```
### 监控指标
Dashboard 包含以下监控面板:
- **Backend HTTP Requests**: API 请求速率
- **Backend Response Time**: P95/P99 响应时间
- **Pod CPU Usage**: 容器 CPU 使用率
- **Pod Memory Usage**: 容器内存使用
- **Database Connections**: 数据库连接数
- **Error Rate**: 4xx/5xx 错误率
- **Pod Restart Count**: Pod 重启次数
- **Disk Usage**: 磁盘使用率
## 🔍 故障排查
### 查看日志
```bash
# Backend 日志
kubectl logs -l app=pager-backend -n learn --tail=100 -f
# Frontend 日志
kubectl logs -l app=pager-frontend -n learn --tail=100 -f
# PostgreSQL 日志
kubectl logs -l app=pager-postgres -n learn --tail=100 -f
```
### 调试 Pod
```bash
# 进入 Backend Pod
kubectl exec -it deployment/pager-backend -n learn -- /bin/bash
# 进入 PostgreSQL Pod
kubectl exec -it deployment/pager-postgres -n learn -- psql -U postgres -d wordmaster
```
### 常见问题
#### 1. 镜像拉取失败
**症状**: `ImagePullBackOff` 或 `ErrImagePull`
**解决方案**:
```bash
# 检查 secret
kubectl get secret harbor-registry -n learn -o yaml
# 重新创建 secret
kubectl delete secret harbor-registry -n learn
kubectl create secret docker-registry harbor-registry \
--docker-server=192.168.1.83:8080 \
--docker-username=admin \
--docker-password=admin123 \
--namespace=learn
```
#### 2. Pod 启动失败
**症状**: `CrashLoopBackOff`
**解决方案**:
```bash
# 查看 Pod 事件
kubectl describe pod -l app=pager-backend -n learn
# 查看日志
kubectl logs -l app=pager-backend -n learn --previous
```
#### 3. 数据库连接失败
**症状**: Backend 日志显示数据库连接错误
**解决方案**:
```bash
# 检查 PostgreSQL 是否运行
kubectl get pods -l app=pager-postgres -n learn
# 测试数据库连接
kubectl run -it --rm debug --image=postgres:15-alpine --restart=Never -n learn -- \
psql -h pager-postgres -U postgres -d wordmaster
```
#### 4. Ingress 无法访问
**症状**: 无法通过域名访问应用
**解决方案**:
```bash
# 检查 Ingress 状态
kubectl get ingress -n learn
kubectl describe ingress pager-ingress -n learn
# 检查 Ingress Controller
kubectl get pods -n ingress-nginx
```
### 回滚部署
如果部署出现问题,可以回滚到上一个版本:
```bash
# Backend 回滚
kubectl rollout undo deployment/pager-backend -n learn
# Frontend 回滚
kubectl rollout undo deployment/pager-frontend -n learn
# 查看回滚历史
kubectl rollout history deployment/pager-backend -n learn
```
## 🔄 更新部署
### 更新环境变量
```bash
# 编辑 ConfigMap
kubectl edit configmap pager-config -n learn
# 编辑 Secret
kubectl edit secret pager-secrets -n learn
# 重启 Pod 使配置生效
kubectl rollout restart deployment/pager-backend -n learn
```
### 更新镜像
```bash
# 手动更新镜像
kubectl set image deployment/pager-backend \
backend=192.168.1.83:8080/pager/pager-backend:new-tag \
-n learn
# 查看更新状态
kubectl rollout status deployment/pager-backend -n learn
```
## 📈 性能优化
### 水平扩容
```bash
# 扩容 Backend
kubectl scale deployment pager-backend --replicas=3 -n learn
# 扩容 Frontend
kubectl scale deployment pager-frontend --replicas=3 -n learn
# 配置自动扩容 (HPA)
kubectl autoscale deployment pager-backend \
--cpu-percent=70 \
--min=2 \
--max=10 \
-n learn
```
### 资源调整
编辑 `k8s/deployment.yaml` 中的资源限制:
```yaml
resources:
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "1000m"
```
## 📝 最佳实践
1. **使用版本标签**: 避免使用 `latest` 标签,使用具体的版本号或 Git SHA
2. **健康检查**: 配置 `livenessProbe` 和 `readinessProbe`
3. **资源限制**: 设置合理的 CPU 和内存限制
4. **日志管理**: 配置日志收集和轮转
5. **备份数据库**: 定期备份 PostgreSQL 数据
6. **监控告警**: 配置 Grafana 告警规则
7. **安全加固**: 使用非 root 用户运行容器,扫描镜像漏洞
## 🆘 支持
如遇问题,请:
1. 查看 Gitea Actions 日志:http://192.168.1.83:33000/gao/pager/actions
2. 查看 Pod 日志:`kubectl logs -n learn`
3. 查看 Grafana 监控面板
4. 检查本文档的故障排查章节