早期的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挂载方式,可以简化使用成本。
环境准备
- 确保集群满足版本要求。如需升级集群,请参见升级集群。
- ACK托管集群Pro版:1.26及以上
- ACK灵骏集群:1.20及以上
- 确保集群中已安装以下存储组件,且版本满足要求。您可以在集群的组件管理页面,确认组件版本,以及安装和升级组件。
- 已安装CSI组件(csi-plugin和csi-provisioner),且csi-plugin组件的版本为v1.33.1及以上。如需升级,请参见管理csi-plugin和csi-provisioner组件。
- 已安装cnfs-nas-daemon组件,且版本为0.1.2以上及以上。更多信息,请参见管理cnfs-nas-daemon组件。
- 已安装bmcpfs-csi-controller组件和bmcpfs-csi-node组件。
- 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 replicas1 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挂载的步骤如下:
- 基于已有的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智算版静态存储卷。
参数 |
说明 |
|
挂载目录。默认为 |
|
CPFS智算版文件系统的ID。 |
- 修改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
- 保存应用修改后的YAML文件,并确认StatefulSet存量Pod无变化。
- 删除StatefulSet中的某一个Pod,观察新创建的Pod是否采用了新的PVC挂载方式,并确认Pod已经正常启动。
- 删除StatefulSet中的其他Pod,等待各个Pod重新启动,直至所有Pod都已转换挂载方式。
- 修改StatefulSet的YAML,将
updateStrategy
改为原有的策略。
过渡迁移方案
如果出于业务稳定性考虑,暂时不想将所有Pod迁移到PVC挂载的使用方式,可采用以下方式作为过渡,在不修改Hostpath使用方式的前提下,使用新的CPFS智算版存储卷。
操作步骤
- 基于已有的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
- 使用以下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 busybox1.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 "${POD_VOLUMES_PATH}" ; then ! -d 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 "${SOURCE_HOST_PATH}" ; then -z 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 "${DEST_LINK_PATH}" ; then -L echo "软链接 ${DEST_LINK_PATH} 已存在。" elif "${DEST_LINK_PATH}" ; then -e 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 readOnlytrue 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。
- 使用以下YAML创建应用,并使用透出到节点的软链路径。
apiVersion apps/v1 kind Deployment metadata name cpfs-test-hostpath labels app cpfs-test-hostpath spec replicas1 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 containerPort80 volumeMounts name pvc-cpfs mountPath /data volumes name pvc-cpfs hostPath path /mnt/$ PV_NAME
后续步骤
后续当全部的CPFS智算版文件系统均已转为PVC挂载时,您需要清理过渡迁移方案创建的DamonSet(可能多个)。
- 确认节点上没有使用Hostpath挂载方式的Pod存活。
- 删除DamonSet。
- 在DamonSet对应的节点上,批量执行以下命令,以清理软链接。
find /mnt -xtype l -print -delete
- 迁移到终态迁移方案。