TFRServer 部署
部署 TFRServer 服务实例。
概述
TFRServer 是命名空间级资源,部署在 TFRTenant 创建的租户命名空间中,管理单个 TFRobot 服务器实例:
- API Server - 主服务进程
- Worker - 异步任务处理
- RobotWorker - 机器人任务处理
- Confz 配置 - 与 TFRobotServer TOML 配置一一对应,用户指定值覆盖系统动态生成值
- Secret / ConfigMap - 第三方 API Keys 及环境变量
TFRServer 依赖 TFRTenant 创建的租户命名空间和中间件。部署前确保 TFRTenant 状态为 Available。
配置说明
核心字段
| 字段 | 说明 | 示例 |
|---|---|---|
name | TFRServer 资源名称(即 robotId) | friday |
namespace | 租户命名空间(由 TFRTenant 创建) | staging-tenant |
confzData | Confz 结构化配置 | 见下文 |
secretData | 敏感环境变量(API Keys 等) | 见下文 |
configData | 非敏感环境变量 | 见下文 |
Confz 配置
confzData 与 TFRobotServer 的 TOML 配置一一对应。大部分字段由系统动态生成(postgresql、redis、celery、cos、grafana 等),通常只需配置以下字段:
confzData:
admin:
adminSecret: "<管理员密钥>"
jwtSecret: "<JWT签名密钥>"
password: "<Argon2哈希密码>"
robot:
robotId: "friday"
host: "https://staging.turingfocus.cn"
dbSchema: "tfrobot"
sessionSecret: "<会话密钥>"
loguru:
level: "INFO"
feature:
uploadFileSizeLimitMb: "50"
postgresql、redis、celery、cos、grafana、otlp 等配置由 Controller 根据 TFRTenant 中间件状态自动生成,无需手动配置。如需覆盖,在 confzData 中显式指定即可。
镜像配置(可选)
apiImage: "docker.cnb.cool/turingfocus/tfrobotv2/tfrobotserver:latest"
workerImage: "docker.cnb.cool/turingfocus/tfrobotv2/tfrobotserver:latest"
robotWorkerImage: "docker.cnb.cool/turingfocus/tfrobotv2/tfrobotserver:latest"
imagePullPolicy: "IfNotPresent"
imagePullSecret: "tfrs-private-registry"
不指定时使用 Controller 内置的默认镜像。
存储配置(可选)
storage:
storageClass: "cbs"
defaultSize: "10Gi"
未指定时继承 TFRTenant 或 TFRCluster 的配置。
示例配置
config/samples/tfrobot_v1_tfrserver_staging.yaml- Staging 环境(含完整字段注释)config/samples/tfrobot_v1_tfrserver.yaml- 通用模板(TODO 占位符)
Kustomize 部署
创建 CR 清单
# tfrserver-staging.yaml
apiVersion: tfrobot.tfrobotserver.cn/v1
kind: TFRServer
metadata:
name: friday
namespace: "staging-tenant"
spec:
confzData:
admin:
adminSecret: "<管理员密钥>"
jwtSecret: "<JWT签名密钥>"
password: "<Argon2哈希密码>"
robot:
robotId: "friday"
host: "https://staging.turingfocus.cn"
dbSchema: "tfrobot"
sessionSecret: "<会话密钥>"
loguru:
level: "INFO"
feature:
uploadFileSizeLimitMb: "50"
imagePullSecret: "tfrs-private-registry"
secretData:
OPENAI_API_KEY: "<your-openai-key>"
ANTHROPIC_API_KEY: "<your-anthropic-key>"
# ... 其他 API Keys
configData:
TFS_PROFILE: "tkeprod"
OPENAI_BASE_URL: "https://api.openai-proxy.org/v1"
ANTHROPIC_BASE_URL: "https://api.openai-proxy.org/anthropic"
TOKENIZERS_PARALLELISM: "false"
完整的 Staging 配置示例:config/samples/tfrobot_v1_tfrserver_staging.yaml
部署
kubectl apply -f tfrserver-staging.yaml
# tfrserver.tfrobot.tfrobotserver.cn/friday created
验证
# 查看 TFRServer 状态
kubectl get tfrserver -n staging-tenant
# 等待部署完成(超时 10 分钟)
kubectl wait tfrserver friday -n staging-tenant --for=condition=Available --timeout=600s
# 查看组件状态
kubectl get tfrserver friday -n staging-tenant -o jsonpath='{.status.components}' | jq
# 查看服务 URL
kubectl get tfrserver friday -n staging-tenant -o jsonpath='{.status.serviceURL}'
实时监控部署进度
while true; do clear; echo "--- $(date +%H:%M:%S) ---"; \
echo "=== Conditions ==="; \
kubectl get tfrserver friday -n staging-tenant -o json 2>/dev/null \
| jq -r '.status.conditions[]? | "\(.type): \(.status) - \(.message)"'; \
echo; echo "=== Components ==="; \
kubectl get tfrserver friday -n staging-tenant -o json 2>/dev/null \
| jq -r '.status.components // {} | to_entries[] | "\(.key): \(.value.state)"'; \
echo; echo "=== Pods ==="; \
kubectl get pods -n staging-tenant -l app.kubernetes.io/instance=friday 2>/dev/null; \
sleep 10; done
按 Ctrl+C 退出。
判断部署完成
TFRServer 通过 status.conditions 中的 Available 条件标识部署状态:
# 查看 Available 条件
kubectl get tfrserver friday -n staging-tenant -o jsonpath='{.status.conditions[?(@.type=="Available")].status}'
# True = 部署完成,False = 部署中或失败
# 自动化脚本:等待部署完成(超时 10 分钟)
kubectl wait tfrserver friday -n staging-tenant --for=condition=Available --timeout=600s
卸载
kubectl delete tfrserver friday -n staging-tenant
Helm 部署
部署
从 OCI 仓库安装
helm install tfrserver oci://helm.cnb.cool/turingfocus/tfrs-operator/tfrserver \
--version 0.2.0-alpha1 \
--namespace staging-tenant \
-f values-staging.yaml
使用 values 文件安装
helm install tfrserver oci://helm.cnb.cool/turingfocus/tfrs-operator/tfrserver \
--version 0.2.0-alpha1 \
--namespace staging-tenant \
-f values-staging.yaml \
--set confzData.admin.adminSecret="<SECRET>" \
--set confzData.admin.jwtSecret="<SECRET>"
从本地源码安装
helm install tfrserver ./chart/tfrserver \
--namespace staging-tenant \
-f chart/tfrserver/values-staging.yaml
TFRServer 需要指定 --namespace,其值必须与 values 文件中 namespace 字段一致,即 TFRTenant 创建的租户命名空间。
验证
# 查看 TFRServer 状态
kubectl get tfrserver -n staging-tenant
# 等待部署完成(超时 10 分钟)
kubectl wait tfrserver friday -n staging-tenant --for=condition=Available --timeout=600s
# 查看组件状态
kubectl get tfrserver friday -n staging-tenant -o jsonpath='{.status.components}' | jq
# 查看服务 URL
kubectl get tfrserver friday -n staging-tenant -o jsonpath='{.status.serviceURL}'
实时监控部署进度
while true; do clear; echo "--- $(date +%H:%M:%S) ---"; \
echo "=== Conditions ==="; \
kubectl get tfrserver friday -n staging-tenant -o json 2>/dev/null \
| jq -r '.status.conditions[]? | "\(.type): \(.status) - \(.message)"'; \
echo; echo "=== Components ==="; \
kubectl get tfrserver friday -n staging-tenant -o json 2>/dev/null \
| jq -r '.status.components // {} | to_entries[] | "\(.key): \(.value.state)"'; \
echo; echo "=== Pods ==="; \
kubectl get pods -n staging-tenant -l app.kubernetes.io/instance=friday 2>/dev/null; \
sleep 10; done
按 Ctrl+C 退出。
判断部署完成
TFRServer 通过 status.conditions 中的 Available 条件标识部署状态:
# 查看 Available 条件
kubectl get tfrserver friday -n staging-tenant -o jsonpath='{.status.conditions[?(@.type=="Available")].status}'
# True = 部署完成,False = 部署中或失败
# 自动化脚本:等待部署完成(超时 10 分钟)
kubectl wait tfrserver friday -n staging-tenant --for=condition=Available --timeout=600s
卸载
helm uninstall tfrserver -n staging-tenant
卸载 TFRServer 会删除服务实例及其相关的 Secret、ConfigMap、Job 等资源。数据库数据保留在 TFRTenant 的 PostgreSQL 中。