架构概览
TFRS Operator 基于 Kubebuilder 构建,通过三个层级的自定义资源(CRD)管理 TFRobot 多租户 AI/机器人服务的完整生命周期。
资源模型
Operator 定义了三层 CRD,形成自顶向下的管理结构:
TFRCluster (集群范围)
└── TFRTenant (命名空间范围)
└── TFRServer (命名空间范围)
| CRD | 作用域 | 职责 |
|---|---|---|
| TFRCluster | Cluster | 管理集群级基础设施:Istio 入口、TLS 证书、Operator 安装、镜像仓库凭据 |
| TFRTenant | Namespace | 配置租户环境:数据库、缓存、对象存储、消息队列、监控栈 |
| TFRServer | Namespace | 管理单个 TFRobot 服务实例:API worker、机器人 worker、配置和密钥 |
多租户模型
TFRTenant 支持两种租户类型:
| 类型 | 说明 | 隔离级别 |
|---|---|---|
enterprise | 企业租户,独占命名空间 | 完全隔离:独立的网络策略、存储和中间件实例 |
personal | 个人租户,按职能共享命名空间 | 逻辑隔离:通过 RobotId 区分,共享中间件 |
两种类型均通过 Istio PeerAuthentication(STRICT mTLS)和 AuthorizationPolicy 实现网络隔离。
基础设施组件一览
集群级(TFRCluster 安装)
| 组件 | 部署方式 | 说明 |
|---|---|---|
| cert-manager | Helm Chart | TLS 证书自动管理 |
| Istio | Helm Chart | 服务网格基础 |
| Istio Ingress Gateway | Helm Chart | 入口网关,支持 TKE CLB / NodePort / Docker Desktop |
| CNPG Operator | YAML Manifest | CloudNativePG PostgreSQL Operator |
| MinIO Operator | Helm / YAML | MinIO 对象存储 Operator |
| RabbitMQ Operator | YAML Manifest | RabbitMQ Cluster 和 Topology Operator |
| 镜像仓库凭据 | Secret | 跨命名空间共享的 imagePullSecret |
租户级(TFRTenant 创建实例)
| 组件 | 部署方式 | 说明 |
|---|---|---|
| PostgreSQL | CNPG Cluster CR | 主数据库,16-minimal-bookworm |
| Redis | Deployment + PVC | 缓存服务(redis-stack-server) |
| MinIO | MinIO Tenant CR | 对象存储 |
| RabbitMQ | RabbitMQ Cluster CR | 消息队列 |
| TimescaleDB | CNPG + 扩展 | 时序数据库 |
| Jaeger | Helm Chart | 分布式追踪 |
| Grafana | Helm Chart | 监控仪表盘 |
| Prometheus | Deployment | 指标采集 |
| OTel Collector | Deployment | OpenTelemetry 追踪采集 |
| Vector | Deployment | 日志收集 |
| SharedCache PVC | PVC (RWX) | 图片缓存共享卷 |
服务级(TFRServer 配置)
| 组件 | 说明 |
|---|---|
| API Worker | TFRobot API 服务 |
| Robot Worker | 机器人任务 Worker |
| DB Init Job | 数据库 Schema 初始化 |
| MinIO Init Job | 存储桶初始化 |
| Grafana SA Job | Grafana 服务账号配置 |
| TOML Config | Confz 配置自动生成 |
部署依赖图
TFRCluster 组件部署顺序
graph TD
CM[cert-manager] --> Istio
Istio --> IG[Istio Ingress]
IG --> GW[Gateway]
Istio --> EFC[EnvoyFilter Cookie]
Istio --> EFL[EnvoyFilter Lua Routing]
GW --> VS[ClusterVirtualService]
EFC --> VS
Istio --> IT[Istio Telemetry]
MO[MinIO Operator]
CO[CNPG Operator]
RO[RabbitMQ Operator]
IR[ImageRegistry]
cert-manager → Istio → Istio Ingress → Gateway/EnvoyFilter → VirtualService 为串行链路。三个中间件 Operator 和 ImageRegistry 可并行安装。
TFRTenant 组件部署顺序
graph TD
NS[Namespace] --> PG[PostgreSQL]
NS --> RD[Redis]
NS --> MN[MinIO]
NS --> JG[Jaeger]
NS --> PR[Prometheus]
NS --> VT[Vector]
NS --> SC[SharedCache PVC]
NS --> TF[TFRobotFront]
NS --> TU[TFRSUtils]
PG --> TD[TimescaleDB]
JG --> OT[OTel Collector]
RO_DEP[RabbitMQ Operator Ready] --> RQ[RabbitMQ]
NS --> GF[Grafana]
大部分组件仅依赖 Namespace 创建完成即可并行部署。TimescaleDB 依赖 PostgreSQL,OTel Collector 依赖 Jaeger,RabbitMQ 依赖 Operator 就绪。
凭据管理
TFRS Operator 在三个层级管理凭据:
| 层级 | Secret 示例 | 说明 |
|---|---|---|
| TFRCluster | {registry}-pull-secret | 镜像仓库拉取凭据,跨命名空间共享 |
| TFRTenant | {namespace}-pg-credentials、MinIO root 凭据 | 中间件访问凭据,自动生成或用户指定 |
| TFRServer | {robot}-secret、{robot}-config | 应用级密钥(API Key)和配置 |
密码字段如未指定,Operator 会自动生成随机密码并存入 Secret。
ConfzData 配置自动生成
TFRServer 使用 ConfzData(TOML 格式)管理应用配置。Operator 自动注入中间件连接信息:
# 自动生成示例(用户无需手动填写)
[postgresql]
host = "{namespace}-pg-rw"
port = 5432
user = "app_user"
dbname = "{namespace}"
[redis]
host = "redis.{namespace}.svc.cluster.local"
port = 6379
[celery]
broker_url = "amqp://user:pass@rabbitmq.{namespace}.svc.cluster.local:5672/"
[cos]
host = "minio.{namespace}.svc.cluster.local"
port = 9000
用户可通过 spec.confzData 覆盖任意字段,未指定的字段使用 Operator 生成的动态值。
环境变量注入
TFRServer 支持通过 secretData 和 configData 注入环境变量:
密钥类(Secret): OPENAI_API_KEY、ANTHROPIC_API_KEY、GOOGLE_GEMINI_API_KEY 等
配置类(ConfigMap): OPENAI_BASE_URL、TFS_PROFILE、TFS_ROBOT__DB_SCHEMA 等
自动注入(优先级最高): TFS_ROBOT__DOC_EXTRACTED_IMAGES_DIR 从 sharedCache.cacheDir 自动注入,覆盖 ConfigMap 中的同名配置。