CPFS是一种高吞吐、高IOPS的并行文件系统,适用于AI训练、自动驾驶等高性能计算(HPC)场景。在ACK集群中,多个Pod可以挂载同一个CPFS通用版静态存储卷,以实现高性能的数据共享和持久化存储。
工作原理
在ACK集群中挂载CPFS通用版静态存储卷主要流程如下。
创建PV:在集群中“注册”已有的CPFS通用版,声明其挂载地址、容量、访问模式等。
创建PVC:应用通过PVC来“申请”使用已注册的存储资源。PVC会与符合条件的PV自动绑定。
在应用中挂载:将已绑定的PVC挂载到应用Pod中,作为容器内的一个持久化目录。
准备工作
检查并升级CSI组件:已确保csi-plugin和csi-provisioner组件版本不低于v1.22.11-abbb810e-aliyun。
如需升级,请参见升级CSI组件。
已配置存储组件,以支持CPFS的挂载。
已准备CPFS通用版文件系统、协议服务和可供ACK集群挂载的挂载地址。
如未创建,请在集群所属地域创建CPFS通用版文件系统,使用集群对应的VPC和交换机创建协议服务,并生成挂载点。
文件系统:为CPFS通用版开服地域,且与集群位于同一地域,版本为2.3.0及以上。
在NAS控制台的文件系统列表页面单击目标CPFS文件系统,在基本信息页面确认CPFS版本号。
协议服务:CPFS不支持跨VPC挂载,使用的VPC需与集群一致。
已获取服务协议的挂载地址(由挂载点域名和导出目录组成)。如指定导出
/目录,则挂载地址为cpfs-****.<Region ID>.cpfs.aliyuncs.com:/share。在协议服务页面,单击导出目录,在挂载地址列复制并保存挂载地址。
已了解CPFS通用版的使用限制。
步骤一:创建PV
在集群中创建PV,用于“注册”已有的CPFS文件系统。
将以下内容保存为cpfs-pv.yaml文件。
apiVersion: v1 kind: PersistentVolume metadata: name: cpfs-pv labels: # 定义标签,用于后续PVC绑定 alicloud-pvname: cpfs-pv spec: accessModes: # 访问模式 - ReadWriteMany capacity: storage: 20Gi # 定义PV的总容量 csi: driver: nasplugin.csi.alibabacloud.com # 固定为此值 volumeAttributes: mountProtocol: cpfs-nfs # 使用NFS协议进行挂载 path: "/share" # 挂载地址中的挂载目录 volumeAs: subpath # 子目录 server: "cpfs-******-******.cn-shanghai.cpfs.aliyuncs.com" # 挂载地址中的挂载点域名 volumeHandle: cpfs-pv # 卷的唯一标识符,与metadata.name保持一致 mountOptions: # NFS挂载参数 - rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport - vers=3核心参数说明:
参数
说明
accessModesPV的访问模式。
capacity.storage声明存储卷容量。
csi.driver驱动类型,使用CPFS通用版时固定为
nasplugin.csi.alibabacloud.com。csi.volumeAttributes.serverCPFS通用版协议服务导出目录的挂载地址中的挂载点域名。
csi.volumeAttributes.pathCPFS通用版协议服务导出目录的挂载地址中的挂载目录,例如
/share。支持设置为子目录,例如/share/dir。csi.volumeAttributes.mountProtocolcpfs-nfs表示使用NFS协议挂载CPFS。csi.volumeAttributes.volumeAssubpath表示创建子目录类型的PV。csi.volumeHandle与PV Name保持一致。
执行以下命令创建PV。
kubectl apply -f cpfs-pv.yaml查看PV状态。
kubectl get pv cpfs-pv预期输出:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE cpfs-pv 20Gi RWX Retain Available 2s
步骤二:创建PVC
创建PVC,用于“申请”使用上一步注册的存储资源。
将以下内容保存为cpfs-pvc.yaml。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: cpfs-pvc spec: accessModes: - ReadWriteMany # 访问模式 resources: requests: storage: 20Gi # 请求的存储容量 selector: # matchLabels: alicloud-pvname: cpfs-pv # 精确绑定此前创建的PV参数
说明
accessModesPVC请求PV的访问模式。
selector使用PV上的Label进行匹配绑定。
resources.requests.storage分配给Pod的存储容量。不大于PV容量即可。
创建PVC。
kubectl apply -f cpfs-pvc.yaml查看PVC状态,确认已与PV成功绑定。
kubectl get pvc cpfs-pvc返回示例如下:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE cpfs-pvc Bound cpfs-pv 20Gi RWO <unset> 18m
步骤三:创建应用并挂载
创建应用负载,并在其配置中声明使用此前创建的PVC。
将以下内容保存为cpfs-test.yaml。
apiVersion: apps/v1 kind: StatefulSet metadata: name: cpfs-sts spec: selector: matchLabels: app: nginx serviceName: "nginx" replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 volumeMounts: - name: cpfs-pvc mountPath: /data # 将存储卷挂载到容器内的/data目录 volumes: - name: cpfs-pvc persistentVolumeClaim: claimName: cpfs-pvc # 引用此前创建的PVC创建StatefulSet。
kubectl apply -f cpfs-test.yaml查看Pod状态。
kubectl get pods -l app=nginx预期输出:
NAME READY STATUS RESTARTS AGE cpfs-sts-0 1/1 Running 0 58s cpfs-sts-1 1/1 Running 0 50s检查容器内的挂载点,确认CPFS已挂载成功。
kubectl exec cpfs-sts-0 -- mount | grep /data预期输出如下,说明CPFS通用版静态卷挂载成功。
cpfs-******-******.cn-shanghai.cpfs.aliyuncs.com:/share on /data type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,nolock,noresvport,proto=tcp,port=30000,timeo=600,retrans=2,sec=sys,mountaddr=127.0.1.255,mountvers=3,mountport=30000,mountproto=tcp,local_lock=all,addr=127.0.1.255)
验证共享存储和持久化存储
成功部署应用后,可验证存储卷是否按预期工作。
共享存储
在一个Pod中创建文件,然后另一个Pod中查看,验证数据的共享存储。
查看Pod信息,获取Pod名称。
kubectl get pod -l app=nginx预期输出:
NAME READY STATUS RESTARTS AGE cpfs-sts-0 1/1 Running 0 10s cpfs-sts-1 1/1 Running 0 5s在一个Pod中创建文件。
以名为
cpfs-sts-0的Pod作为示例:kubectl exec cpfs-sts-0 -- touch /data/test.txt在另一个Pod中查看文件是否存在。
以名为
cpfs-sts-1的Pod为例。kubectl exec cpfs-sts-1 -- ls /data预期输出:
test.txt可以查看到此前新建的文件,表明数据可在多Pod间共享。
持久化存储
重建Deployment,在新建Pod中查看文件系统中的数据是否存在,验证数据的持久化存储。
删除应用Pod以触发重建。
kubectl rollout restart sts cpfs-sts查看Pod,等待新Pod启动并进入Running状态。
kubectl get pod -l app=nginx预期输出:
NAME READY STATUS RESTARTS AGE cpfs-sts-0 1/1 Running 0 1s cpfs-sts-1 1/1 Running 0 10s在新Pod中查看此前创建的文件是否存在。
以名为
cpfs-sts-0的Pod为例。kubectl exec cpfs-sts-0 -- ls /data预期输出:
test.txt可以查看到此前写入的文件,表明数据可持久化存储。
生产环境使用建议
性能调优:CPFS适用于高吞吐和高IOPS场景。可在PV的
mountOptions中调整NFS挂载参数(如rsize、wsize)以优化性能,满足特定工作负载需求。数据一致性:CPFS作为共享存储,不保证多个Pod并发写入同一文件的数据一致性。为避免文件损坏,需在应用层面自行实现分布式锁或采用仅追加(Append-only)的写入模式。
存储卷管理:静态存储卷的方式需手动管理PV。对于需要为多个应用自动创建、隔离存储卷的场景,推荐使用CNFS管理CPFS动态存储卷,请参见管理CPFS通用版动态存储卷。