管理许可证
TensorFusion 哪些组件需要许可证,以及如何在集群中安装、验证和轮换许可证密钥
TensorFusion 的大部分组件是开源的,不需要许可证就能运行。例外是 vGPU worker,也就是远程 vGPU 模式和 hard 隔离背后的组件:它启动时会校验许可证密钥。本文说明哪些部分需要许可证、如何安装或轮换密钥,以及怎么确认密钥已生效。
哪些部分需要许可证
| 部分 | 许可方式 | 集群里是否需要密钥 |
|---|---|---|
| controller、调度器、webhook、hypervisor,GPU 池化与管理 | 开源,Apache 2.0 | 不需要 |
| soft 隔离(进程内 limiter) | 开源,Apache 2.0 | 不需要 |
shared(整卡)和 partitioned(MIG)分配 | 开源,Apache 2.0 | 不需要 |
| vGPU worker:远程 vGPU 模式、hard 隔离、sidecar worker | 商业许可。组织内 GPU 总数少于 10 张时免费 | 需要 |
| TensorFusion 控制台的企业版功能 | 商业许可 | 不需要,与控制台中的组织绑定 |
套餐和价格见定价页面。申请、延期或续签许可证密钥,请联系 support@tensor-fusion.com。
目前还没有的能力:
- 没有自助购买许可证密钥或查看许可证用量的页面,密钥由 TensorFusion 团队签发。
- controller 不校验也不上报许可证,没有任何自定义资源展示许可证状态或到期时间。只有 worker 会校验密钥,到期时间需要你自己记录和跟踪。
许可证如何校验
一份许可证由两个字符串组成:
| 内容 | worker 上的环境变量 | 说明 |
|---|---|---|
| 许可证文本 | TF_LICENSE | 版本、到期时间;绑定硬件的许可证还包含已授权 GPU 的 UUID |
| 签名 | TF_LICENSE_SIGN | 许可证文本的签名 |
worker 启动时会验证签名、检查许可证是否过期;对绑定硬件的许可证,还会检查它看到的 GPU 是否都在授权范围内。任何一项不通过,worker 都会打印原因并退出,依赖它的应用也就用不了 GPU。
校验在 worker 内部完成,不需要访问网络,所以在完全私有化部署的集群里也是同样的流程。
安装或轮换许可证密钥
前置条件
- TensorFusion 提供的许可证文本和对应签名。
- 有权限编辑
TensorFusionCluster资源。
第 1 步:把密钥配置到 GPU 池
worker 的环境变量来自 GPU 池的 worker Pod 模板。编辑集群资源:
kubectl edit tensorfusioncluster tensor-fusion在每个会运行 worker 的池里,给 tensorfusion-worker 容器加上这两个变量:
apiVersion: tensor-fusion.ai/v1
kind: TensorFusionCluster
metadata:
name: tensor-fusion
spec:
gpuPools:
- name: shared
specTemplate:
componentConfig:
worker:
podTemplate:
template:
spec:
containers:
- name: tensorfusion-worker
env:
# ... 保留已有的变量 ...
- name: TF_LICENSE // [!code highlight]
value: "<许可证文本>"
- name: TF_LICENSE_SIGN // [!code highlight]
value: "<签名>"轮换密钥时,两个值要在同一次修改里一起替换。签名只对应一份许可证文本,新文本配旧签名会校验失败。
独立的 worker Pod(远程 vGPU 模式)和注入到业务 Pod 里的 worker sidecar(本地模式的 hard 隔离)用的是同一份模板。
第 2 步:重启 worker
worker 只在启动时读取密钥。已经在运行的 worker 会继续使用旧密钥,直到被重建。
- 池上设置了
nodePoolRollingUpdatePolicy.autoUpdateWorker: true时,controller 会在配置变更后分批重建 worker。 - 否则需要自己重启受影响的工作负载,例如
kubectl rollout restart deployment/<name>。
请在旧密钥到期之前完成轮换。运行中的 worker 不会在到期那一刻停止,但下次启动时会校验失败。
第 3 步:验证
找到 worker 并查看日志:
kubectl get pods -A -l tensor-fusion.ai/component=worker
kubectl logs -n <namespace> <worker-pod> -c tensorfusion-worker | grep -i licensesidecar 形式的 worker,把 Pod 名换成业务 Pod 的名称,容器名不变。
日志里出现 License verification passed,后面会带上 worker 接受的版本和到期时间。只有 worker 模板中的 TF_ENABLE_LOG 为 1 时才会输出这条日志,Helm chart 默认就是 1。
故障排查
| worker 日志 | 原因 | 处理 |
|---|---|---|
License is not set | worker 容器缺少 TF_LICENSE 或 TF_LICENSE_SIGN | 在池的 worker 模板里补齐两个变量,然后重启 worker |
License verification failed | 文本和签名不匹配,常见原因是复制时被截断或改动 | 按签发时的原样重新粘贴两个值,并加上引号 |
License has expired | 许可证已过期 | 申请新密钥并轮换 |
Device UUID ... is not found in the license | 许可证绑定了具体的 GPU,而这个节点上有未授权的 GPU | 申请覆盖新 GPU 的密钥 |
确认运行中的 Pod 确实带有这两个变量:
kubectl get pod -n <namespace> <worker-pod> \
-o jsonpath='{range .spec.containers[?(@.name=="tensorfusion-worker")].env[*]}{.name}{"\n"}{end}'
TensorFusion 文档