Files
lpt-infra/README.md
T

140 lines
4.4 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/
```
## 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
```