GPU-HPN 容量预留场景使用本地盘存储卷

更新时间:
复制 MD 格式

训练数据 shuffle、推理缓存这类高频读写走远端存储会被延迟拖慢。将 GPU-HPN 节点自带的本地 NVMe 磁盘以块设备直通到 GPU Pod,绕过文件系统层,读写性能接近裸盘。

工作原理

GPU-HPN 容量预留节点自带本地 NVMe 磁盘。通过 acs-local-passthrough-controller 组件,这些磁盘以块设备(Block Device)形式直通到 GPU Pod,绕过文件系统层,获得接近裸盘的读写性能。

维度

实现方式

挂载形式

块设备(volumeMode: Block)。

调度感知

基于 CSI StorageCapacity,调度器自动把 Pod 调度到有空闲磁盘的节点。

独占性

PVC 一旦绑定(Bound),即与一块物理磁盘固定关联,并由引用它的单个 Pod 独占使用。支持多个 PVC 并发创建,每个 PVC 各自独占一块磁盘。

容量

实际分配整块物理盘,不按 storage 请求值切分。

生命周期

Controller 自动完成磁盘的发现、分配、数据擦除和回收。删除 PVC 时,由 local-passthrough StorageClass 的 reclaimPolicy: Delete 策略触发数据擦除。

本地盘为临时存储,数据不持久。请勿存放无法重建的数据(如模型 Checkpoint、训练日志),需持久化的数据请使用 NAS、OSS 或 CPFS 存储卷。

本地盘数据在不同事件下的保留情况如下:

事件类别

事件

本地盘数据

Pod 操作

删除并重建 Pod(保留 PVC,重新调度回原节点)

保留

资源回收

删除 PVC

删除

节点

节点故障、释放或本地盘损坏

丢失

适用范围

  • 已创建 ACS集群,且集群版本为 1.33 及以上

  • 集群已创建 GPU-HPN 容量预留并关联到本集群。预留得到的是独占物理节点(自带本地 NVMe 磁盘),仅计算类型为高性能网络 GPU 型(compute-class: gpu-hpn)的 Pod 可调度到此类节点。具体操作,请参见GPU-HPN容量预留

  • 以下组件及版本为白名单开放,需先提交工单申请使用:

    • virtual-kubelet v2.18.0-rc.2 及以上

    • acs-local-passthrough-controller

挂载并使用本地盘存储卷

步骤一:查看可用的本地 NVMe 磁盘

创建 PVC 前,确认集群中有空闲的本地 NVMe 磁盘。

  1. 执行以下命令,查看各节点空闲的本地 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]}'
  2. 查看预期输出:

    NAME           NODE                                               DISK-SIZE        AVAILABLE
    csisc-12345    cn-wulanchabu-c.cr-ovt2bz1uoiyoxxxxxxxxx           3750738264Ki     2
    csisc-abcde    cn-wulanchabu-b.cr-xyz123456789xxxxxxxxx           3750738264Ki     1
    • DISK-SIZE:单块磁盘容量(maximumVolumeSize

    • AVAILABLE:该节点剩余可分配磁盘数(capacity / maximumVolumeSize

    说明

    若所有节点 AVAILABLE 均为 0,说明磁盘已全部被占用,需等待其他 PVC 释放或扩容节点。

步骤二:创建 PVC

  1. 创建 pvc.yaml,使用预设的 local-passthrough StorageClass。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 即可,实际分配整块物理盘
  2. 应用配置:

    kubectl apply -f pvc.yaml

    由于 StorageClass 使用 WaitForFirstConsumer 绑定模式,PVC 此时为 Pending 状态,需在 Pod 引用后才完成绑定。

    说明

    storage 请求值若超过步骤一查到的 DISK-SIZE 会创建失败。

步骤三:创建 GPU Pod 并挂载磁盘

  1. 创建 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
  2. 应用配置:

    kubectl apply -f pod.yaml

步骤四:验证挂载与数据持久性

  1. 确认 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

    输出中 STATUSBound,表示 PVC 已与本地 NVMe 磁盘成功绑定,可正常挂载使用。

  2. 确认 Pod 内可见块设备:

    kubectl exec gpu-workload -- lsblk
  3. 向块设备写入并读取数据:

    # 向块设备写入数据
    kubectl exec gpu-workload -- sh -c 'echo "test" > /dev/xvda'
    
    # 读取验证
    kubectl exec gpu-workload -- head -c 5 /dev/xvda

    预期输出:test

  4. 验证 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

常见原因:

现象

原因

排查/解决

FailedScheduling + 找不到节点

没有节点同时满足 GPU 资源 + 本地 NVMe 可用

按步骤一确认有 AVAILABLE > 0 的节点

FailedScheduling + 调度器跳过节点

Pod 缺少 alibabacloud.com/compute-class: "gpu-hpn" 标签

补上标签

FailedScheduling + nodeSelector 不匹配

自定义 nodeSelector / affinity 与有磁盘的节点冲突

调整调度约束

AttachVolume / MountVolume 报错

PVC 侧问题

kubectl describe pvc <pvc-name> 查看事件

为什么写入大文件时提示空间不足?

实际可写容量 = 单盘物理容量(DISK-SIZE),与 PVC 的 storage 请求值无关。

数据怎样才能持久化?

本地盘不提供持久化保障。需持久化的数据请使用 NAS、OSS 或 CPFS 存储卷。