674221a0cb4c767a73c7086e109ce4a4be0adb99
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
kubectl create namespace lpt-dev
kubectl create namespace lpt-prod
2. 创建 Secret(仅一次,由 CI/CD 自动管理)
# 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 全部配置
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-backupCronJob 执行 mysqldump,备份保留 14 天。 - 历史数据已从
/vol1/1000/mysql、/vol1/1000/mysql-my/LPT/prod/data迁移到/vol1/lpt,旧目录保留未删除;更换节点前先 dump 备份,再恢复到新路径。 - 局域网维护:MySQL Service 已开放 NodePort,dev 为
30306,prod 为30307;不需要对外访问时可改回 ClusterIP。
日常更新
cd ~/lpt-infra
git pull
kubectl apply -f dev/
kubectl apply -f prod/
Traefik
Traefik 以 Docker 容器运行在宿主机,通过 file provider 加载路由规则,转发到 K8s NodePort。
更新路由
# 将最新配置复制到 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 |
验证
kubectl get pods -n lpt-dev
kubectl get pods -n lpt-prod