Kubernetes 部署要点
发行包不含 Helm 或 Kubernetes 清单;列出在 Kubernetes 上自行编排时,探针、密钥、存储、粘性会话与机器绑定方面有源码依据的要点。
概述
当前发行包不提供 Helm 包或 Kubernetes 清单,也没有配套的编排工具。产品是一个 jar 加外部数据库,因此可以把它当作普通的有状态 Web 应用来编排。本文只列出程序行为决定的要点,镜像构建见 容器化部署。
要点
| 主题 | 做法 | 依据 |
|---|---|---|
| 镜像 | 含 Java 21+ 完整运行时的镜像(JDK 或 JRE) | 2.0.61 之前的版本运行期需要 javac,须用 JDK 镜像 |
| 配置库连接 | 用 Secret 注入 MR_DB_URL、MR_DB_USERNAME、MR_DB_PASSWORD |
环境变量优先于配置文件,密码不落盘 |
| 首个管理员 | 连接全新空库时,用 Secret 注入 MR_ADMIN_ACCOUNT、MR_ADMIN_PASSWORD;库里已有管理员后可以去掉 |
见 Docker 部署「首个管理员」 |
| 加密密钥 | 用 Secret 固定 SIGHTDATA_DATASOURCE_KEY、SIGHTDATA_AI_KEY、SIGHTDATA_SERVER_KEY、SIGHTDATA_FRONT_KEY,所有副本一致 |
见 配置项参考 |
| 授权 | 授权存在配置库,副本之间自动同步;也可用 MR_LICENSE_CODE(或 MR_LICENSE_FILE / 工作目录下的 report-license.txt)在配置库为空时自动注册 |
见 授权与许可 |
| 机器绑定 | 授权带绑定时,注入稳定的 MR_MACHINE_FP;Pod 内会自动获取集群标识,也可用 MR_CLUSTER_UID 显式指定 |
机器身份采集逻辑 |
| 持久化 | data/ 目录按需挂载卷(备份包、驱动、插件、字体、内置 H2) |
目录布局见配置项参考 |
| 多副本 | 需要 Redis 与粘性会话,见 集群与高可用 | 报表缓存在节点本地内存 |
| 服务暴露 | Ingress 或 Service 前置,需支持 WebSocket、SSE,上传大小不小于 220MB | 以所用 Ingress 控制器的配置项为准 |
探针
程序提供 GET /api/health,无需登录,Setup 模式下也可访问。只要进程存活就返回 HTTP 200,status 恒为 UP;是否已初始化、配置库是否可达、是否就绪,由返回 JSON 中的字段表达:
| 字段 | 含义 |
|---|---|
dbReachable |
配置库是否可达 |
initialized |
是否已初始化 |
mode |
SINGLE 或 CLUSTER |
ready |
已初始化且运行时就绪 |
因此:
- 存活探针可以用
httpGet访问/api/health,返回 200 即视为存活。 - 需要「就绪」语义时,
httpGet不够,因为未就绪时也返回 200。可以用exec探针执行curl并检查响应体中的"ready":true(镜像中需有curl)。 - 配置库暂时不可达时,程序不会退出,而是降级启动并每 15 秒重试,此时存活探针仍然通过,就绪判断应看
ready。 - 启动时间包含数据库迁移,
startupProbe或initialDelaySeconds请留足余量。
清单示例
以下为示例片段,非官方模板,未经发行流程验证:
apiVersion: apps/v1
kind: Deployment
metadata:
name: sight-report
spec:
replicas: 1
selector:
matchLabels: { app: sight-report }
template:
metadata:
labels: { app: sight-report }
spec:
containers:
- name: sight-report
image: registry.example.com/sight-report:2.0.64
ports:
- containerPort: 9091
env:
- name: MR_DB_URL
valueFrom: { secretKeyRef: { name: sight-db, key: url } }
- name: MR_DB_USERNAME
valueFrom: { secretKeyRef: { name: sight-db, key: username } }
- name: MR_DB_PASSWORD
valueFrom: { secretKeyRef: { name: sight-db, key: password } }
livenessProbe:
httpGet: { path: /api/health, port: 9091 }
initialDelaySeconds: 60
periodSeconds: 15
volumeMounts:
- { name: data, mountPath: /app/data }
volumes:
- name: data
persistentVolumeClaim: { claimName: sight-data }
注意:
replicas大于 1 之前,必须先完成 集群与高可用 中的 Redis 与粘性会话配置,并切换到集群模式。