Files
lpt-infra/README.md
T

154 lines
5.1 KiB
Markdown
Raw 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.
# LPT Infrastructure
Kubernetes 部署清单,按环境隔离。
```
├── traefik/
│ └── dynamic.yml
├── dev/
│ ├── deployment-lpt-fe.yaml
│ ├── deployment-lpt-be.yaml
│ ├── deployment-lpt-ai.yaml
│ ├── service-lpt-fe.yaml
│ ├── service-lpt-be.yaml
│ ├── service-lpt-ai.yaml
│ ├── configmap.yaml
│ ├── mysql-deployment.yaml
│ ├── mysql-service.yaml
│ ├── mysql-storage.yaml
│ ├── mysql-backup-cronjob.yaml
│ └── lpt-logs-storage.yaml
├── prod/
│ ├── deployment-lpt-fe.yaml
│ ├── deployment-lpt-be.yaml
│ ├── deployment-lpt-ai.yaml
│ ├── service-lpt-fe.yaml
│ ├── service-lpt-be.yaml
│ ├── service-lpt-ai.yaml
│ ├── configmap.yaml
│ ├── mysql-deployment.yaml
│ ├── mysql-service.yaml
│ ├── mysql-storage.yaml
│ ├── mysql-backup-cronjob.yaml
│ └── lpt-logs-storage.yaml
└── README.md
```
## 首次部署
### 1. 创建 namespace
```bash
kubectl create namespace lpt-dev
kubectl create namespace lpt-prod
```
### 2. 创建 Secret(仅一次,由 CI/CD 自动管理)
```bash
# dev
kubectl create secret generic lpt-secrets \
--from-literal=llm-api-key=sk-xxx \
--from-literal=mysql-root-password=xxx \
-n lpt-dev
kubectl create secret docker-registry regcred \
--docker-server=192.168.123.199:5000 \
--docker-username=admin \
--docker-password=xxx \
-n lpt-dev
# prod
kubectl create secret generic lpt-secrets \
--from-literal=llm-api-key=sk-xxx \
--from-literal=mysql-root-password=xxx \
-n lpt-prod
kubectl create secret docker-registry regcred \
--docker-server=192.168.123.199:5000 \
--docker-username=admin \
--docker-password=xxx \
-n lpt-prod
```
### 3. Apply 全部配置
```bash
kubectl apply -f dev/
kubectl apply -f prod/
```
`kubectl apply -f dev/` / `prod/` 会同时创建 MySQL 的 Service、PV/PVC、Deployment 和每日备份 CronJob。
## 数据库(MySQL
MySQL 与业务服务一起由清单管理,每个 namespace 一个 `mysql` Deployment 和 NodePort Service(端口 3306),数据通过 hostPath PV/PVC 持久化。
| 项目 | dev | prod |
|------|-----|------|
| 镜像 | `mysql:9` | `mysql:8.0` |
| 数据目录 | `/vol1/lpt/mysql/dev/data` | `/vol1/lpt/mysql/prod/data` |
| 备份目录 | `/vol1/lpt/backup/dev` | `/vol1/lpt/backup/prod` |
| 日志目录 | `/vol1/lpt/logs/dev` | `/vol1/lpt/logs/prod` |
| 数据库 | `learning_progress_tracker` | `lpt_prod` |
- LPT 数据统一放在 `/vol1/lpt` 下:MySQL 数据、备份、lpt-ai 日志(挂载到容器 `/app/data`,持久化 `logs.json`)。
- PV 使用 hostPath 并绑定节点 `cw8505fnos`;新环境需要同步修改 `mysql-storage.yaml` / `lpt-logs-storage.yaml` 中的路径和节点名。
- dev 使用 `mysql:9`;若 Docker Hub 不可达,可先在本机 containerd 打标签:`ctr -n k8s.io images tag docker.io/library/mysql:latest docker.io/library/mysql:9`
- root 密码来自 Secret `lpt-secrets.mysql-root-password`,应用当前以 root 连接数据库。
- 表结构由 lpt-be 启动时的 Flyway 自动迁移,不需要手工建表。
- 每日 03:00 通过 `mysql-backup` CronJob 执行 mysqldump,备份保留 14 天。
- 历史数据已从 `/vol1/1000/mysql``/vol1/1000/mysql-my/LPT/prod/data` 迁移到 `/vol1/lpt`,旧目录保留未删除;更换节点前先 dump 备份,再恢复到新路径。
- 局域网维护:MySQL Service 已开放 NodePortdev 为 `30306`prod 为 `30307`;不需要对外访问时可改回 ClusterIP。
## 日常更新
```bash
cd ~/lpt-infra
git pull
kubectl apply -f dev/
kubectl apply -f prod/
```
## 手动部署流水线
`lpt-infra` 提供 Gitea Actions 手动流水线(`.gitea/workflows/deploy.yml`),只支持手动触发,不会随 push 自动执行。
使用方式:
1. 在 lpt-infra 仓库配置 Secret `KUBECONFIG_B64`kubeconfig 的 base64)。
2. Gitea → lpt-infra → Actions → Run workflow。
3. 选择 `environment``all` / `dev` / `prod`
流水线会 checkout 最新代码并执行 `kubectl apply -f dev/``kubectl apply -f prod/`
注意:整目录 apply 会把 Deployment 镜像 tag 重置为清单中的 `:dev` / `:prod`;如果 app CI 用不可变 tag 管理镜像,建议 app 发布后不要立即整目录 apply,或只 apply 本次变更的清单。
## Traefik
Traefik 以 Docker 容器运行在宿主机,通过 file provider 加载路由规则,转发到 K8s NodePort。
### 更新路由
```bash
# 将最新配置复制到 Traefik 挂载目录
sudo cp traefik/dynamic.yml /etc/traefik/dynamic/k8s-lpt.yml
# Traefik 自动检测文件变更,无需重启
# 或手动验证
sudo docker exec traefik cat /etc/traefik/dynamic/k8s-lpt.yml
```
### 端口对照
| 服务 | dev NodePort | prod NodePort |
|------|-------------|---------------|
| lpt-fe | 30080 | 30180 |
| lpt-be (api) | 30082 | 30182 |
| lpt-ai | ClusterIP | ClusterIP |
| mysql | 30306 | 30307 |
## 验证
```bash
kubectl get pods -n lpt-dev
kubectl get pods -n lpt-prod
```