LogoTensorFusion 文档
LogoTensorFusion 文档
首页

快速开始

TensorFusion 概览在 Kubernetes 安装在虚拟机/服务器安装(K3S)Helm 快速安装在宿主机/虚拟机安装TensorFusion 架构

应用操作

创建 AI 应用注解使用场景配置自动扩缩容迁移现有应用最佳实践

自定义AI基础设施

生产级部署指南QoS 级别与计价云厂商集成(BYOC)管理许可证

维护与优化

组件更新配置告警GPU 热迁移预加载模型优化 GPU 效率

故障排除

问题处理手册链路追踪/性能分析查询指标和日志

参考

对比

与 NVIDIA vGPU 对比与 MIG/MPS 对比与趋动科技对比与 NVIDIA Run:ai 对比与 HAMi 的对比

组件更新

用 Helm 升级 TensorFusion 控制面,分批滚动更新 hypervisor、worker 和 client,并轮换凭据

升级 TensorFusion 分两部分:helm upgrade 替换控制面;之后 controller 按资源池的滚动更新策略,分批更新池内的组件(hypervisor、worker、client)。本页讲这两部分怎么做、怎么验证和回滚,以及怎么轮换安装时用到的凭据。

从 1.x 升级到 2.x 走的是另一套更严格的流程,请按 v1 到 v2 升级指南操作,不要用本页的步骤。

升级涉及哪些组件

组件版本在哪里设置怎么更新对运行中工作负载的影响
controller(CRD 控制器、Pod webhook、调度器)Helm value controller.image.tag,默认取 chart 的 appVersionhelm upgrade 更新 Deployment无影响。没有可用的 controller 副本期间,带 tensor-fusion.ai/enabled: "true" 标签的 Pod 无法创建和调度
CRDchart 的 crds/ 目录helm upgrade 不会更新,需要手动 apply无影响
hypervisorHelm value cluster.hypervisorImage,对应资源池的 componentConfig.hypervisor.imagecontroller 按节点分批替换 hypervisor-<node> Pod运行中的 Pod 不会重启。新的 hypervisor 就绪之前,该节点不接收新的 GPU 工作负载
workerproviderConfigs.nvidia.images.remoteWorker 和资源池的 componentConfig.workercontroller 分批重建各个 TensorFusionWorkload 的 worker Pod连着被重建 worker 的应用会丢失 GPU 会话
clientproviderConfigs.nvidia.images.remoteClient 和资源池的 componentConfig.clientcontroller 分批删除注入内容已过期的应用 Pod,由它们的属主重新创建受影响的应用 Pod 会重启

chart 里 hypervisor 镜像由 cluster.hypervisorImage 单独指定,不跟随 controller 版本。每次升级前都要核对这个值,并显式设置。

前置条件

  • Helm 3,以及有集群管理员权限的 kubectl。
  • 知道安装时用的 release 名称和命名空间。本页两者都用 tensor-fusion-sys,与在 Kubernetes 安装一致。
  • 确定目标 chart 版本,并读过对应的发布说明。
  • 生产环境建议至少两个 controller 副本(controller.replicaCount: 2),这样 Deployment 滚动期间 webhook 和调度器不中断。

步骤 1:备份 values 和资源

mkdir -p tf-backup
helm -n tensor-fusion-sys get values tensor-fusion-sys -o yaml > tf-backup/values.yaml
kubectl get tensorfusioncluster,gpupool,gpunode,gpu,workloadprofile,tensorfusionworkload,tensorfusionconnection -A -o yaml \
  > tf-backup/tf-state.yaml

tf-backup/values.yaml 里是安装时设置过的全部 value,步骤 3 要原样传回去。

步骤 2:更新 CRD

chart 的 crds/ 目录只在首次安装时生效,Helm 之后不会再升级它。先拉取目标版本的 chart,把其中的 CRD apply 到集群,再升级 release:

helm pull tensor-fusion --repo https://download.tensor-fusion.ai \
  --version <chart-version> --untar --untardir tf-chart
kubectl apply --server-side --force-conflicts -f tf-chart/tensor-fusion/crds/

每个 CRD 都应输出 serverside-applied。

步骤 3:升级 Helm release

helm upgrade tensor-fusion-sys tensor-fusion \
  --repo https://download.tensor-fusion.ai \
  --namespace tensor-fusion-sys \
  --version <chart-version> \
  -f tf-backup/values.yaml
kubectl -n tensor-fusion-sys rollout status deploy/tensor-fusion-sys-controller --timeout=180s

一定要带上 values 文件。不带的话,Helm 会把所有 value 重置为 chart 默认值,控制台 agent 的配置也会丢。

这一步还会更新 chart 管理的 TensorFusionCluster 和 SchedulingConfigTemplate、Alertmanager StatefulSet 和单机版 GreptimeDB。如果 TensorFusionCluster 是你自己创建的(cluster.enabled: false),步骤 4 的修改请直接改它。

步骤 4:滚动更新 hypervisor、worker 和 client

controller 会按资源池为每个组件的配置算一个哈希。哈希变了,并且资源池的 nodeManagerConfig.nodePoolRollingUpdatePolicy 打开了对应的自动更新开关,controller 就开始滚动更新这个组件:

nodeManagerConfig:
  nodePoolRollingUpdatePolicy:
    autoUpdateHypervisor: true
    autoUpdateWorker: false
    autoUpdateClient: false
    batchPercentage: 20
    batchInterval: 1s
字段CRD 默认值chart 创建的集群含义
autoUpdateHypervisorfalsetruehypervisor 镜像、Pod 模板或对应厂商的 ProviderConfig 变化时,替换 hypervisor Pod
autoUpdateWorkerfalse未设置worker 模板变化时,重建 worker Pod
autoUpdateClientfalse未设置client 注入内容变化时,删除应用 Pod
batchPercentage10020每批更新的节点、工作负载或 Pod 占比,向上取整
batchInterval1s1s两批之间的间隔

这个策略要写在 TensorFusionCluster 的 spec.gpuPools[].specTemplate 下面。controller 会用这份模板覆盖派生出的 GPUPool 的 spec,直接改 GPUPool 的内容会被冲掉。

开关为 false 时,controller 只记录新的哈希,然后等待:组件继续跑旧版本,资源池状态里的 ...ConfigSynced 保持 false。把开关改成 true 后,积压的更新会自动开始。

autoUpdateClient: true 会删除应用 Pod。只有应用能接受重启,并且由 Deployment 等控制器管理、删除后会自动重建时才打开。否则保持关闭,自己安排时间重启应用。

观察更新进度:

kubectl get gpupool -o custom-columns='POOL:.metadata.name,HYPERVISOR:.status.componentStatus.hypervisorUpdateProgress,HV_SYNCED:.status.componentStatus.hypervisorConfigSynced,WORKER:.status.componentStatus.workerUpdateProgress,CLIENT:.status.componentStatus.clientUpdateProgress'
kubectl get pods -n tensor-fusion-sys -l tensor-fusion.ai/component=hypervisor -o wide

进度从 0 走到 100。进度为 100 且 ...ConfigSynced: true 表示这个组件已全部更新。没有 GPU 节点的资源池不会执行更新,进度可能一直为空。

验证

kubectl get tensorfusioncluster          # PHASE 为 Running
kubectl get gpupool                      # PHASE 为 Running
kubectl get gpunode                      # 所有节点为 Running
kubectl -n tensor-fusion-sys get pods -l tensor-fusion.ai/component=hypervisor \
  -o custom-columns='POD:.metadata.name,NODE:.spec.nodeName,STATUS:.status.phase,IMAGE:.spec.containers[0].image'

每个 GPU 节点上应该有且只有一个 hypervisor Pod,状态为 Running,镜像是新版本。然后按创建 AI 应用建一个测试工作负载,在里面真正调用一次 CUDA。Pod 处于 Running 并不能说明 GPU 链路是通的。

回滚

helm -n tensor-fusion-sys history tensor-fusion-sys
helm -n tensor-fusion-sys rollback tensor-fusion-sys <revision>

回滚会恢复之前的 controller 镜像和 TensorFusionCluster,随后 controller 用同样的分批流程把 hypervisor 换回旧版本。CRD 保持新版本不动:Helm 不会降级 CRD,而从 CRD 里删字段可能让已有资源丢数据。

轮换凭据

凭据存放位置什么情况下会用到
控制台 agent tokenHelm value agent.enrollToken 和 agent.agentId,以环境变量形式传给 controller Pod 里的 cluster-agent 容器集群接入了 TensorFusion 控制台
云厂商凭据Secret tf-cloud-vendor-credentials,键为 ak 和 sk资源池通过云厂商 API 创建节点,且该云不支持 IRSA 这类免密钥认证
GreptimeDB Cloud 密码Helm value greptime.password,保存在 Secret <release>-greptimedb-secret 和 vector 的 ConfigMap 里greptime.isCloud: true

控制台 agent token。 控制台在集群的接入命令里展示 token,目前没有重新生成的入口。token 泄露时,请联系 TensorFusion 支持团队获取新的 token,然后更新并确认 agent 重新连上:

helm upgrade tensor-fusion-sys tensor-fusion \
  --repo https://download.tensor-fusion.ai \
  --namespace tensor-fusion-sys \
  --version <chart-version> \
  -f tf-backup/values.yaml \
  --set agent.enrollToken=<new-token>
kubectl -n tensor-fusion-sys logs deploy/tensor-fusion-sys-controller -c cluster-agent --tail=20

token 是 Deployment 里的明文环境变量,能读取该命名空间 Deployment 的人都能看到,请收紧这项权限。

云厂商凭据。 chart 只在这个 Secret 不存在时创建它,之后再改 Helm values 不起作用。直接替换 Secret,然后重启 controller:

kubectl create secret generic tf-cloud-vendor-credentials -n tensor-fusion-sys \
  --from-literal=ak=<access-key> --from-literal=sk=<secret-key> \
  --dry-run=client -o yaml | kubectl apply -f -
kubectl -n tensor-fusion-sys rollout restart deploy/tensor-fusion-sys-controller

GreptimeDB Cloud 密码。 先在 GreptimeDB Cloud 修改密码,再带上新的 greptime.password 执行 helm upgrade,最后重启还持有旧密码的组件:

kubectl -n tensor-fusion-sys rollout restart deploy/tensor-fusion-sys-controller
# 仅在打开了 hypervisor 的 vector sidecar 时需要。Pod 删除后 controller 会重建。
kubectl -n tensor-fusion-sys delete pod -l tensor-fusion.ai/component=hypervisor

限制

  • 滚动更新策略里有 maxDuration 和 maintenanceWindow 两个字段,但 controller 目前不处理它们:检测到变化就立即开始更新,直到全部完成。
  • 不支持按节点灰度或暂停。想放慢更新,调小 batchPercentage、调大 batchInterval;想停下来,把对应的 autoUpdate* 开关改回 false。
  • 不要在升级时顺手改 componentConfig.hypervisor.portNumber。运行中的 Pod 仍使用创建时的端口,改了之后会连不上 hypervisor。需要改端口时单独操作,并重建该资源池的工作负载。
  • 只改了 dynamicConfig 或 schedulerConfig 时,helm upgrade 不会重启 controller。执行 kubectl -n tensor-fusion-sys rollout restart deploy/tensor-fusion-sys-controller 让新配置生效。

下一步

  • 配置告警:升级后分配失败时能收到通知。
  • 问题处理手册:hypervisor 更新后迟迟不就绪时查看。
  • Helm values 参考:chart 的全部配置项。

管理许可证

TensorFusion 哪些组件需要许可证,以及如何在集群中安装、验证和轮换许可证密钥

配置告警

把 TensorFusion 的告警发到你的通知渠道,并调整或新增告警规则

目录

升级涉及哪些组件
前置条件
步骤 1:备份 values 和资源
步骤 2:更新 CRD
步骤 3:升级 Helm release
步骤 4:滚动更新 hypervisor、worker 和 client
验证
回滚
轮换凭据
限制
下一步