Files
huty bd1acebcf3
CI — Docker Build & Push / Build & Push Image (push) Failing after 14m47s
新增 k8s 部署文件
2026-04-24 11:30:16 +09:00
..
2026-04-24 11:30:16 +09:00
2026-04-24 11:30:16 +09:00
2026-04-24 11:30:16 +09:00
2026-04-24 11:30:16 +09:00
2026-04-24 11:30:16 +09:00
2026-04-24 11:30:16 +09:00
2026-04-24 11:30:16 +09:00
2026-04-24 11:30:16 +09:00
2026-04-24 11:30:16 +09:00

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 汇总

部署前准备

  1. 构建并推送镜像

    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。

  2. 修改 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.yamlresources: 中移除 01-secret.yaml,避免被覆盖。

  3. 确认 StorageClass

    10-mysql.yaml20-app-pvc.yamlstorageClassName 默认注释掉, 会走集群默认 StorageClass。可用下面的命令确认:

    kubectl get sc
    
  4. 修改域名与 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 个应用副本。如要扩容:

  1. PVC accessModes 必须改成 ReadWriteMany,且集群需要支持 RWX 的 StorageClassNFS/CephFS/云厂商 file 存储)。
  2. entrypoint.sh 中的 init_db 在多副本并发执行时会重复,建议把初始化逻辑 拆成独立的 Kubernetes Job,在 Deployment 启动前一次性跑完。
  3. Gunicorn 本身无状态,Session 存在 cookie 中,水平扩容无额外依赖。