存储架构
本文档描述 TFRS Operator 管理的数据存储方案,包括各中间件的部署模式、存储配置优先级和隔离模型。
存储配置优先级
TFRS Operator 使用三级优先级链解析存储配置:
组件级配置 > 租户级配置 > 系统默认
| 优先级 | 配置来源 | 示例 |
|---|---|---|
| 1 - 组件级 | spec.postgresql.storage、spec.redis.storage 等 | 单独为 PostgreSQL 指定 100Gi 和 cbs-ssd StorageClass |
| 2 - 租户级 | spec.storage | 租户统一的默认 StorageClass 和大小 |
| 3 - 系统默认 | 代码硬编码 | 10Gi,使用集群默认 StorageClass |
在 TFRTenant 中配置示例:
apiVersion: infra.tfrobot.io/v1
kind: TFRTenant
spec:
# 租户级默认(优先级 2)
storage:
storageClass: "cbs-ssd"
size: "50Gi"
# 组件级覆盖(优先级 1)
postgresql:
storage:
storageClass: "cbs-ssd-enhanced"
size: "200Gi"
redis:
storage:
size: "20Gi" # 使用租户级 storageClass: cbs-ssd
PostgreSQL
部署方式
通过 CloudNativePG (CNPG) 管理,TFRTenant 为每个租户创建独立的 CNPG Cluster:
| 配置项 | 值 |
|---|---|
| Cluster 名称 | {namespace}-pg |
| 镜像 | ghcr.io/cloudnative-pg/postgresql:16-minimal-bookworm |
| 凭据 Secret | {namespace}-pg-credentials |
| 默认存储 | 10Gi(可通过优先级链覆盖) |
凭据管理
username:用户指定(不能是postgres,CNPG 保留)password:用户指定或 Operator 自动生成
TFRS Operator 仅提供数据库级别(Database-level)隔离,不管理 Schema 级别隔离。
每个 TFRTenant 获得一个独立的 CNPG Cluster(独立 Pod 和 PVC),实现了数据库实例级隔离。但在同一个数据库内,多个 TFRServer 共享同一数据库时的 Schema 隔离需要应用层自行管理。
| 职责 | 负责方 | 自动化程度 |
|---|---|---|
| Database 创建 | Operator(自动) | 全自动 |
| Schema 创建 | Python 应用(db-init 脚本) | 半自动(由 TFRServer Job 触发) |
| Schema 命名与隔离 | 运维方(通过 TFS_ROBOT__DB_SCHEMA 配置) | 手动配置 |
| Schema 冲突检测 | 无 | 无校验机制 |
风险:如果两个 TFRServer 配置了相同的 TFS_ROBOT__DB_SCHEMA,它们将共享同一 Schema,可能导致数据冲突。运维人员需要自行确保 Schema 名称唯一性。
Redis
部署方式
以 Kubernetes Deployment + PVC 方式部署,非 Operator 管理:
| 配置项 | 值 |
|---|---|
| 镜像 | redis/redis-stack-server:7.2.0-v17 |
| PVC 名称 | redis-data |
| 端口 | 6379 |
| UI | RedisInsight (redislabs/redisinsight:latest,端口 5540) |
| 默认存储 | 10Gi(可通过优先级链覆盖) |
Redis 采用单实例部署模式,每个租户一个 Deployment。不使用 Redis Sentinel 或 Cluster 模式。
RabbitMQ
部署方式
通过 RabbitMQ Cluster Operator 和 Messaging Topology Operator 管理:
TFRCluster 安装的 Operator:
rabbitmq-cluster-operator:管理 RabbitMQ 集群生命周期rabbitmq-messaging-topology-operator:管理 Vhost、User、Permission 等拓扑资源
TFRTenant 创建的实例:
| 资源类型 | 说明 |
|---|---|
| RabbitmqCluster | 租户级 RabbitMQ 实例 |
| Vhost | 虚拟主机隔离 |
| User | 应用访问凭据 |
| Permission | Vhost 级访问权限 |
每个租户拥有独立的 RabbitMQ 集群实例,通过 Vhost 提供额外的逻辑隔离层。
MinIO
部署方式
通过 MinIO Operator 管理,TFRTenant 为每个租户创建 MinIO Tenant CR:
| 配置项 | 值 |
|---|---|
| 镜像 | minio/minio:RELEASE.2025-07-23T15-54-02Z |
| 默认凭据 | minioadmin / minioadmin |
| TLS | 默认关闭(依赖 Istio mTLS 加密服务间通信) |
| 副本数 | 可配置(默认 1) |
| 端口 | 9000 (API) |
| 默认存储 | 10Gi(可通过优先级链覆盖) |
每个 Robot 的独立凭据
TFRServer 通过 MinIO Init Job 为每个机器人实例创建独立的 Bucket 和访问凭据,实现对象存储的逻辑隔离。
共享缓存(SharedCache)
用于在多个 TFRServer 实例和 TFRSUtils 之间共享图片提取缓存。
配置
在 TFRTenant 中启用:
spec:
sharedCache:
enabled: true
pvcName: "image-extracted-dir" # 默认值
storageClass: "cfs" # 必须支持 ReadWriteMany
size: "100Gi"
cacheDir: "~/.tfrobot/documents/extracted" # 默认值
要求
| 要求 | 说明 |
|---|---|
| AccessMode | ReadWriteMany (RWX) |
| StorageClass | 必须支持 RWX(如 NFS、CephFS、腾讯云 CFS) |
| 挂载路径 | 通过 cacheDir 配置 |
环境变量自动注入
启用 SharedCache 后,Operator 自动注入以下环境变量到 TFRServer Pod:
| 变量名 | 值来源 | 说明 |
|---|---|---|
TFC_IMAGE__SHARED_CACHE | sharedCache.cacheDir | 共享缓存根目录 |
TFS_ROBOT__DOC_EXTRACTED_IMAGES_DIR | VolumeMount.MountPath | 图片提取目录(优先级最高,覆盖 ConfigMap) |
其他存储组件
| 组件 | 部署方式 | 存储类型 | 说明 |
|---|---|---|---|
| TimescaleDB | CNPG + 扩展 | PVC | 时序数据,独立于主 PostgreSQL |
| Jaeger | Helm Chart | PVC | 分布式追踪数据 |
| Grafana | Helm Chart | PVC | 仪表盘配置和数据 |
TimescaleDB 使用独立的 CNPG Cluster,凭据与主 PostgreSQL 分离。用户名同样不能为 postgres。
隔离模型总结
| 组件 | 隔离级别 | 隔离方式 | 管理方 |
|---|---|---|---|
| PostgreSQL | 实例级 | 每租户独立 CNPG Cluster(Pod + PVC) | Operator |
| PostgreSQL Schema | 应用级 | TFS_ROBOT__DB_SCHEMA 环境变量 | 运维(手动) |
| Redis | 实例级 | 每租户独立 Deployment + PVC | Operator |
| RabbitMQ | 实例级 + 逻辑 | 独立 Cluster + Vhost 隔离 | Operator |
| MinIO | 实例级 + 逻辑 | 独立 Tenant + per-robot Bucket/凭据 | Operator |
| SharedCache | 租户级 | 租户命名空间内 RWX PVC | Operator |
| 网络 | 命名空间级 | mTLS + AuthorizationPolicy | Operator |
存储架构总览
graph TB
subgraph TFRTenant[租户命名空间]
subgraph databases[数据库层]
PG[(PostgreSQL<br/>CNPG Cluster)]
TSDB[(TimescaleDB<br/>CNPG + Extension)]
RD[(Redis<br/>Deployment)]
end
subgraph messaging[消息层]
RQ[(RabbitMQ<br/>Cluster Operator)]
end
subgraph storage[对象存储层]
MN[(MinIO<br/>MinIO Tenant)]
SC[(SharedCache<br/>RWX PVC)]
end
subgraph monitoring[监控层]
JG[(Jaeger)]
GF[(Grafana)]
end
subgraph servers[TFRServer 实例]
S1[tf-robot-1]
S2[tf-robot-2]
end
S1 --> PG
S1 --> RD
S1 --> RQ
S1 --> MN
S1 --> SC
S2 --> PG
S2 --> RD
S2 --> RQ
S2 --> MN
S2 --> SC
end
subgraph resolution[存储配置优先级]
C1[组件级配置] -->|覆盖| C2[租户级配置]
C2 -->|覆盖| C3[系统默认 10Gi]
end