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-backup CronJob 执行 mysqldump,备份保留 14 天。
  • 历史数据已从 /vol1/1000/mysql/vol1/1000/mysql-my/LPT/prod/data 迁移到 /vol1/lpt,旧目录保留未删除;更换节点前先 dump 备份,再恢复到新路径。
  • 局域网维护:MySQL Service 已开放 NodePortdev 为 30306prod 为 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
S
Description
No description provided
Readme
57 KiB