This commit is contained in:
Yvan
2026-09-04 14:07:09 +08:00
parent af1e194396
commit 43db5e5450
22 changed files with 416 additions and 134 deletions
+7 -7
View File
@@ -1,12 +1,12 @@
# 后端配置文件模板。
# 部署人员将其放置到 K8s 节点的 /var/lib/<APP_NAME>/conf/config.yaml(默认 kra 项目为 /var/lib/kra/conf/config.yaml),
# 并执行 chown -R 1000:1000 /var/lib/<APP_NAME>/conf(容器内运行用户为 UID/GID 1000)。
# Jenkins 会用 APP_NAME 渲染本文件,并通过 ConfigMap/初始化容器写入共享配置 PVC。
# 容器内运行用户为 UID/GID 1000,初始化向导会把运行时配置写回本文件。
#
# 说明:
# - data.database 保持为空:应用启动后首页会出现"前往初始化",
# 在初始化页面填写数据库连接后,框架会自动把连接配置写回本文件。
# - data.redis.addr 指向集群内 Redis Service(<APP_NAME>-redis:6379)。
# - admin.app.env / admin.app.app_id 按项目实际值修改。
# - admin.app.env / admin.app.app_id / admin.jwt.issuer 由 Jenkins 按项目和分支渲染。
server:
http:
network: tcp
@@ -31,7 +31,7 @@ data:
redis:
network: tcp
name: default
addr: kra-redis:6379
addr: ${APP_NAME}-redis:6379
password: ""
db: 0
use_cluster: false
@@ -43,7 +43,7 @@ admin:
signing_key: ""
expires_time: 604800s
buffer_time: 86400s
issuer: kra
issuer: ${APP_NAME}
system:
use_redis: false
use_multipoint: false
@@ -67,5 +67,5 @@ admin:
mode: whitelist
whitelist: []
app:
app_id: kra
env: production
app_id: ${APP_NAME}
env: ${KRA_ENV}
+94 -13
View File
@@ -7,6 +7,7 @@
# KRA_BACKEND_NODEPORT node port for the backend debug service
# KRA_MYSQL_IMAGE mysql server image
# KRA_REDIS_IMAGE redis server image
# KRA_SHARED_STORAGE_CLASS RWX storage class for config and uploads
# KRA_BACKEND_IMAGE backend image built by Jenkins
# KRA_FRONTEND_IMAGE frontend image built by Jenkins
# BIN_NAME backend binary name inside the image
@@ -84,6 +85,20 @@ spec:
---
apiVersion: v1
kind: Service
metadata:
name: ${KRA_APP}-mysql
namespace: ${KRA_NAMESPACE}
spec:
clusterIP: None
selector:
app.kubernetes.io/name: ${KRA_APP}-mysql
ports:
- name: mysql
port: 3306
targetPort: mysql
---
apiVersion: v1
kind: Service
metadata:
name: ${KRA_APP}-redis
namespace: ${KRA_NAMESPACE}
@@ -114,10 +129,25 @@ spec:
app.kubernetes.io/name: ${KRA_APP}-redis
app.kubernetes.io/part-of: ${KRA_APP}
spec:
initContainers:
- name: prepare-redis-storage
image: ${KRA_REDIS_IMAGE}
imagePullPolicy: IfNotPresent
securityContext:
runAsUser: 0
runAsGroup: 0
command: ["sh", "-c"]
args:
- chown -R redis:redis /data
volumeMounts:
- name: redis-data
mountPath: /data
containers:
- name: redis
image: ${KRA_REDIS_IMAGE}
imagePullPolicy: IfNotPresent
securityContext:
runAsNonRoot: true
ports:
- name: redis
containerPort: 6379
@@ -173,7 +203,33 @@ spec:
app.kubernetes.io/name: ${KRA_APP}-backend
app.kubernetes.io/part-of: ${KRA_APP}
spec:
# /data/conf 由部署人员预先放置 config.yaml(见 deploy/k8s/config.example.yaml),
securityContext:
fsGroup: 1000
fsGroupChangePolicy: OnRootMismatch
initContainers:
- name: initialize-shared-storage
image: ${KRA_BACKEND_IMAGE}
imagePullPolicy: Always
securityContext:
runAsUser: 1000
runAsGroup: 1000
command: ["sh", "-c"]
args:
- >-
mkdir -p /data/conf /app/uploads;
if [ ! -f /data/conf/config.yaml ]; then
cp /bootstrap/config.yaml /data/conf/config.yaml;
fi;
chmod u+rwX,g+rwX /data/conf /data/conf/config.yaml /app/uploads
volumeMounts:
- name: config
mountPath: /data/conf
- name: uploads
mountPath: /app/uploads
- name: config-template
mountPath: /bootstrap
readOnly: true
# /data/conf 由初始化容器从 ConfigMap 初始化到共享 PVC,
# 目录必须可写:初始化向导会把数据库连接写回该文件。
imagePullSecrets:
- name: harbor-registry
@@ -198,16 +254,12 @@ spec:
env:
# 数据库连接不在这里注入:应用启动时未配置数据库会进入 bootstrap 模式,
# 首页出现"前往初始化",由 /init/initdb 建表、写入种子数据并持久化连接配置。
# 只注入 JWT 签名密钥;Redis 地址已在下方 config.yaml 中指定。
- name: KRA_ADMIN_JWT_SIGNING_KEY
valueFrom:
secretKeyRef:
name: ${KRA_APP}-runtime
key: jwt-signing-key
# JWT 签名密钥由 /data/conf/config.yaml 唯一管理,避免环境变量覆盖管理页面的配置变更;
# Redis 地址已在下方 config.yaml 中指定。
- name: KRA_ADMIN_SYSTEM_USE_REDIS
value: "true"
volumeMounts:
- name: conf
- name: config
mountPath: /data/conf
- name: uploads
mountPath: /app/uploads
@@ -235,12 +287,41 @@ spec:
cpu: 500m
memory: 1Gi
volumes:
- name: conf
hostPath:
path: /var/lib/${KRA_APP}/conf
type: DirectoryOrCreate
- name: config
persistentVolumeClaim:
claimName: ${KRA_APP}-config
- name: uploads
emptyDir: {}
persistentVolumeClaim:
claimName: ${KRA_APP}-uploads
- name: config-template
configMap:
name: ${KRA_APP}-config-template
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ${KRA_APP}-config
namespace: ${KRA_NAMESPACE}
spec:
storageClassName: ${KRA_SHARED_STORAGE_CLASS}
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ${KRA_APP}-uploads
namespace: ${KRA_NAMESPACE}
spec:
storageClassName: ${KRA_SHARED_STORAGE_CLASS}
accessModes:
- ReadWriteMany
resources:
requests:
storage: 20Gi
---
apiVersion: v1
kind: Service
-3
View File
@@ -14,6 +14,3 @@ type: Opaque
stringData:
# 替换为随机值;不要把真实密码提交进 Git。
mysql-root-password: "CHANGE_ME_TO_A_RANDOM_VALUE"
database-source: "root:CHANGE_ME_TO_A_RANDOM_VALUE@tcp(<APP_NAME>-mysql:3306)/<APP_NAME>?charset=utf8mb4&parseTime=True&loc=Local"
redis-addr: "<APP_NAME>-redis:6379"
jwt-signing-key: "CHANGE_ME_TO_A_LONG_RANDOM_VALUE"