kra-new/deploy
Yvan af1e194396 jenkins 2026-09-04 10:51:45 +08:00
..
k8s jenkins 2026-09-04 10:51:45 +08:00
DEPLOYMENT.md jenkins 2026-09-04 10:51:45 +08:00
Jenkinsfile jenkins 2026-09-04 10:51:45 +08:00
README.md jenkins 2026-09-04 10:51:45 +08:00

README.md

KRA CI/CD 部署

deploy/ 目录是一套与项目名解耦的部署模板,基于 kra 框架的新项目可以整体复制后只改一个参数块。

完整的环境配置、凭据来源与排障说明见 DEPLOYMENT.md

分支和集群的对应关系:

  • dev -> Rancher 集群 128 -> 命名空间 <APP_NAME>-dev
  • main -> Rancher 集群 129 -> 命名空间 <APP_NAME>-prod

代码仓库:http://192.168.200.130/root/kra。自动触发使用 GitLab Jenkins 集成(项目 设置 → 集成 → Jenkins

  • Jenkins 服务器 URLhttp://192.168.200.131:8080Project namekra,填入 Jenkins 用户名/密码(凭据由 GitLab 保管,无需手动维护 webhook 或请求头)
  • 集成会把完整 push 事件(含 ref 分支POST 到 Jenkins /project/<job> 端点gitlab-plugin 注入 gitlabBranch 环境变量
  • deploy/JenkinsfileSelect environment 阶段按 gitlabBranch 路由:单 job kra 同时服务 dev/main 两个环境,Checkout branch 阶段动态检出实际推送的分支
  • 手动构建兜底:kra job 手动触发时默认部署 main不识别 tagtag 仅作版本标记,不触发部署)

每个环境包含 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 持久化。当前两个 Rancher 集群都只有一个节点,这种方式适合当前环境,不提供数据库跨节点高可用。

Jenkins 前置条件

Jenkins 节点需要可用的 Docker CLI/daemon、kubectlenvsubstGo 编译和前端构建在临时容器内完成。Jenkins 凭据 ID 需要与 deploy/Jenkinsfile 中的 CRED_* 变量一致:

  • harbor-library-push: Harbor 192.168.200.132 的推送账号
  • 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。

访问地址

  • 集群 128: http://192.168.200.128:30080
  • 集群 129: http://192.168.200.129:30080
  • 后端调试: 对应节点的 30081

首次部署初始化

前置:放置配置文件

后端启动读取 /data/conf/config.yaml,该目录以 hostPath /var/lib/<APP_NAME>/conf 挂载到 K8s 节点。部署人员在目标集群节点上执行(以 kra 项目为例):

mkdir -p /var/lib/kra/conf
# 把 deploy/k8s/config.example.yaml 复制为 /var/lib/kra/conf/config.yaml按需修改
chown -R 1000:1000 /var/lib/kra/conf

容器内运行用户为 UID/GID 1000目录必须可写初始化向导会把数据库连接和 JWT 密钥写回该文件。

初始化

部署后数据库未配置,应用以 bootstrap 模式启动,首页会出现前往初始化。在初始化页面填写数据库连接(以 kra 项目为例):

字段
数据库类型 mysql
主机 kra-mysql(集群内 Service 名)
端口 3306
用户名 root
密码 Jenkins 凭据 kra-mysql-root-password 的值
库名 kra(与应用名一致)

提交后框架自动建表、写入种子数据管理员账号、菜单、casbin并把连接配置写回节点的 config.yamlPod 重建后配置不丢失。多副本共享同一目录,初始化完成后会自动滚动重启后端让所有副本加载新配置。不要通过环境变量注入数据库 DSN那会让应用跳过初始化向导导致数据库有表无种子数据、无法登录。

基于 kra 模板接入新项目

复制 deploy/ 目录到新项目,然后只需修改 deploy/Jenkinsfile 顶部的 项目级参数块

变量 说明 默认值kra 项目)
APP_NAME 应用名,派生所有 K8s 资源名、数据库名、hostPath、镜像后缀 kra
IMAGE_REPO Harbor 镜像仓库路径 library/kra
REGISTRY Harbor 地址 192.168.200.132
BIN_NAME 后端二进制名,须与 Makefilemake build 产物一致 kratos-admin
REPLICAS 前后端副本数 3
FRONTEND_NODEPORT / BACKEND_NODEPORT NodePort 端口,同一集群多个项目必须错开 30080 / 30081
MYSQL_IMAGE / REDIS_IMAGE 中间件镜像 daocloud mysql:8.4 / redis:7-alpine
GO_IMAGE / NODE_IMAGE / PNPM_VERSION 构建镜像与工具版本 见文件
CACHE_DIR Jenkins 宿主机依赖缓存目录(建议每项目独立) /var/lib/kra-ci-cache
DEV_CLUSTER_HOST / PROD_CLUSTER_HOST dev/main 分支部署的目标集群 192.168.200.128 / 192.168.200.129
CRED_* Jenkins 凭据 ID沿用现有凭据可不改 见文件

模板渲染机制

  • deploy/k8s/kra.yaml 是 K8s 清单模板,由 Jenkins 用 envsubst "$K8S_RENDER_VARS" 白名单渲染。所有资源名都以 ${KRA_APP} 为前缀(由 APP_NAME 注入),不要把新的 $变量 混入清单(白名单外的 $... 会原样保留,例如 MySQL probe 里的 $MYSQL_ROOT_PASSWORD)。

  • 前端 Nginx 配置 web/.docker-compose/nginx/conf.d/my.conf 中的后端服务名写作 ${KRA_APP}-backendJenkins 构建前端镜像前渲染为 web/nginx.k8s.conf(已 gitignore。本地手动构建 web 镜像前需先执行:

    envsubst '$KRA_APP' < web/.docker-compose/nginx/conf.d/my.conf > web/nginx.k8s.conf
    

命名约定

资源 名称
Deployment/Service <APP_NAME>-backend<APP_NAME>-frontend<APP_NAME>-redis
StatefulSet/Service <APP_NAME>-mysql
ConfigMap <APP_NAME>-config
运行时 Secret <APP_NAME>-runtimekeymysql-root-passworddatabase-sourceredis-addrjwt-signing-key
数据库名 <APP_NAME>

internal/logging 等框架代码与项目名无关,接入新项目时无需修改。