关于 gke-tpu-dynamic-slices-monitoring
用于排查和管理 GKE TPU 动态切片的技能,可检查切片状态、定位配置问题并指导清理。对移除 finalizer 等高风险操作要求先取得用户确认。
主要功能
- 01检查 TPU Slice 状态与条件
- 02排查切片创建和预配失败
- 03验证动态切片工作负载配置
- 04指导卡住切片的清理
- 05高风险变更前要求确认
适用场景
- 01诊断切片未创建或状态异常
- 02核对 Pod 与 JobSet 配置
- 03处理停滞的切片删除
- 04评估禁用切片控制器的清理步骤
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ google/ skills --skill gke-tpu-dynamic-slices-monitoring安装后在 Claude Code 中输入/gke-tpu-dynamic-slices-monitoring确认已加载。
附带文件references/failure_signatures.mdscripts/validate_queries.sh
详细介绍
GKE TPU 动态切片监控与管理
监控 TPU Slice 自定义资源的状态,排查预配失败问题,验证动态切片上的工作负载清单,并执行清理。
前提条件
- 项目已启用 Cloud Logging。
- 已配置
kubectl和gcloudCLI,以访问 GKE 集群。
诊断工作流
步骤 0:获取上下文并定义时间范围
使用集群工具或以下参数收集项目、集群和切片的上下文信息:
- 项目 ID:
{project_id}(例如:my-gcp-project) - 集群名称:
{cluster_name}(例如:tpu-cluster) - 区域/可用区:
{location}(例如:us-central1-a) - 切片名称:
{slice_name}(例如:test-slice) - 问题发生时间:
{timestamp}(可选;默认采用最近 30 分钟的时间范围[T - 30m]至[T + 30m])
步骤 1:描述切片自定义资源[低风险]
当用户要求检查、排查或查看切片状态时,立即使用可用的集群工具执行 kubectl describe slice {slice_name} 进行检查。根据下方条件表解析输出中的 Status.Conditions,以诊断具体状态并提供明确的建议。
-
命令:
kubectl describe slice {slice_name}
状态与原因分析
分析 Status.Conditions(尤其是 Type: Ready 及其 Reason 和
Status):
| 生命周期状态 / 原因 | 含义 | 建议操作 |
|---|---|---|
SliceNotCreated | GKE 切片控制器 | 等待几分钟,然后重新 |
| : : 正在初始化切片并执行 : 检查切片状态。 : | ||
| : : 资源检查。 : : | ||
SliceCreationFailed | 前置条件验证失败 | 验证所选节点是否存在、 |
| : : (例如,所选节点不存在、: 未分配,且拓扑与分区数 : | ||
| : : 节点已被其他切片使用, : 匹配。 : | ||
| : : 或拓扑与分区数量不匹配)。: : | ||
ACTIVATING | GKE 正在积极组建并 | 监控节点预配情况。 |
| : : 预配 TPU 切片。 : : | ||
ACTIVE | TPU 切片已成功组建, | 开始部署或检查工作负载。 |
| : : 已准备好托管工作负载。 : : | ||
ACTIVE_DEGRADED | 切片可用,但一个或多个 | 监控工作负载日志,查看 |
| : : 子块处于降级状态。 : 是否存在互连或设备错误。 : | ||
| : : : 检查故障节点 VM。 : | ||
FAILED | GKE 未能组建 TPU 切片 | 确保所有所选节点都属于 |
| : : (例如,所选节点不属于 : 同一预留块。 : | ||
| : : 同一预留块)。 : : | ||
DEACTIVATING | 切片正在拆除(由用户 | 等待拆除完成,或在卡住时 |
| : : 删除或严重系统性故障 : 修补终结器。 : | ||
| : : 触发)。 : : | ||
INCOMPLETE | Slice CR 从集群中删除 | 无需操作;资源很快就会 |
| : : 前的终止阶段。 : 被移除。 : |
资源调配失败故障排查清单
调查切片创建或资源调配失败(SliceCreationFailed 或 FAILED)时,请执行以下验证步骤:
- 节点存在性与分配检查:确认所选 TPU 节点存在于集群中,且尚未分配给其他切片(
kubectl get nodes -l cloud.google.com/gke-tpu-slice、kubectl get slice -A)。 - 拓扑匹配:确认分区数量与请求的拓扑维度匹配(例如,拓扑
2x2需要 4 个节点)。 - 预留区块匹配检查:确认所有选定的 TPU 节点属于同一预留和预留区块。
步骤 2:验证工作负载规范 [低风险]
确保工作负载清单已正确配置为使用动态切片。
1. 单切片工作负载要求
检查 Pod 模板是否包含以下注解和选择器:
- 注解:
cloud.google.com/gke-tpu-slice-topology: "{topology}"(例如,"4x4x4")
- NodeSelector:
cloud.google.com/gke-tpu-topology: "{topology}"(例如,"4x4x4")cloud.google.com/gke-tpu-accelerator: "{accelerator_type}"(例如,"tpu7x")cloud.google.com/gke-tpu-slice: "{slice_name}"(例如,"test-slice")
2. 多切片(JobSet)工作负载要求
如果要部署多切片 JobSet,请确认:
- JobSet 注解:
alpha.jobset.sigs.k8s.io/exclusive-topology: cloud.google.com/gke-tpu-slice
- Pod 模板注解:
cloud.google.com/gke-tpu-slice-topology: "{topology}"
- Pod 模板 NodeSelector:
cloud.google.com/gke-tpu-topology: "{topology}"cloud.google.com/gke-tpu-accelerator: "{accelerator_type}"- 注意:请勿在 nodeSelector 中手动指定
cloud.google.com/gke-tpu-slice;JobSet 会自动处理切片分配。
解决与管理工作流
解决方案 1:强制删除卡住的切片 [高风险]
如果切片卡在 DEACTIVATING 状态,或因 finalizer 卡住而导致删除无限期挂起:
-
确定原因:说明切片资源上的 finalizer(
metadata.finalizers)阻止 Kubernetes 完成资源删除。 -
提出解决方案:建议使用 JSON patch 操作从元数据路径(
/metadata/finalizers)移除 finalizer:kubectl patch slice {slice_name} --type json -p='[{"op": "remove", "path": "/metadata/finalizers"}]' -
提供警告:明确提醒用户,移除 finalizer 会绕过标准控制器拆除流程,可能导致底层 VM、网络或加速器资源未被清理,或成为孤儿资源。
-
关键安全要求:回复必须明确询问用户是否确认(例如,“通过 JSON patch 移除
/metadata/finalizers上的 finalizer 属于高风险操作,可能导致资源成为孤儿。确认要对切片{slice_name}应用此补丁吗?”),并在应用或执行补丁前暂停,等待用户确认。
解决方案 2:禁用并清理 Slice 控制器【高风险】
如果需要禁用动态切片:
-
检查现有的 Slice:
kubectl get slice -A禁用控制器前,确保已删除所有 Slice。
-
通过 gcloud 禁用 Slice 控制器:
gcloud container clusters update {cluster_name} \ --location={location} \ --no-enable-slice-controller -
删除 Slice CRD:
kubectl delete crd slices.accelerator.gke.io -
清理节点标签:从集群中的所有节点移除 GKE TPU Slice 标签:
kubectl label nodes --all cloud.google.com/gke-tpu-slice- cloud.google.com/gke-tpu-slice-topology-
- 安全规则:提出准确的命令,并在执行禁用或破坏性清理步骤前确认。