This commit is contained in:
Yvan
2026-09-04 15:25:49 +08:00
parent 43db5e5450
commit 372e119e7c
5 changed files with 84 additions and 68 deletions
+7 -7
View File
@@ -16,9 +16,9 @@ deploy/ 目录是一套与项目名解耦的部署模板,基于 kra 框架的
- `deploy/Jenkinsfile` 的 `Select environment` 阶段按 `gitlabBranch` 路由:单 job `kra` 同时服务 dev/main 两个环境,构建阶段优先按 push payload 的最终提交 SHA 检出
- 手动构建兜底:`kra` job 手动触发时默认部署 main(不识别 tag,tag 仅作版本标记,不触发部署)
每个环境包含 3 个后端 Pod、3 个前端 Pod、1 个 MySQL Pod 和 1 个 Redis Pod。前端通过 `<APP_NAME>-backend` ClusterIP Service 访问后端,Kubernetes Service 在 Pod 之间做负载均衡;前端通过 NodePort `30080` 暴露,后端调试入口通过 NodePort `30081` 暴露。后端配置和上传文件使用支持 `ReadWriteMany` 的共享 PVC。
每个环境包含 3 个后端 Pod、3 个前端 Pod、1 个 MySQL Pod 和 1 个 Redis Pod。前端通过 `<APP_NAME>-backend` ClusterIP Service 访问后端,Kubernetes Service 在 Pod 之间做负载均衡;前端通过 NodePort `30080` 暴露,后端调试入口通过 NodePort `30081` 暴露。
MySQL 和 Redis 使用节点本地目录 `/var/lib/<APP_NAME>/mysql`、`/var/lib/<APP_NAME>/redis` 持久化。Redis 部署会先用一次性 root initContainer 修正 hostPath 权限,主进程仍以镜像内的非 root 用户运行。当前两个 Rancher 集群都只有一个节点,这种方式适合当前环境,不提供数据库跨节点高可用。
MySQL、Redis、后端配置和上传文件都使用 `/var/lib/<APP_NAME>/` 下的节点本地目录。Redis 和后端会先用 root initContainer 修正 hostPath 根目录权限;后端通过 required podAffinity 固定到 MySQL 所在节点。当前两个 Rancher 集群都只有一个节点,这种方式适合当前环境,但不是真正的 RWX,也不提供跨节点高可用;扩展到多节点前必须迁移到 NFS、CephFS 等共享存储。
## Jenkins 前置条件
@@ -28,6 +28,7 @@ Jenkins 节点需要可用的 Docker CLI/daemon、`kubectl` 和 `envsubst`(Go
- `kra-rke2-128-kubeconfig`: 集群 128 的 kubeconfig 文件
- `kra-rke2-129-kubeconfig`: 集群 129 的 kubeconfig 文件
- `kra-mysql-root-password`: 应用专用 MySQL root 密码
- `kra-jwt-signing-key`: 首次生成配置文件时使用的 JWT 签名密钥
Harbor 项目和 Kubernetes 两个环境都会由流水线自动创建 `harbor-registry` 镜像拉取 Secret。不要把真实密码写入 Git。
@@ -41,7 +42,7 @@ Harbor 项目和 Kubernetes 两个环境都会由流水线自动创建 `harbor-r
### 前置:放置配置文件
后端启动读取 `/data/conf/config.yaml`。流水线会把 `deploy/k8s/config.example.yaml` 渲染成 ConfigMap,并由初始化容器复制到共享配置 PVC;容器内运行用户为 UID/GID 1000,初始化向导会把数据库连接和 JWT 密钥写回该文件。
后端启动读取 `/data/conf/config.yaml`。流水线会把 `deploy/k8s/config.example.yaml` 渲染成 Kubernetes Secret,并由初始化容器首次复制到节点目录 `/var/lib/<APP_NAME>/conf`;容器内运行用户为 UID/GID 1000,初始化向导会把数据库连接和 JWT 密钥写回该文件。
### 初始化
@@ -56,7 +57,7 @@ Harbor 项目和 Kubernetes 两个环境都会由流水线自动创建 `harbor-r
| 密码 | Jenkins 凭据 `kra-mysql-root-password` 的值 |
| 库名 | `kra`(与应用名一致) |
提交后框架自动建表、写入种子数据(管理员账号、菜单、casbin)并把连接配置写回共享 PVC 中的 `config.yaml`,Pod 重建后配置不丢失。初始化期间建议暂时保持后端为 1 个副本,完成后再扩容到 `KRA_REPLICAS`,避免多个 Pod 同时执行首次初始化。初始化完成后请执行一次后端滚动重启,让所有副本加载新配置。**不要**通过环境变量注入数据库 DSN:那会让应用跳过初始化向导,导致数据库有表无种子数据、无法登录。
提交后框架自动建表、写入种子数据(管理员账号、菜单、casbin)并把连接配置写回节点目录中的 `config.yaml`,Pod 重建后配置不丢失。初始化期间建议暂时保持后端为 1 个副本,完成后再扩容到 `KRA_REPLICAS`,避免多个 Pod 同时执行首次初始化。初始化完成后请执行一次后端滚动重启,让所有副本加载新配置。**不要**通过环境变量注入数据库 DSN:那会让应用跳过初始化向导,导致数据库有表无种子数据、无法登录。
## 基于 kra 模板接入新项目
@@ -64,14 +65,13 @@ Harbor 项目和 Kubernetes 两个环境都会由流水线自动创建 `harbor-r
| 变量 | 说明 | 默认值(kra 项目) |
|---|---|---|
| `APP_NAME` | 应用名,派生所有 K8s 资源名、数据库名、存储声明、镜像后缀 | `kra` |
| `APP_NAME` | 应用名,派生所有 K8s 资源名、数据库名、本地存储路径、镜像后缀 | `kra` |
| `IMAGE_REPO` | Harbor 镜像仓库路径 | `library/kra` |
| `REGISTRY` | Harbor 地址 | `192.168.200.132` |
| `BIN_NAME` | 后端二进制名,须与 `Makefile` 的 `make build` 产物一致 | `kratos-admin` |
| `KRA_REPLICAS` | 前后端副本数 | `3` |
| `KRA_FRONTEND_NODEPORT` / `KRA_BACKEND_NODEPORT` | NodePort 端口,同一集群多个项目必须错开 | `30080` / `30081` |
| `KRA_MYSQL_IMAGE` / `KRA_REDIS_IMAGE` | 中间件镜像 | daocloud mysql:8.4 / redis:7-alpine |
| `KRA_SHARED_STORAGE_CLASS` | 支持 `ReadWriteMany` 的共享存储类 | `longhorn` |
| `GO_IMAGE` / `NODE_IMAGE` / `PNPM_VERSION` | 构建镜像与工具版本 | 见文件 |
| `CACHE_DIR` | Jenkins 宿主机依赖缓存目录(建议每项目独立) | `/var/lib/kra-ci-cache` |
| `CRED_*` | Jenkins 凭据 ID,沿用现有凭据可不改 | 见文件 |
@@ -91,7 +91,7 @@ Harbor 项目和 Kubernetes 两个环境都会由流水线自动创建 `harbor-r
|---|---|
| Deployment/Service | `<APP_NAME>-backend`、`<APP_NAME>-frontend`、`<APP_NAME>-redis` |
| StatefulSet/Service | `<APP_NAME>-mysql` |
| ConfigMap | `<APP_NAME>-config-template` |
| 配置模板 Secret | `<APP_NAME>-config-template` |
| 运行时 Secret | `<APP_NAME>-runtime`(key:`mysql-root-password`) |
| 数据库名 | `<APP_NAME>` |