在 Kubernetes 部署
架构概述
DataAgent 在 K8s 环境部署时需要注意以下有状态组件:
关键点:
/app/nocobase/storage必须使用 PVC 持久化存储,否则 Pod 重启会导致上传文件等数据丢失; 如果要求镜像不允许写入文件系统,那么/app/nocobase目录本身应挂载到emptyDir,不然可以不挂载。
部署配置
1. 存储声明 (PVC)
创建支持多 Pod 共享读写的存储卷:
StorageClass 选择:
- NFS:适合小规模部署
- Ceph Rook:适合生产环境,高可用
- 云存储:AWS EFS、阿里云 NAS 等
2. 部署 (Deployment)
3. Service
4. Ingress
注意:DataAgent 使用 SSE (Server-Sent Events) 进行流式响应,需要增加超时时间。
5. Secret
会话亲和性
为了优化性能,可以配置同一会话的请求路由到同一个 Pod:
说明:这不是必需的,因为 PVC 已经实现了数据共享。但配置会话亲和性可以减少跨 Pod 访问文件的开销。
依赖服务
PostgreSQL (必需)
Redis (必需)
用于多 Pod 间缓存共享,必需。
如果使用外部 Redis Sentinel,而不是在当前集群内自行部署单节点 Redis,则可以跳过本节的 redis Deployment / Service,改为在应用 Deployment 中配置 REDIS_MODE=sentinel、REDIS_SENTINEL_NAME 和 REDIS_SENTINEL_NODES 等环境变量。变量说明见 环境变量。
只读文件系统的容器
部分客户的生产环境会将容器文件系统设置为只读。对于 2.0.6 及以上版本,建议按下面方式拆分挂载:
注意:
/app/nocobase/storage和/app/nocobase是父子目录,配置volumeMounts时必须先挂载/app/nocobase/storage,再挂载/app/nocobase,否则子目录挂载可能被父目录覆盖。新版本中 PM2 运行时已经位于/app/nocobase下,不需要再单独配置pm2-home。
1. 映射 /app/nocobase/storage 到 PVC
将 /app/nocobase/storage 继续挂载到原有 PVC,可持久化上传文件、日志等业务数据:
2. 映射 /app/nocobase 到 emptyDir
将 /app/nocobase 根目录挂载到 emptyDir,用于存储应用启动和运行过程中的临时可写文件:
完整配置示例
故障排查
Pod 无法启动
-
检查 PVC 是否已绑定:
-
检查存储类是否支持 ReadWriteMany
Pod 报错 Pod ephemeral local storage usage exceeds the total limit of containers 1Gi
这个报错通常表示容器可用的临时本地存储(ephemeral local storage)不够。DataAgent 在启动时会先解压运行所需的代码和运行时文件,如果 /app/nocobase 落在容器的临时本地存储上,而 ephemeral-storage 限制又比较小,就可能在启动阶段直接触发这个错误。
可以按下面两种方式处理:
-
提升容器的
ephemeral-storage限制,建议至少调到5Gi: -
将
/app/nocobase直接挂载到 PVC,避免解压后的代码和运行文件继续占用容器本地临时存储。这种方式下,
/app/nocobase/storage不需要再单独挂载到 PVC,因为它已经包含在/app/nocobase里面了;但是/app/nocobase/runtime仍然建议单独挂载到emptyDir,用于保存运行时临时文件。注意:
/app/nocobase/runtime和/app/nocobase是父子目录,配置volumeMounts时必须先挂载/app/nocobase/runtime,再挂载/app/nocobase,保证子目录挂载优先级更高,不会被父目录覆盖。
如果当前环境已经有可用 PVC,优先建议采用第二种方式。这样既能绕开临时存储容量不足的问题,也能减少启动阶段因为解压导致的本地磁盘占用。
文件丢失
- 确认
/app/nocobase已挂载到emptyDir,/app/nocobase/storage已挂载到 PVC - 检查 Pod 重启后文件是否存在
SSE 连接中断
- 检查 Ingress timeout 配置
- 检查负载均衡器(如 AWS ALB)的 idle timeout 设置

