将CPFS智算版从Hostpath挂载迁移至PVC挂载

简介: CPFS智算版是阿里云推出的高性能存储系统,适用于AI场景。早期通过Hostpath挂载,现支持PVC/PV方式,提升应用鲁棒性和数据持久性。本文介绍迁移背景、方案及操作步骤,助您顺利升级存储使用方式。

早期的CPFS智算版文件系统是随着灵骏节点一起部署,以Hostpath的形式挂载使用的,目前ACK已支持通过PVC/PV的方式挂载使用CPFS智算版文件系统。如果您有以Hostpath方式使用的CPFS智算版文件系统,建议迁移为PVC/PV的使用方式。


背景信息

CPFS智算版

CPFS智算版是阿里云面向AI服务推出的全新升级存储系统。通过创新的分布式并行存储架构设计,自研的高性能RoCE RDMA网络协议和虚拟存储通道技术,以及多级缓存弹性客户端,实现高吞吐、低延迟、Serverless化的高性能存储能力。更多信息,请参见CPFS智算版简介

Hostpath

Hostpath是Kubernetes原生支持的一种存储形态, 它支持通过Hostpath的形式将宿主机上的目录挂载到容器里面。使用方式如下:

  volumeMounts:
  - name: pvc-cpfs
    mountPath: /data
volumes:
- name: pvc-cpfs
  hostPath:
    path: /cpfs01

由于早期的CPFS智算版文件系统是随着灵骏节点一起部署的,该Hostpath目录(/cpfs01)一般是宿主机默认挂载的目录。


迁移场景

早期的CPFS智算版文件系统是随着灵骏节点一起部署,以Hostpath的形式挂载使用的,目前ACK已支持通过PVC/PV的方式挂载使用CPFS智算版文件系统。如果您有以Hostpath方式使用的CPFS智算版文件系统,建议迁移为PVC/PV的使用方式。

以下是PVC/PV相较于Hostpath的优势:

  • PVC/PV是Kubernetes使用外部存储的标准接口。该机制通过实现计算与存储的分离,可以极大地提升应用的鲁棒性与数据持久性。
  • 使用Hostpath方式无法自动额外为已有节点添加新的CPFS智算版文件系统;使用PVC/PV方式可以动态给已有节点关联新的CPFS智算版文件系统。
  • CPFS智算版文件系统依赖EFC客户端访问。使用Hostpath方式时,EFC客户端默认部署在节点上,运维复杂;使用PVC/PV方式时,EFC客户端会部署在容器内,后续需要升级EFC版本时,只需升级EFC客户端组件即可,无需升级节点上的EFC版本。
  • PVC/PV可以在集群纬度自适应使用,引用PVC/PV的Pod被调度到ECS节点时,会使用VPC挂载方式,被调度到灵骏节点时,会使用VSC挂载方式,可以简化使用成本。

环境准备

  1. 确保集群满足版本要求。如需升级集群,请参见升级集群
  • ACK托管集群Pro版:1.26及以上
  • ACK灵骏集群:1.20及以上
  1. 确保集群中已安装以下存储组件,且版本满足要求。您可以在集群的组件管理页面,确认组件版本,以及安装和升级组件。
  • bmcpfs-csi-controller组件为挂载CPFS智算版的CSI控制面组件,托管在阿里云侧。
  • bmcpfs-csi-node组件为挂载CPFS智算版的CSI节点侧组件,以DaemonSet形式部署在集群中。


终态迁移方案

下文以StatefulSet为例,介绍如何将现有的Hostpath挂载的StatefulSet迁移为PVC挂载的StatefulSet。

假设现有的StatefulSet的YAML配置如下:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-app-statefulset
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app-statefulset
  template:
    metadata:
      labels:
        app: my-app-statefulset
    spec:
      tolerations:
        - effect: NoSchedule
          key: node-role.alibabacloud.com/lingjun
          operator: Exists
      containers:
        - name: my-app-container
          image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
          volumeMounts:
            - name: my-data-volume
              mountPath: /data
      volumes:
        - name: my-data-volume
          hostPath:
            path: /cpfs01

将Hostpath挂载迁移为PVC挂载的步骤如下:

  1. 基于已有的CPFS智算版文件系统,使用以下YAML创建对应的PV和PVC。
apiVersion: v1
kind: PersistentVolume
metadata:
  name: bmcpfs
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 10Ti
  claimRef:
    name: bmcpfs
    namespace: default
  csi:
    driver: bmcpfsplugin.csi.alibabacloud.com
    volumeAttributes:
      path: /
    volumeHandle: bmcpfs-xxxxx
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: bmcpfs
  namespace: default
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 10Ti
  volumeMode: Filesystem
  volumeName: bmcpfs

以下为核心参数。详细参数说明请参见使用CPFS智算版静态存储卷


参数

说明

csi.volumeAttributes.path

挂载目录。默认为/,表示挂载CPFS文件系统的根目录,支持设置为子目录,如/dir。如果子目录不存在,挂载时会自动创建。

csi.volumeHandle

CPFS智算版文件系统的ID。


  1. 修改StatefulSet的YAML,将Hostpath挂载改为PVC挂载,并将updateStrategy设为onDelete
apiVersion: v1
kind: PersistentVolume
metadata:
  name: bmcpfs
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 10Ti
  claimRef:
    name: bmcpfs
    namespace: default
  csi:
    driver: bmcpfsplugin.csi.alibabacloud.com
    volumeAttributes:
      path: /
    volumeHandle: bmcpfs-xxxxx
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: bmcpfs
  namespace: default
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 10Ti
  volumeMode: Filesystem
  volumeName: bmcpfs


  1. 保存应用修改后的YAML文件,并确认StatefulSet存量Pod无变化。
  2. 删除StatefulSet中的某一个Pod,观察新创建的Pod是否采用了新的PVC挂载方式,并确认Pod已经正常启动。
  3. 删除StatefulSet中的其他Pod,等待各个Pod重新启动,直至所有Pod都已转换挂载方式。
  4. 修改StatefulSet的YAML,将updateStrategy改为原有的策略。

过渡迁移方案

如果出于业务稳定性考虑,暂时不想将所有Pod迁移到PVC挂载的使用方式,可采用以下方式作为过渡,在不修改Hostpath使用方式的前提下,使用新的CPFS智算版存储卷。

操作步骤

  1. 基于已有的CPFS智算版文件系统,使用以下YAML创建对应的PV和PVC。

说明
如果有多个CPFS智算版文件系统,则需要创建多对PV和PVC。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: bmcpfs
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 10Ti
  claimRef:
    name: bmcpfs
    namespace: default
  csi:
    driver: bmcpfsplugin.csi.alibabacloud.com
    volumeAttributes:
      path: /
    volumeHandle: bmcpfs-xxxxx
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: bmcpfs
  namespace: default
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 10Ti
  volumeMode: Filesystem
  volumeName: bmcpfs
  1. 使用以下YAML创建一个DaemonSet,该DaemonSet需引用所有现有的PVC。
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: host-symlink-creator-daemonset
  namespace: default
  labels:
    app: host-symlink-creator
  # 保证Daemonset不被删除, 但是Pod仍有可能通过修改nodeAffinity触发删除
  finalizers:
  - finalizers.example.com/cleanup
spec:
  selector:
    matchLabels:
      app: host-symlink-creator
  template:
    metadata:
      labels:
        app: host-symlink-creator
    spec:
      containers:
        - name: symlink-manager
          image: busybox:1.35
          # 注入Pod的UID作为环境变量
          env:
            - name: POD_UID
              valueFrom:
                fieldRef:
                  fieldPath: metadata.uid
          # 核心逻辑:查找真实挂载点并创建软链接
          command: ["/bin/sh", "-c"]
          args:
            - |
              set -e
              echo "启动软链接创建脚本..."
              echo "当前 Pod UID: ${POD_UID}"

              # 定义Kubelet在容器内的挂载点
              KUBELET_PODS_DIR="/var/lib/kubelet/pods"
              HOST_MNT_DIR="/host-mnt"

              # 构造Pod在宿主机上的卷目录路径
              POD_VOLUMES_PATH="${KUBELET_PODS_DIR}/${POD_UID}/volumes/kubernetes.io~csi"

              echo "正在搜索挂载点于: ${POD_VOLUMES_PATH}"

              # 等待一小段时间,确保Kubelet已完成挂载
              sleep 5

              # 检查目录是否存在
              if [ ! -d "${POD_VOLUMES_PATH}" ]; then
                echo "错误: 找不到 Pod 卷目录 ${POD_VOLUMES_PATH}"
                exit 1
              fi
              
              # 查找真实的挂载点(通常名为 'mount' 的目录)
              # 对于只有一个CSI卷的Pod,这个find命令会返回唯一的结果
              SOURCE_HOST_PATH=$(find "${POD_VOLUMES_PATH}" -type d -name "mount" | head -n 1)

              if [ -z "${SOURCE_HOST_PATH}" ]; then
                  echo "错误: 在 ${POD_VOLUMES_PATH} 中未找到名为 'mount' 的挂载目录!"
                  exit 1
              fi
              
              echo "成功找到宿主机上的挂载点: ${SOURCE_HOST_PATH}"

              # 从路径中提取PV名称作为软链接的名称
              # 例如,从 /.../pvc-xxx-yyy/mount中提取pvc-xxx-yyy
              PV_NAME=$(basename $(dirname "${SOURCE_HOST_PATH}"))
              
              # 定义软链接在宿主机上的最终路径
              DEST_LINK_PATH="${HOST_MNT_DIR}/${PV_NAME}"

              echo "准备创建软链接: ${DEST_LINK_PATH} -> ${SOURCE_HOST_PATH}"

              # 检查并创建软链接(幂等性)
              if [ -L "${DEST_LINK_PATH}" ]; then
                  echo "软链接 ${DEST_LINK_PATH} 已存在。"
              elif [ -e "${DEST_LINK_PATH}" ]; then
                  echo "错误: ${DEST_LINK_PATH} 已存在但不是一个软链接!"
                  exit 1
              else
                  # 注意:我们创建的软链接,其源和目标都是相对于宿主机根目录的绝对路径
                  # 但我们是在容器内执行 ln 命令,所以路径需要是容器内的路径
                  ln -s "${SOURCE_HOST_PATH}" "${DEST_LINK_PATH}"
                  echo "软链接创建成功!"
              fi
              
              echo "初始化完成,容器进入休眠状态。"
              sleep infinity
          volumeMounts:
            # 将宿主机的/var/lib/kubelet挂载进来 (只读更安全)
            - name: host-kubelet-path
              mountPath: /var/lib/kubelet
              readOnly: true
            - name: pvc-for-trigger
              mountPath: /data
            # 将宿主机的/mnt挂载进来,用于创建软链接
            - name: host-mnt-storage
              mountPath: /host-mnt
      volumes:
        - name: pvc-for-trigger
          persistentVolumeClaim:
            claimName: bmcpfs
        # 定义宿主机Kubelet目录的挂载
        - name: host-kubelet-path
          hostPath:
            path: /var/lib/kubelet
            type: Directory
        # 定义宿主机mnt目录的挂载
        - name: host-mnt-storage
          hostPath:
            path: /mnt
            type: DirectoryOrCreate


重要

  • /mnt目录下(或其他自定义目录)里的软链接将在该Pod被删除之后失效,无法自动回收,您需要手动清理该目录下的软链接。
  • 由于该DamonSet将容器内部的挂载目录映射到了宿主机上,所以该DamonSet无法创建多个,您需要保证该DamonSet的存活。
  • 为了不影响现有服务,如果有序有新增的CPFS智算版文件系统对应的PVC/PV需要挂载,您需要创建新的DamonSet,而不是修改现有DamonSet。


  1. 使用以下YAML创建应用,并使用透出到节点的软链路径。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cpfs-test-hostpath
  labels:
    app: cpfs-test-hostpath
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cpfs-test
  strategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: cpfs-test
    spec:
      tolerations:
        - effect: NoSchedule
          key: node-role.alibabacloud.com/lingjun
          operator: Exists
      containers:
      - name: nginx
        image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
        ports:
        - containerPort: 80
        volumeMounts:
          - name: pvc-cpfs
            mountPath: /data
      volumes:
        - name: pvc-cpfs
          hostPath:
            path: /mnt/${PV_NAME}


续步骤

后续当全部的CPFS智算版文件系统均已转为PVC挂载时,您需要清理过渡迁移方案创建的DamonSet(可能多个)。

  1. 确认节点上没有使用Hostpath挂载方式的Pod存活。
  2. 删除DamonSet。
  3. 在DamonSet对应的节点上,批量执行以下命令,以清理软链接。
find /mnt -xtype l -print -delete
  1. 迁移到终态迁移方案


目录
相关文章
|
3月前
|
Apache 数据安全/隐私保护 Docker
【开源问答系统】GitHub 14.9k star 的开源问答引擎来了,三分钟搭建完成~~~
Apache Answer 是一款开源问答系统,助力团队将零散知识沉淀为结构化资产。支持 Docker 快速部署、插件扩展、权限控制与多语言,兼具高效搜索、投票排序与私有化部署能力,适用于技术社区、企业知识库与用户支持场景。
566 22
|
5月前
|
人工智能 缓存 Kubernetes
ACK GIE配置建议
Gateway with Inference Extension是基于Kubernetes社区Gateway API及其扩展规范实现的增强型组件,支持四层/七层路由服务,并面向生成式AI推理场景提供负载均衡优化、服务管理简化等能力,适用于AI推理服务的高可用部署与性能优化。在不同的场景使用ACK Gateway with Inference Extension时,可能需要根据业务需求和高可用需要对网关和推理扩展进行不同的配置调整。本文主要介绍在实际业务场景中针对ACK GIE的配置建议,以获得更好的使用效果。
351 23
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
ReasonRank:从关键词匹配到逻辑推理,排序准确性大幅超越传统方法
ReasonRank是一种创新段落重排系统,采用自动化数据合成与两阶段训练(监督微调+强化学习),在BRIGHT等测试中超越更大模型,显著提升信息检索中的推理能力。
190 0
ReasonRank:从关键词匹配到逻辑推理,排序准确性大幅超越传统方法
|
存储 Kubernetes API
kubernetes【存储】1. 共享存储pv、pvc、StorageClass使用详解(1)
kubernetes【存储】1. 共享存储pv、pvc、StorageClass使用详解(1)
kubernetes【存储】1. 共享存储pv、pvc、StorageClass使用详解(1)
|
4月前
|
传感器 数据采集 人工智能
衣服也能看病?智能织物正悄悄改变医疗的未来
衣服也能看病?智能织物正悄悄改变医疗的未来
129 0
|
4月前
|
搜索推荐 算法
桶排序算法
桶排序是一种高效的排序算法,基于分治思想,理想时间复杂度为O(n)。它通过将数据分到多个桶中,每个桶再单独排序,最后按序合并各桶元素,从而实现整体有序。
196 0
|
11月前
|
存储 缓存 人工智能
深度解析CPFS 在 LLM 场景下的高性能存储技术
本文深入探讨了CPFS在大语言模型(LLM)训练中的端到端性能优化策略,涵盖计算端缓存加速、智能网卡加速、数据并行访问及数据流优化等方面。重点分析了大模型对存储系统的挑战,包括计算规模扩大、算力多样性及数据集增长带来的压力。通过分布式P2P读缓存、IO加速、高性能存算通路技术以及智能数据管理等手段,显著提升了存储系统的吞吐量和响应速度,有效提高了GPU利用率,降低了延迟,从而加速了大模型的训练进程。总结了CPFS在AI训练场景中的创新与优化实践,为未来大模型发展提供了有力支持。
|
12月前
|
存储 固态存储 文件存储
并行文件存储在大模型训练中的探索与实践
阿里云智能集团存储产品专家何邦剑分享了并行文件存储CPFS在大模型训练中的应用。CPFS针对大模型训练的IO特点,优化性能、降低成本、提升用户体验。它支持多计算平台共享访问,具备数据分层存储、生命周期管理、缓存加速等特性,实现高效的数据处理与管理,显著提升训练效率和资源利用率。尤其在大规模集群中,CPFS提供了高吞吐、低延迟及灵活扩展的能力,助力客户如零一万物实现高性能训练。
|
数据可视化 图形学 UED
只需四步,轻松开发三维模型Web应用
为了让用户更方便地应用三维模型,阿里云DataV提供了一套完整的三维模型Web模型开发方案,包括三维模型托管、应用开发、交互开发、应用分发等完整功能。只需69.3元/年,就能体验三维模型Web应用开发功能!
972 9
只需四步,轻松开发三维模型Web应用