Kubernetes 部署说明
文件结构
k8s/
├── 00-namespace.yaml # 命名空间
├── 01-secret.yaml # 敏感凭证(部署前必改)
├── 02-configmap.yaml # 非敏感配置
├── 10-mysql.yaml # MySQL StatefulSet + Headless Service
├── 20-app-pvc.yaml # 上传文件 PVC
├── 21-app.yaml # Flask Deployment + Service
├── 30-ingress.yaml # 外部访问入口
└── kustomization.yaml # Kustomize 汇总
部署前准备
-
构建并推送镜像
docker build -t ghcr.io/<org>/resource-library:1.0.0 . docker push ghcr.io/<org>/resource-library:1.0.0然后修改
21-app.yaml中的image:字段,或在kustomization.yaml里用images:字段覆盖 tag。 -
修改 Secret
编辑
01-secret.yaml,把所有CHANGE_ME_*替换成真实强密码。 推荐直接用kubectl创建,避免明文入库:kubectl create namespace resource-library kubectl -n resource-library create secret generic resource-library-secret \ --from-literal=MYSQL_ROOT_PASSWORD="$(openssl rand -base64 24)" \ --from-literal=MYSQL_PASSWORD="$(openssl rand -base64 24)" \ --from-literal=SECRET_KEY="$(python -c 'import secrets;print(secrets.token_hex(32))')" \ --from-literal=ADMIN_PASSWORD='StrongAdmin@2026'同时从
kustomization.yaml的resources:中移除01-secret.yaml,避免被覆盖。 -
确认 StorageClass
10-mysql.yaml和20-app-pvc.yaml中storageClassName默认注释掉, 会走集群默认 StorageClass。可用下面的命令确认:kubectl get sc -
修改域名与 Ingress
编辑
30-ingress.yaml,把prl.example.com改成真实域名。 如不使用 cert-manager,请手工准备 TLS secret:kubectl -n resource-library create secret tls resource-library-tls \ --cert=fullchain.pem --key=privkey.pem
部署
kubectl apply -k k8s/
查看状态:
kubectl -n resource-library get pods,svc,pvc,ingress
kubectl -n resource-library logs -f deploy/resource-library-app
常见运维
-
重启应用
kubectl -n resource-library rollout restart deploy/resource-library-app -
进入 MySQL 执行 SQL(例如修复
resources.folder_id缺失)kubectl -n resource-library exec -it mysql-0 -- \ mysql -uroot -p"$MYSQL_ROOT_PASSWORD" resource_library -
备份数据库
kubectl -n resource-library exec mysql-0 -- \ sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" resource_library' \ > backup.sql
多副本扩容注意事项
默认为 1 个应用副本。如要扩容:
- PVC
accessModes必须改成ReadWriteMany,且集群需要支持 RWX 的 StorageClass(NFS/CephFS/云厂商 file 存储)。 entrypoint.sh中的init_db在多副本并发执行时会重复,建议把初始化逻辑 拆成独立的 Kubernetes Job,在 Deployment 启动前一次性跑完。- Gunicorn 本身无状态,Session 存在 cookie 中,水平扩容无额外依赖。