跳到主要内容
版本:Next 🚧

TFRServer 部署

部署 TFRServer 服务实例。

概述

TFRServer 是命名空间级资源,部署在 TFRTenant 创建的租户命名空间中,管理单个 TFRobot 服务器实例:

  • API Server - 主服务进程
  • Worker - 异步任务处理
  • RobotWorker - 机器人任务处理
  • Confz 配置 - 与 TFRobotServer TOML 配置一一对应,用户指定值覆盖系统动态生成值
  • Secret / ConfigMap - 第三方 API Keys 及环境变量
前置条件

TFRServer 依赖 TFRTenant 创建的租户命名空间和中间件。部署前确保 TFRTenant 状态为 Available


配置说明

核心字段

字段说明示例
nameTFRServer 资源名称(即 robotId)friday
namespace租户命名空间(由 TFRTenant 创建)staging-tenant
confzDataConfz 结构化配置见下文
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"
系统动态生成

postgresqlrediscelerycosgrafanaotlp 等配置由 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 中。