训练数据 shuffle、推理缓存这类高频读写走远端存储会被延迟拖慢。将 GPU-HPN 节点自带的本地 NVMe 磁盘以块设备直通到 GPU Pod,绕过文件系统层,读写性能接近裸盘。
工作原理
GPU-HPN 容量预留节点自带本地 NVMe 磁盘。通过 acs-local-passthrough-controller 组件,这些磁盘以块设备(Block Device)形式直通到 GPU Pod,绕过文件系统层,获得接近裸盘的读写性能。
维度 | 实现方式 |
挂载形式 | 块设备( |
调度感知 | 基于 CSI |
独占性 | PVC 一旦绑定(Bound),即与一块物理磁盘固定关联,并由引用它的单个 Pod 独占使用。支持多个 PVC 并发创建,每个 PVC 各自独占一块磁盘。 |
容量 | 实际分配整块物理盘,不按 |
生命周期 | Controller 自动完成磁盘的发现、分配、数据擦除和回收。删除 PVC 时,由 |
本地盘为临时存储,数据不持久。请勿存放无法重建的数据(如模型 Checkpoint、训练日志),需持久化的数据请使用 NAS、OSS 或 CPFS 存储卷。
本地盘数据在不同事件下的保留情况如下:
事件类别 | 事件 | 本地盘数据 |
Pod 操作 | 删除并重建 Pod(保留 PVC,重新调度回原节点) | 保留 |
资源回收 | 删除 PVC | 删除 |
节点 | 节点故障、释放或本地盘损坏 | 丢失 |
适用范围
已创建 ACS集群,且集群版本为 1.33 及以上。
集群已创建 GPU-HPN 容量预留并关联到本集群。预留得到的是独占物理节点(自带本地 NVMe 磁盘),仅计算类型为高性能网络 GPU 型(
compute-class: gpu-hpn)的 Pod 可调度到此类节点。具体操作,请参见GPU-HPN容量预留。以下组件及版本为白名单开放,需先提交工单申请使用:
virtual-kubeletv2.18.0-rc.2 及以上acs-local-passthrough-controller
挂载并使用本地盘存储卷
步骤一:查看可用的本地 NVMe 磁盘
创建 PVC 前,确认集群中有空闲的本地 NVMe 磁盘。
执行以下命令,查看各节点空闲的本地 NVMe 磁盘:
kubectl get csistoragecapacities -n kube-system \ -l csi.storage.k8s.io/drivername=local-passthrough.csi.alibabacloud.com \ -o jsonpath='{range .items[?(@.capacity!="0")]}{.metadata.name}{"\t"}{.nodeTopology.matchLabels.csi\.alibabacloud\.com/node-name}{"\t"}{.maximumVolumeSize}{"\t"}{.capacity}{"\n"}{end}' \ | awk 'BEGIN{printf "%-14s %-50s %-16s %s\n","NAME","NODE","DISK-SIZE","AVAILABLE"} {split($3,a,"Ki");split($4,b,"Ki");printf "%-14s %-50s %-16s %d\n",$1,$2,$3,b[1]/a[1]}'查看预期输出:
NAME NODE DISK-SIZE AVAILABLE csisc-12345 cn-wulanchabu-c.cr-ovt2bz1uoiyoxxxxxxxxx 3750738264Ki 2 csisc-abcde cn-wulanchabu-b.cr-xyz123456789xxxxxxxxx 3750738264Ki 1DISK-SIZE:单块磁盘容量(maximumVolumeSize)AVAILABLE:该节点剩余可分配磁盘数(capacity / maximumVolumeSize)
说明若所有节点
AVAILABLE均为 0,说明磁盘已全部被占用,需等待其他 PVC 释放或扩容节点。
步骤二:创建 PVC
创建
pvc.yaml,使用预设的local-passthroughStorageClass。local-passthrough是安装acs-local-passthrough-controller组件时预设的 StorageClass,其回收策略预设为reclaimPolicy: Delete、绑定模式为WaitForFirstConsumer。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: local-disk-pvc namespace: default spec: accessModes: - ReadWriteOncePod # 仅支持单 Pod 独占 volumeMode: Block # 仅支持块设备模式 storageClassName: local-passthrough resources: requests: storage: 10Gi # ≤ 步骤一查到的 DISK-SIZE 即可,实际分配整块物理盘应用配置:
kubectl apply -f pvc.yaml由于 StorageClass 使用
WaitForFirstConsumer绑定模式,PVC 此时为Pending状态,需在 Pod 引用后才完成绑定。说明storage请求值若超过步骤一查到的DISK-SIZE会创建失败。
步骤三:创建 GPU Pod 并挂载磁盘
创建
pod.yaml,通过volumeDevices以块设备形式接入:apiVersion: v1 kind: Pod metadata: name: gpu-workload namespace: default labels: alibabacloud.com/compute-class: "gpu-hpn" # 必填,指定 GPU-HPN 算力 spec: containers: - name: main # 示例:alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3:latest image: <your-gpu-image> volumeDevices: # 块设备用 volumeDevices - name: local-disk devicePath: /dev/xvda volumes: - name: local-disk persistentVolumeClaim: claimName: local-disk-pvc应用配置:
kubectl apply -f pod.yaml
步骤四:验证挂载与数据持久性
确认 PVC 已绑定:
kubectl get pvc local-disk-pvc预期输出:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE local-disk-pvc Bound local-passthrough-d0cfcee6-734d-4d59-ae76-xxxxxxxxxxxx 3750738264Ki RWOP local-passthrough 1m输出中
STATUS为Bound,表示 PVC 已与本地 NVMe 磁盘成功绑定,可正常挂载使用。确认 Pod 内可见块设备:
kubectl exec gpu-workload -- lsblk向块设备写入并读取数据:
# 向块设备写入数据 kubectl exec gpu-workload -- sh -c 'echo "test" > /dev/xvda' # 读取验证 kubectl exec gpu-workload -- head -c 5 /dev/xvda预期输出:
test验证 Pod 重建后数据保留(仅删 Pod、保留 PVC):
# 删除 Pod(保留 PVC) kubectl delete pod gpu-workload # 使用相同配置重建 Pod kubectl apply -f pod.yaml # 等待 Pod 就绪后读取数据 kubectl wait --for=condition=ready pod/gpu-workload --timeout=60s kubectl exec gpu-workload -- head -c 5 /dev/xvda预期输出仍为:
test
只要 PVC 不删,Pod 重建会重新调度到原节点并挂回同一块磁盘,数据保留。一旦 PVC 被删,数据立即被擦除。
清理资源
删除 PVC 会触发 local-passthrough StorageClass 配置的 reclaimPolicy: Delete 回收策略,磁盘数据被擦除后归还到容量池。
# 清理 Pod 和 PVC
kubectl delete pod gpu-workload
kubectl delete pvc local-disk-pvc验证回收:重建 PVC 与 Pod 后,新分配的磁盘应为空盘:
# 重建 PVC 和 Pod
kubectl apply -f pvc.yaml
kubectl apply -f pod.yaml
# 等待 Pod 就绪
kubectl wait --for=condition=ready pod/gpu-workload --timeout=60s
# 读取块设备
kubectl exec gpu-workload -- head -c 5 /dev/xvda预期:无输出(或空字节),说明分配到的磁盘已被擦除为空盘。
reclaimPolicy: Delete删除即不可恢复,请在删除 PVC 前确认数据已转存到持久化存储。重建 PVC 不保证调度到原节点。如需验证数据擦除,可为 Pod 添加节点亲和性,并创建足够多 Pod 占满目标节点的所有磁盘后逐一验证。
后续步骤
让训练或推理负载将数据读写指向
/dev/xvda,根据需要在容器内执行mkfs.ext4 /dev/xvda后挂载为文件系统,或直接以块 I/O 使用。mkfs为特权操作,需提交工单申请加白。评估缓存策略:仅将可重新生成的中间数据放在本地盘;模型权重、Checkpoint 仍存放在 CPFS 等持久化存储中。
监控磁盘使用:通过
kubectl get csistoragecapacities定期查看节点级容量水位。
配额与限制
仅支持块设备(
volumeMode: Block)。如需以文件系统方式使用,需在容器内自行执行mkfs格式化。mkfs为特权操作,需提交工单申请开通。仅支持
ReadWriteOncePod访问模式。1 块磁盘同一时刻只能被 1 个 Pod 独占挂载,不支持多 Pod 共享。本地盘与节点强绑定,不支持跨节点访问。
物理磁盘大小固定,不可弹性扩展。
每个 GPU-HPN Pod 仅允许挂载 1 块本地 NVMe 磁盘。
常见问题
Pod 和 PVC 为什么一直处于 Pending 状态?
由于 WaitForFirstConsumer 模式下 PVC 绑定依赖 Pod 调度成功,优先排查 Pod 调度失败原因。
kubectl describe pod gpu-workload常见原因:
现象 | 原因 | 排查/解决 |
| 没有节点同时满足 GPU 资源 + 本地 NVMe 可用 | 按步骤一确认有 |
| Pod 缺少 | 补上标签 |
| 自定义 | 调整调度约束 |
| PVC 侧问题 |
|
为什么写入大文件时提示空间不足?
实际可写容量 = 单盘物理容量(DISK-SIZE),与 PVC 的 storage 请求值无关。
数据怎样才能持久化?
本地盘不提供持久化保障。需持久化的数据请使用 NAS、OSS 或 CPFS 存储卷。