CPFS智算版具有高吞吐量和IOPS性能,支持端到端RDMA网络加速,适用于AIGC、自动驾驶等智算场景。ACK支持将CPFS智算版文件系统以静态存储卷(PV)的形式挂载给工作负载使用。
功能介绍
基于CSI组件,ACK支持以PV/PVC的方式为工作负载挂载CPFS智算版静态存储卷。CSI会根据Pod最终调度的节点类型,自动选择最优的挂载方式:
VSC挂载:仅支持灵骏节点,需提交工单开通白名单。
VPC挂载:支持非灵骏节点,通过创建VPC挂载点实现。同一VPC下的节点均可挂载访问。
前提条件
已了解CPFS智算版的CPFS智算版使用限制。
集群版本为1.26及以上版本。如需升级集群,请参见手动升级集群。
集群中已安装以下存储组件,且版本满足要求。
可在集群的组件管理页面,确认组件版本、安装或升级组件。
CSI组件(csi-plugin和csi-provisioner):csi-plugin组件的版本为v1.33.1及以上。如需升级,请参见管理csi-plugin和csi-provisioner组件。
cnfs-nas-daemon组件:版本为0.1.2及以上。
bmcpfs-csi组件:包括bmcpfs-csi-controller(控制面组件,由ACK托管)和bmcpfs-csi-node(节点侧组件,以DaemonSet形式部署在集群中)。
注意事项
使用VSC挂载时,运行 Pod 的节点必须与 CPFS 智算版文件系统实例处于同一 hpn-zone。
不支持在同一个Pod中通过多个PV挂载源于同一个CPFS实例的不同子目录。由于底层驱动的限制,此类配置会导致Pod挂载失败而无法启动。
推荐仅为该CPFS实例创建一个PV/PVC,然后在Pod的
volumeMounts配置中使用subPath字段来分别挂载所需的子目录。subPath基于轻量级的bind mount机制实现,不会带来额外性能开销。
步骤一:创建CPFS文件系统
参见创建CPFS智算版文件系统创建CPFS文件系统,并记录文件系统ID。
(可选)如需在非灵骏节点实现挂载,请创建VPC挂载点(与集群节点所在的VPC一致),并记录挂载点域名。格式为
cpfs-***-vpc-***.<Region>.cpfs.aliyuncs.com。如果Pod将调度到灵骏节点,则默认使用VSC挂载,无需此步骤。
步骤二:创建PV和PVC
基于已有的CPFS文件系统,创建对应的PV和PVC。
修改以下YAML示例,保存为bmcpfs-pv-pvc.yaml。
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: # 如果Pod调度至非灵骏节点,此项为必填,否则挂载会失败 vpcMountTarget: cpfs-***-vpc-***.<Region>.cpfs.aliyuncs.com # 将volumeHandle替换为CPFS智算版文件系统ID volumeHandle: bmcpfs-***** mountOptions: [] --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: bmcpfs namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 10Ti volumeMode: Filesystem volumeName: bmcpfsPV参数
参数
说明
accessModesPV的访问模式。
capacity.storage声明存储卷容量。仅作声明,不影响实际容量。
csi.driver驱动类型。挂载CPFS智算版时,固定为
bmcpfsplugin.csi.alibabacloud.com。csi.volumeAttributes.vpcMountTargetCPFS的VPC挂载点域名。置空会导致在非灵骏节点上挂载失败。
如果Pod调度至灵骏节点,则无需设置。
csi.volumeHandleCPFS文件系统的ID。
mountOptions挂载参数。
PVC参数
参数
说明
accessModesPVC请求PV的访问模式,需与PV匹配。
resources.requests.storage分配给Pod的存储容量。不大于PV容量。
volumeMode挂载模式,需设置为
Filesystem。volumeNamePVC要绑定的PV名称。
创建PV和PVC。
kubectl apply -f bmcpfs-pv-pvc.yaml
确认PVC已绑定PV。
kubectl get pvc bmcpfs预期输出:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE bmcpfs Bound bmcpfs 10Ti RWX <unset> 51sSTATUS为Bound,PV和PVC绑定成功。
步骤三:创建应用并挂载CPFS
场景一:挂载整个CPFS文件系统
此场景将整个CPFS文件系统挂载到容器中。
使用以下YAML内容,创建
cpfs-test.yaml文件,声明挂载CPFS智算版静态存储卷。apiVersion: apps/v1 kind: Deployment metadata: name: cpfs-test labels: app: cpfs-test spec: replicas: 2 selector: matchLabels: app: cpfs-test template: metadata: labels: app: cpfs-test spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - name: pvc-cpfs mountPath: /data volumes: - name: pvc-cpfs persistentVolumeClaim: claimName: bmcpfs创建Deployment。
kubectl create -f cpfs-test.yaml查看Pod部署情况。
kubectl get pod -l app=cpfs-test预期输出:
NAME READY STATUS RESTARTS AGE cpfs-test-76b77d64b5-2hw96 1/1 Running 0 42s cpfs-test-76b77d64b5-dnwdx 1/1 Running 0 42s进入任一Pod,验证CPFS智算版静态存储卷是否挂载成功。
kubectl exec -it <pod-name> -- mount | grep /data预期输出如下,表明CPFS智算版静态存储卷挂载成功。
bindroot-f0a5c-******:cpfs-*******-vpc-****.cn-shanghai.cpfs.aliyuncs.com:/ on /data type fuse.aliyun-alinas-efc (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=1048576)
场景二:挂载整个CPFS文件系统的子目录
在共享存储场景中,如需实现多租户或多任务的数据隔离,让多个应用Pod 共享同一个 CPFS 卷,但又各自拥有独立目录时,可通过 volumeMounts.subPath 来实现。
参见以下内容,创建 pod.yaml。Pod包含两个容器,分别通过
subPath挂载同一个PVC (bmcpfs) 的不同子目录。当Pod挂载时,如果
subPath指定的子目录(例如workspace/alpha)在CPFS文件系统中不存在,系统将自动创建。apiVersion: v1 kind: Pod metadata: name: cpfs-subpath-demo-pod spec: containers: - name: task-alpha-container image: busybox:1.35 command: ["/bin/sh", "-c", "sleep 3600"] volumeMounts: - name: cpfs-storage mountPath: /data/workspace # 容器内的挂载路径 subPath: workspace/alpha # 指定挂载卷内的 workspace/alpha 子目录,而非整个卷 - name: task-beta-container image: busybox:1.35 command: ["/bin/sh", "-c", "sleep 3600"] volumeMounts: - name: cpfs-storage mountPath: /data/workspace # 容器内的挂载路径可以相同 subPath: workspace/beta # 指定挂载卷内的 workspace/beta 子目录,而非整个卷 volumes: - name: cpfs-storage persistentVolumeClaim: claimName: bmcpfs # 引用此前创建的PVC部署Pod。
kubectl apply -f pod.yaml验证 task-alpha 容器的挂载和写入。
连接到task-alpha容器。
kubectl exec -it cpfs-subpath-demo-pod -c task-alpha-container -- /bin/sh查看已挂载的文件系统,确认 CPFS 存储卷是否存在。
df -h预期输出如下,表明共享目录(/share)已被成功挂载到容器内的 /data/workspace 路径下。
Filesystem Size Used Available Use% Mounted on ... 192.XX.XX.0:/share 10.0T 1.0G 10.0T 0% /data/workspace ...检查挂载点的父目录结构。
ls -l /data/预期输出如下,表明/data 目录下存在名为 workspace 的子目录。
total 4 drwxr-xr-x 2 root root 4096 Aug 15 10:00 workspace在挂载目录中创建文件以验证写入权限。
echo "hello from alpha" > /data/workspace/alpha.log exit
验证 task-beta 容器的挂载和数据隔离。
连接到
task-beta容器。kubectl exec -it cpfs-subpath-demo-pod -c task-beta-container -- /bin/sh在容器的挂载点 /data/workspace 中创建文件。
echo "hello from beta" > /data/workspace/beta.log检查/data/workspace/目录下的文件。
ls -l /data/workspace/预期输出如下,表明beta.log写入成功,且不存在alpha.log,两个容器间的数据相互隔离。
total 4 -rw-r--r-- 1 root root 16 Aug 15 10:05 beta.log