全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:通过CNFS管理NAS文件系统

更新时间:Jan 08, 2026

通过容器网络文件系统CNFS,可将NAS文件系统作为原生Kubernetes资源进行管理,以声明式方式完成NAS的创建、纳管和使用。这为网站、数据分析等工作负载提供了简单、高效的持久化存储卷,并能灵活支持数据共享与隔离等多种业务场景。

准备工作

  • 已创建1.20以上版本的ACK托管集群Pro版。如需升级,请参见手动升级集群

    通过kubectl使用CNFS时,支持1.20版本。
  • 相关存储组件版本满足以下要求。如需升级,请参见组件

    • csi-plugin和csi-provisioner:v1.24.11-5221f79-aliyun及以上。

    • storage-operator:v1.26.2-1de13b6-aliyun及以上。

  • 已开通文件存储NAS服务。NAS文件系统限制如下,详见使用限制

    • 仅支持通用型NAS的容量型、性能型和高级型,不支持极速型NAS。

    • 每个账号在单个地域内可创建的NAS文件系统数量存在上限

    • 如需对NAS文件系统进行KMS加密,需开通KMS服务,详见购买专属KMS实例

创建NAS文件系统

选择NAS文件系统的创建与接入方式

开始操作前,选择如何为集群提供NAS文件系统。

image

方式

说明

卷提供方式

适用场景

方式一:自动创建并使用NAS文件系统

CNFS自动创建并管理一个配置固定的NAS文件系统,实现快速挂载。

动态卷

  • 快速功能验证。

  • 无需关心底层存储细节,但创建的NAS配置较为固定,无法灵活选择存储类型、自定义加密方式或精细化管理回收站功能等。

方式二:自定义参数创建并使用NAS文件系统

CNFS根据参数配置,创建一个全新的、可自定义的NAS文件系统。

  • 动态卷

  • 静态卷

对性能、加密、成本等有特定要求,或需要精细化管理存储。

方式三:纳管并使用已有的NAS文件系统

将已存在的NAS文件系统接入CNFS进行统一管理。

  • 动态卷

  • 静态卷

将已有NAS平滑接入集群。

方式一:自动创建并使用NAS文件系统

通过CNFS自动创建一个默认配置的NAS文件系统。CNFS会根据集群环境完成创建,默认不加密。若当前地域不支持容量型NAS,则自动使用性能型NAS。

创建CNFS资源和StorageClass后,工作负载通过PVC请求存储,即可在NAS上动态创建PV并挂载至Pod。

kubectl

1. 创建CNFS

创建一个ContainerNetworkFileSystem对象,不指定server或其他自定义参数,CNFS将自动创建一个默认的NAS文件系统。
apiVersion: storage.alibabacloud.com/v1beta1
kind: ContainerNetworkFileSystem
metadata:
  name: cnfs-nas-filesystem
spec:
  description: "cnfs"
  type: nas
  # 仅支持Retain,删除CNFS时不会删除后端的NAS实例
  reclaimPolicy: Retain
  parameters:
    # 是否对文件启用NAS托管密钥,SSE-KMS表示启用
    encryptType: SSE-KMS
    # 是否启用回收站功能,true表示开启
    enableTrashCan: "true"

展开查看参数说明

参数

说明

description

当前CNFS的描述。

type

需要创建的存储卷类型,使用nas

reclaimPolicy

回收策略。当前仅支持Retain,删除CNFS时不会删除后端的NAS文件系统,防止数据丢失。

parameters.encryptType

可选,是否启用加密方式

  • None:不加密。

  • SSE-KMS:启用NAS托管密钥,即使用NAS完全托管的密钥加密每个文件系统,该密钥由NAS在KMS中创建和管理。

parameters.enableTrashCan

是否开启回收站功能,避免误删除文件导致业务受阻或数据丢失。

  • true:开启。

  • false:不开启。

  • 执行kubectl get cnfs查看创建的NAS文件系统。

  • 执行kubectl get cnfs/cnfs-nas-filesystem -o yaml查看NAS文件系统的详细信息。

    YAML解析详见CNFS YAML说明

2. 创建StorageClass

创建StorageClass对象作为存储模板,通过containerNetworkFileSystem参数关联到此前创建的CNFS。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: alibabacloud-cnfs-nas
provisioner: nasplugin.csi.alibabacloud.com
parameters:
  # 每个PVC都在NAS下创建独立的子目录
  volumeAs: subpath
  # 关联到上面定义的CNFS
  containerNetworkFileSystem: cnfs-nas-filesystem
  path: "/"
# 建议设为Retain,删除PVC时保留后端子目录数据
reclaimPolicy: Retain
# 允许存储卷扩容
allowVolumeExpansion: true
mountOptions:
  - nolock,tcp,noresvport
  - vers=3

3. 创建PVC

应用通过PVC申请存储卷,并引用StorageClass作为配置模板。
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: cnfs-nas-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: alibabacloud-cnfs-nas
  resources:
    requests:
      # 若 allowVolumeExpansion 为 true,此处 storage 取值将作为该 PVC 对应子目录的配额。动态创建目录写入数据量最大为 70 GiB
      storage: 70Gi  

4. 创建应用并挂载PVC

PVC创建后,部署示例应用(如Deployment或StatefulSet),将PVC绑定的 PV 挂载到应用中。
  • Deployment:所有Pod副本引用同一个PVC,挂载后端NAS的同一目录,实现数据共享。

    展开查看示例代码

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: cnfs-nas-deployment
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      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:
            - mountPath: "/data"
              name: cnfs-nas-pvc
          volumes:
          - name: cnfs-nas-pvc
            persistentVolumeClaim:
              claimName: cnfs-nas-pvc
  • StatefulSet:基于volumeClaimTemplates模板为每个Pod副本自动创建一个独立的PVC,挂载后端NAS的专属子目录,实现数据隔离。

    展开查看示例代码

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: cnfs-nas-sts
      labels:
        app: nginx
    spec:
      serviceName: "nginx"
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      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:
            - mountPath: "/data"
              name: www
      volumeClaimTemplates:
      - metadata:
          name: www
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: "alibabacloud-cnfs-nas"
          resources:
            requests:
              # 若allowVolumeExpansion 为 true,则 storage 参数生效,动态创建目录写入数据量最大为50 GiB
              storage: 50Gi 

5. 结果验证

控制台

1. 创建CNFS

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择存储 > 容器网络文件系统CNFS

  3. 单击创建容器网络文件系统,按照页面提示配置CNFS。

    • 选择NAS文件系统

    • 选择创建默认NAS

    • 按需开启全链路加速,以利用弹性加速特性进行挂载,优化数据访问性能,详情请参见通过CNFS使用EFC客户端挂载NAS

    创建后,可在CNFS列表单击目标CNFS查看详情,然后单击NAS ID进入创建的NAS文件系统详情页。单击挂载使用,可在挂载点地址列获取目标挂载点的挂载点地址。

2. 创建StorageClass

  1. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择存储 > 存储类

  2. 存储类页面,单击创建,选择存储卷类型NAS,按照页面提示完成StorageClass的配置。

    主要配置项如下。详见创建StorageClass

    • 选择挂载点:选择通过CNFS创建或纳管的NAS文件系统的挂载点地址。

      关于如何查看挂载点地址,请参见管理挂载点
    • 挂载路径:待挂载的NAS子目录。如果未设置,则默认挂载到根目录。通用型NAS的根目录为/

      如果NAS中没有该目录,系统会自动创建并进行挂载。
    • 回收策略:当前仅支持Retain,删除CNFS时不会删除后端的NAS文件系统,防止数据丢失。

3. 创建PVC

  1. 在集群管理页左侧导航栏,选择存储 > 存储声明

  2. 存储声明页面,单击创建,选择存储声明类型为NAS,按照页面提示完成PVC的配置。

    • 分配模式:存储卷使用方式。

    • 已有存储卷类:单击选择存储类,选择此前创建的StorageClass。

    • 总量:所创建存储卷的容量,不超过待挂载的存储卷容量。

    • 访问模式:默认为ReadWriteMany,也可选择ReadWriteOnce或ReadOnlyMany。

4. 创建应用并挂载NAS

创建Deployment创建StatefulSet时,在容器配置页面的数据卷区域,可以配置PVC挂载到容器。

以下示例表示将通过CNFS创建的NAS文件系统挂载到容器中的/data路径下。

image

方式二:自定义参数创建并使用NAS文件系统

通过CNFS创建一个具有自定义参数的NAS文件系统。

  1. 定义一个ContainerNetworkFileSystem资源,实例化一个新的NAS文件系统。

  2. 通过创建静态PV或动态StorageClass,将该文件系统暴露给集群内的应用进行挂载。

kubectl

1. 创建自定义的NAS文件系统

创建一个ContainerNetworkFileSystem对象,声明NAS的详细参数,如存储类型、加密方式、交换机等。
apiVersion: storage.alibabacloud.com/v1beta1
kind: ContainerNetworkFileSystem
metadata:
  name: cnfs-nas-filesystem
spec:
  description: "cnfs"
  type: nas
  reclaimPolicy: Retain
  parameters:
    filesystemType: standard
    storageType: Capacity
    protocolType: NFS
    encryptType: SSE-KMS
    enableTrashCan: "true"
    trashCanReservedDays: "5"
    vSwitchId: vsw-2ze9l3ppwzg6bl02j****

展开查看参数说明

参数

说明

description

当前CNFS的描述。

type

需要创建的存储卷类型,使用nas

reclaimPolicy

回收策略。当前仅支持Retain,删除CNFS时不会删除后端的NAS文件系统,防止数据丢失。

parameters.filesystemType

文件系统类型。默认为通用型NASstandard

parameters.storageType

存储类型。通用型NAS支持性能型Performance、容量型Capacity、高级型Premium

parameters.protocolType

文件传输协议类型。目前仅支持NFS协议。

parameters.encryptType

可选,是否启用加密方式

  • None:不加密。

  • SSE-KMS:启用NAS托管密钥,即使用NAS完全托管的密钥加密每个文件系统,该密钥由NAS在KMS中创建和管理。

parameters.enableTrashCan

是否开启回收站功能,避免误删除文件导致业务受阻或数据丢失。

  • true:开启。

  • false:不开启。

parameters.trashCanReservedDays

表示回收站文件保留的最长时间,默认为7天。示例中trashCanReservedDays: 5表示回收站的文件最长保留5天。

parameters.vSwitchId

创建出的NAS文件系统需要使用的交换机ID。

通用型NAS支持的地域和可用区,请参见地域及可用区

  • 执行kubectl get cnfs查看创建的NAS文件系统。

  • 执行kubectl get cnfs/cnfs-nas-filesystem -o yaml查看NAS文件系统的详细信息。

    YAML解析详见CNFS YAML说明

2. 创建PV或StorageClass

创建CNFS后,选择应用如何接入并使用NAS。

  • 静态PV:手动将一个PV绑定到NAS上的已有目录,适用于需要访问特定存量数据的场景。

  • 动态StorageClass:创建一个StorageClass作为模板,让应用可以按需自动创建全新的独立子目录。

静态数据卷

apiVersion: v1
kind: PersistentVolume
metadata:
  name: cnfs-nas-pv
  labels:
    alicloud-pvname: cnfs-nas-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  csi:
    driver: nasplugin.csi.alibabacloud.com
    # 与PV name保持一致
    volumeHandle: cnfs-nas-pv 
    volumeAttributes:
      # 指定待使用的CNFS
      containerNetworkFileSystem: cnfs-nas-filesystem
      # 挂载存储卷在CNFS中使用的路径
      path: "/"
  mountOptions:
    - nolock,tcp,noresvport
    - vers=3
PV参数详见使用NAS静态存储卷

动态数据卷

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: alibabacloud-nas-cnfs
mountOptions:
  - nolock,tcp,noresvport
  - vers=3
parameters:
  volumeAs: subpath
  # 指定待使用的CNFS
  containerNetworkFileSystem: cnfs-nas-filesystem
  # 挂载存储卷在CNFS中使用的路径
  path: "/"
provisioner: nasplugin.csi.alibabacloud.com
reclaimPolicy: Retain
# 指定为true,允许对存储卷的目录配额进行扩容
allowVolumeExpansion: true
StorageClass参数详见使用NAS动态存储卷

3. 创建PVC

根据此前创建的静态PV和动态StorageClass,创建引用NAS文件系统的PVC。

静态数据卷

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: cnfs-nas-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      # 通过标签精确匹配此前创建的PV
      alicloud-pvname: cnfs-nas-pv   

动态数据卷

apiVersion: v1
kind: PersistentVolumeClaim
metadata: 
  name: cnfs-nas-pvc
spec:
  accessModes:
  - ReadWriteMany 
  storageClassName: alibabacloud-nas-cnfs
  resources: 
    requests:
      storage: 70Gi

4. 创建应用并挂载NAS

PVC创建后,将其绑定的 PV 挂载到应用中。

展开查看示例代码

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cnfs-nas-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
          ports:
            - containerPort: 80
          volumeMounts:
            - name: cnfs-nas-pvc
              mountPath: "/data"
      volumes:
        - name: cnfs-nas-pvc
          persistentVolumeClaim:
            claimName: cnfs-nas-pvc

5. 结果验证

控制台

  1. 创建CNFS

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择存储 > 容器网络文件系统CNFS

  3. 单击创建容器网络文件系统,按照页面提示配置CNFS。

  1. 创建PV或StorageClass

PV

  1. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择存储 > 存储卷

  2. 单击创建,选择存储卷类型为NAS,按照页面提示完成PV的配置。

    主要配置项如下。详细配置项说明,请参见创建PV

    • 总量:PV容量声明。此声明仅为PVC匹配依据,不限制实际可用容量。应用实际可用存储上限为NAS文件系统总容量。

      NAS实际容量上限由其规格决定,请参见通用型NAS
    • 是否使用CNFS:是否启用CNFS。

    • 选择CNFS:开启CNFS功能后,选择此前创建的CNFS。

    • 高级选项(选填)

      • 挂载路径:待挂载的NAS子目录。如果未设置,则默认挂载到根目录。通用型NAS的根目录为/

        如果NAS中没有该目录,系统会自动创建并进行挂载。
      • 回收策略:CNFS仅支持Retain

      • 开启CNFS加速:开启CNFS加速功能,详情请参见通过CNFS使用EFC客户端挂载NAS

StorageClass

  1. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择存储 > 存储类

  2. 存储类页面,单击创建,选择存储卷类型NAS,按照页面提示完成StorageClass的配置。

    主要配置项如下。详见创建StorageClass

    • 选择挂载点:选择通过CNFS创建或纳管的NAS文件系统的挂载点地址。

      关于如何查看挂载点地址,请参见管理挂载点
    • 挂载路径:待挂载的NAS子目录。如果未设置,则默认挂载到根目录。通用型NAS的根目录为/

      如果NAS中没有该目录,系统会自动创建并进行挂载。
    • 回收策略:当前仅支持Retain,删除CNFS时不会删除后端的NAS文件系统,防止数据丢失。

  1. 创建 PVC

  1. 在集群管理页左侧导航栏,选择存储 > 存储声明

  2. 存储声明页面,单击创建,选择存储声明类型为NAS,按照页面提示完成PVC的配置。

    • 分配模式:存储卷使用方式。

    • 已有存储卷类:单击选择存储类,选择此前创建的StorageClass。

    • 总量:所创建存储卷的容量,不超过待挂载的存储卷容量。

    • 访问模式:默认为ReadWriteMany,也可选择ReadWriteOnce或ReadOnlyMany。

  1. 创建应用并挂载NAS

创建Deployment创建StatefulSet时,在容器配置页面的数据卷区域,可以配置PVC挂载到容器。

以下示例表示将通过CNFS创建的NAS文件系统挂载到容器中的/data路径下。

image

方式三:纳管并使用已有的NAS文件系统

通过CNFS纳管一个已存在的NAS文件系统,并将其接入集群供应用进行挂载和使用。

kubectl

1. 使用已有NAS创建CNFS

创建一个ContainerNetworkFileSystem资源,引用NAS挂载点。

apiVersion: storage.alibabacloud.com/v1beta1
kind: ContainerNetworkFileSystem
metadata:
  name: cnfs-nas-filesystem
spec:
  description: "cnfs"
  type: nas
  reclaimPolicy: Retain
  parameters:
    server: 17f7e4****-h****.cn-beijing.nas.aliyuncs.com

展开查看参数说明

参数

说明

description

当前文件系统的简单描述。

type

需要创建的存储类型。

reclaimPolicy

回收策略。当前仅支持Retain,删除CNFS时不会删除后端的NAS文件系统,防止数据丢失。

parameters.server

NAS的挂载点地址。

  • 执行kubectl get cnfs查看创建的NAS文件系统。

  • 执行kubectl get cnfs/cnfs-nas-filesystem -o yaml查看NAS文件系统的详细信息。

    YAML解析详见CNFS YAML说明

2. 创建PV或StorageClass

创建CNFS后,选择应用如何接入并使用NAS。

  • 静态PV:手动将一个PV绑定到NAS上的已有目录,适用于需要访问特定存量数据的场景。

  • 动态StorageClass:创建一个StorageClass作为模板,让应用可以按需自动创建全新的独立子目录。

静态数据卷

apiVersion: v1
kind: PersistentVolume
metadata:
  name: cnfs-nas-pv
  labels:
    alicloud-pvname: cnfs-nas-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  csi:
    driver: nasplugin.csi.alibabacloud.com
    # 与PV name保持一致
    volumeHandle: cnfs-nas-pv 
    volumeAttributes:
      # 指定待使用的CNFS
      containerNetworkFileSystem: cnfs-nas-filesystem
      # 挂载存储卷在CNFS中使用的路径
      path: "/"
  mountOptions:
    - nolock,tcp,noresvport
    - vers=3
PV参数详见使用NAS静态存储卷

动态数据卷

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: alibabacloud-nas-cnfs
mountOptions:
  - nolock,tcp,noresvport
  - vers=3
parameters:
  volumeAs: subpath
  # 指定待使用的CNFS
  containerNetworkFileSystem: cnfs-nas-filesystem
  # 挂载存储卷在CNFS中使用的路径
  path: "/"
provisioner: nasplugin.csi.alibabacloud.com
reclaimPolicy: Retain
# 指定为true,允许对存储卷的目录配额进行扩容
allowVolumeExpansion: true
StorageClass参数详见使用NAS动态存储卷

3. 创建PVC

根据此前创建的静态PV和动态StorageClass,创建引用NAS文件系统的PVC。

静态数据卷

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: cnfs-nas-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      # 通过标签精确匹配此前创建的PV
      alicloud-pvname: cnfs-nas-pv   

动态数据卷

apiVersion: v1
kind: PersistentVolumeClaim
metadata: 
  name: cnfs-nas-pvc
spec:
  accessModes:
  - ReadWriteMany 
  storageClassName: alibabacloud-nas-cnfs
  resources: 
    requests:
      storage: 70Gi

4. 创建应用并挂载NAS

PVC创建后,将其绑定的 PV 挂载到应用中。

展开查看示例代码

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cnfs-nas-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
          ports:
            - containerPort: 80
          volumeMounts:
            - name: cnfs-nas-pvc
              mountPath: "/data"
      volumes:
        - name: cnfs-nas-pvc
          persistentVolumeClaim:
            claimName: cnfs-nas-pvc

5. 结果验证

控制台

  1. 使用已有NAS创建CNFS

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择存储 > 容器网络文件系统CNFS

  3. 单击创建容器网络文件系统,按照页面提示配置CNFS。

  4. 创建容器网络文件系统面板,配置相关参数后,单击确定

    • 选择NAS文件系统。

    • 选择选择已有NAS,在下拉列表中选择已有的NAS挂载点。

    • 按需开启全链路加速,以利用弹性加速特性进行挂载,优化数据访问性能,详情请参见通过CNFS使用EFC客户端挂载NAS

  1. 创建PV或StorageClass

PV

  1. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择存储 > 存储卷

  2. 单击创建,选择存储卷类型为NAS,按照页面提示完成PV的配置。

    主要配置项如下。详细配置项说明,请参见创建PV

    • 总量:PV容量声明。此声明仅为PVC匹配依据,不限制实际可用容量。应用实际可用存储上限为NAS文件系统总容量。

      NAS实际容量上限由其规格决定,请参见通用型NAS
    • 是否使用CNFS:是否启用CNFS。

    • 选择CNFS:开启CNFS功能后,选择此前创建的CNFS。

    • 高级选项(选填)

      • 挂载路径:待挂载的NAS子目录。如果未设置,则默认挂载到根目录。通用型NAS的根目录为/

        如果NAS中没有该目录,系统会自动创建并进行挂载。
      • 回收策略:CNFS仅支持Retain

      • 开启CNFS加速:开启CNFS加速功能,详情请参见通过CNFS使用EFC客户端挂载NAS

StorageClass

  1. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择存储 > 存储类

  2. 存储类页面,单击创建,选择存储卷类型NAS,按照页面提示完成StorageClass的配置。

    主要配置项如下。详见创建StorageClass

    • 选择挂载点:选择通过CNFS创建或纳管的NAS文件系统的挂载点地址。

      关于如何查看挂载点地址,请参见管理挂载点
    • 挂载路径:待挂载的NAS子目录。如果未设置,则默认挂载到根目录。通用型NAS的根目录为/

      如果NAS中没有该目录,系统会自动创建并进行挂载。
    • 回收策略:当前仅支持Retain,删除CNFS时不会删除后端的NAS文件系统,防止数据丢失。

  1. 创建 PVC

  1. 在集群管理页左侧导航栏,选择存储 > 存储声明

  2. 存储声明页面,单击创建,选择存储声明类型为NAS,按照页面提示完成PVC的配置。

    • 分配模式:存储卷使用方式。

    • 已有存储卷类:单击选择存储类,选择此前创建的StorageClass。

    • 总量:所创建存储卷的容量,不超过待挂载的存储卷容量。

    • 访问模式:默认为ReadWriteMany,也可选择ReadWriteOnce或ReadOnlyMany。

  1. 创建应用并挂载NAS

创建Deployment创建StatefulSet时,在容器配置页面的数据卷区域,可以配置PVC挂载到容器。

以下示例表示将通过CNFS创建的NAS文件系统挂载到容器中的/data路径下。

image

应用场景配置:共享与隔离

完成NAS文件系统的创建或纳管后,可根据业务需求,通过不同的配置方式实现数据的共享或隔离。

配置NAS共享存储卷(多个Pod共享同一数据目录)

为解决Pod间的数据共享问题,可将NAS文件系统中的同一个目录作为共享存储,挂载给多个Pod使用。

  • 核心机制:通过静态存储卷方式实现。在PV中,声明的path与CSI最终挂载的路径完全一致。因此,当多个Pod通过同一个PVC挂载该静态PV时,均可访问同一个存储目录,从而实现数据共享。

  • 关键配置:在工作负载的Pod模板(.spec.template)中,将 volumes 字段下的 persistentVolumeClaim.claimName 参数统一设置为同一个PVC名称。

1. 创建指向特定目录的PV和PVC

展开查看示例代码

apiVersion: v1
kind: PersistentVolume
metadata:
  name: cnfs-nas-static-pv
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 50Gi
  csi:
    driver: nasplugin.csi.alibabacloud.com
    fsType: nfs
    volumeAttributes:
      # 指定 CNFS
      containerNetworkFileSystem: cnfs-nas-filesystem
      mountProtocol: nfs
      path: /
      volumeAs: subpath
      volumeCapacity: "true"
    volumeHandle: cnfs-nas-static-pv
  mountOptions:
  - nolock,tcp,noresvport
  - vers=3
  persistentVolumeReclaimPolicy: Retain
  storageClassName: cnfs-nas-sc
  volumeMode: Filesystem
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: cnfs-nas-static-pvc
  namespace: default
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 50Gi
  storageClassName: cnfs-nas-sc
  volumeMode: Filesystem
  # 引用 PV
  volumeName: cnfs-nas-static-pv
status:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 50Gi

2. 创建示例Deployment

展开查看示例代码

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cnfs-nas-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  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:
        - mountPath: "/data"
          # 引用下面volumes中定义的卷
          name: cnfs-nas-pvc
      volumes:
      # 定义一个名为 cnfs-nas-pvc 的卷
      - name: cnfs-nas-pvc
        # 所有Pod副本都通过该配置引用同一个PVC,实现共享存储
        persistentVolumeClaim:
          claimName: cnfs-nas-static-pvc

3. 结果验证

  1. 查看挂载情况

    查看Pod的挂载情况。

    kubectl exec cnfs-nas-deployment-*****a -- mount | grep nfs

    预期输出包含挂载点,表明挂载成功。

    66bd9493d6-*****.cn-zhangjiakou.nas.aliyuncs.com:/ on /data type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,nolock,noresvport,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=10.XX.XX.199,mountvers=3,mountport=2049,mountproto=tcp,local_lock=all,addr=10.XX.XX.199)
  2. 验证Deployment的共享存储和持久化存储

配置NAS隔离存储卷(每个Pod拥有独立数据目录)

为满足多租户等场景的数据隔离需求,可为每个Pod或每组Pod提供独立的、相互隔离的存储目录。

  • 核心机制:通过动态存储卷方式实现。在StorageClass中,CSI会在声明的path路径下,自动创建一个与PV同名的独立子目录作为挂载点。因此,每个PVC都会绑定到一个独立的存储目录,从而实现数据隔离。

  • 关键配置:

    • 在StatefulSet关联的StorageClass中,通过parametersvolumeAs: subpath(默认值)为每个PVC创建独立的子目录。

    • 在StatefulSet中定义volumeClaimTemplates,为每个Pod自动创建并绑定一个独立的PVC。

1. 创建支持动态子目录的StorageClass

展开查看示例代码

PV对象中引用指定CNFS,并通过volumeAs: subpath让CSI为每个PVC请求动态创建一个隔离的子目录。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: cnfs-nas-sc
mountOptions:
  - nolock,tcp,noresvport
  - vers=3
parameters:
  # 实现隔离存储卷的核心参数
  volumeAs: subpath
  # 引用已创建的CNFS
  containerNetworkFileSystem: cnfs-nas-filesystem
  # 指定在NAS上创建子目录的根路径
  # CSI会在此路径下创建子目录,目录名与自动生成的PV名称相同
  path: "/"
  archiveOnDelete: "false"
provisioner: nasplugin.csi.alibabacloud.com
# 删除PVC时,自动删除对应的NAS子目录
reclaimPolicy: Delete
allowVolumeExpansion: true

2. 创建示例StatefulSet

展开查看示例代码

基于StorageClass定义的模板,为每个Pod动态创建并挂载一个隔离的存储卷。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: cnfs-nas-sts
  labels:
    app: nginx
spec:
  serviceName: "nginx"
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
        command: ["/bin/sh"]
        args: ["-c", "sleep 3600;"]
        volumeMounts:
        - mountPath: "/data"
          name: pvc
  # volumeClaimTemplates会为每个Pod基于下述模板自动创建一个PVC
  volumeClaimTemplates:
  - metadata:
      name: pvc
    spec:
      accessModes: [ "ReadWriteOnce" ]
      # 引用此前创建的StorageClass
      storageClassName: "cnfs-nas-sc" 
      resources:
        requests:
          # 仅用于调度决策,不代表真实配额限制,实际可用容量为NAS总容量
          storage: 50Gi  

3. 结果验证

  1. 查看挂载情况

    查看Pod(如cnfs-nas-sts-0)的挂载信息。

    kubectl exec cnfs-nas-sts-0 -- mount |grep nfs

    预期输出表明,NAS的某个子目录已成功挂载到Pod的/data路径。

    66bd9493d6-*****.cn-zhangjiakou.nas.aliyuncs.com:/nas-e7242ba0-47ec-4410-9107-b0e247a***** on /data type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,nolock,noresvport,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=10.XX.XX.199,mountvers=3,mountport=2049,mountproto=tcp,local_lock=all,addr=10.XX.XX.199)
  2. 验证StatefulSet的数据隔离和持久化存储

生产环境使用建议

  • 数据安全

    • 数据加密:创建新NAS文件系统时,建议在CNFS的parameters中设置encryptType: SSE-KMS,以启用NAS服务端的静态数据加密,提升数据安全性。

    • 数据保护与回收策略:CNFS的reclaimPolicy固定为Retain,删除Kubernetes中的CNFS对象不会删除后端的NAS实例。但PV的回收策略由其StorageClass定义,生产环境建议设置为Retain,避免误删。

    • 回收站功能:创建NAS时,建议通过enableTrashCan: "true"参数开启回收站功能,避免误删。

    • 并发写入:当多个Pod挂载同一个共享存储卷时,应在应用层面避免多个实例同时写入同一个文件,以免因并发写入导致文件损坏。

  • 运维管理

    • 性能隔离:隔离存储卷仅实现数据层面隔离,所有隔离卷共享后端同一个NAS实例的IOPS和吞吐量。对于IO性能要求严苛且需要稳定延迟的核心应用,建议为其规划独立的专用NAS文件系统。

    • 容量管理:在StorageClass中设置allowVolumeExpansion: true,以便对存储卷的目录配额进行扩容。

      PVC中requests.storage取值主要用于调度决策,并非整个NAS文件系统的配额上限。
    • 监控与告警:利用容器存储监控对NAS的容量使用率、IOPS、吞吐量等关键指标配置告警,及时发现容量或性能瓶颈。

  • 成本优化

    • 按需选择存储类型:根据业务对成本和性能的敏感度,参见选型指导合理选择NAS类型。例如,容量型NAS价格较低,适合对时延响应要求不高的文件共享或归档业务。

    • 及时释放资源:应用下线后,务必及时清理不再使用的资源,并确认是否需要删除后端的NAS文件系统,以免产生预期外费用。

参考信息

验证共享存储、数据隔离、持久化存储

NAS挂载完成后,可进一步验证存储行为是否符合预期。

  • 验证Deployment的共享存储和持久化存储

    展开查看具体步骤

    共享存储

    持久化存储

    在一个Pod中创建文件,然后在另一个Pod中查看文件,验证数据的共享存储。

    1. 查看Pod信息,获取Pod名称。

      kubectl get pod | grep cnfs-nas-deployment

      预期输出:

      cnfs-nas-deployment-*****a 1/1 Running 0 40s
      cnfs-nas-deployment-*****b 1/1 Running 0 40s
    2. 在一个Pod中创建文件。 以名为cnfs-nas-deployment-*****a的Pod作为示例:

      kubectl exec cnfs-nas-deployment-*****a -- touch /data/test.txt
    3. 在另一个Pod中查看文件是否存在。 以名为cnfs-nas-deployment-*****b的Pod为例。

      kubectl exec cnfs-nas-deployment-*****b -- ls /data

      预期输出:

      test.txt

      可以查看到此前新建的文件,表明数据可在多Pod间共享。

      重要

      多个Pod写入共享存储时,CNFS无法保证数据一致性,请避免对同一文件进行并发写入,以防文件损坏。

    重建Deployment,在新建Pod中查看文件系统中的数据是否存在,验证数据的持久化存储。

    1. 删除应用Pod以触发重建。

      kubectl rollout restart deploy cnfs-nas-deployment
    2. 查看Pod,等待新Pod启动并进入Running状态。

      kubectl get pod | grep cnfs-nas-deployment

      预期输出:

      cnfs-nas-deployment-*****c 1/1 Running 0 67s
      cnfs-nas-deployment-*****d 1/1 Running 0 49s
    3. 在新Pod中查看此前创建的文件是否存在。 以名为cnfs-nas-deployment-*****c的Pod为例。

      kubectl exec cnfs-nas-deployment-*****c -- ls /data

      预期输出:

      test.txt

      可以查看到此前写入的文件,表明数据可持久化存储。

  • 验证StatefulSet的数据隔离和持久化存储

    展开查看具体步骤

    StatefulSet的每个Pod有独立的PVC,数据保持隔离。

    数据隔离

    持久化存储

    在一个Pod中创建文件,然后在另一个Pod中确认该文件不存在,验证各Pod间存储卷的数据隔离性。

    1. 查看Pod信息,获取Pod名称。

      kubectl get pod | grep cnfs-nas-sts

      预期输出:

      cnfs-nas-sts-0 1/1 Running 0 5m
      cnfs-nas-sts-1 1/1 Running 0 5m
    2. 在一个Pod中创建文件。 以名为cnfs-nas-sts-0的Pod作为示例,创建一个可识别的文件:

      kubectl exec cnfs-nas-sts-0 -- touch /data/sts-0-data.txt
    3. 在另一个Pod中查看该文件是否存在。 以名为cnfs-nas-sts-1的Pod为例。

      kubectl exec cnfs-nas-sts-1 -- ls /data

      预期输出中,未查看到cnfs-nas-sts-0中创建的文件,表明每个StatefulSet Pod使用独立的存储卷,数据是相互隔离的。

    删除指定Pod并等待其重建,在新Pod中查看数据是否存在。

    1. 删除指定Pod以触发重建。 以cnfs-nas-sts-0为例:

      kubectl delete pod cnfs-nas-sts-0
    2. 查看Pod,等待同名Pod启动并进入Running状态。StatefulSet会重新创建一个具有相同名称和身份的Pod。

      kubectl get pod | grep cnfs-nas-sts

      预期输出:

      cnfs-nas-sts-0                        1/1     Running   0          19s
      cnfs-nas-sts-1                        1/1     Running   0          102s
    3. 在新Pod中查看此前创建的文件是否存在。

      kubectl exec cnfs-nas-sts-0 -- ls /data

      预期输出中可查看此前写入的文件,持久化存储成功。

      sts-0-data.txt

CNFS YAML说明

执行kubectl get cnfs/<cnfsName> -o yaml查看CNFS YAML时,可查看CNFS对象的全部配置和实时状态。

此处以方式二中执行kubectl get cnfs/cnfs-nas-filesystem -o yaml查看cnfs-nas-filesystem YAML为例。

YAML示例

展开查看

apiVersion: storage.alibabacloud.com/v1beta1
kind: ContainerNetworkFileSystem
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"storage.alibabacloud.com/v1beta1","kind":"ContainerNetworkFileSystem","metadata":{"annotations":{},"name":"cnfs-nas-filesystem"},"spec":{"description":"cnfs","parameters":{"encryptType":"SSE-KMS","enableTrashCan":"true","filesystemType":"standard","protocolType":"NFS","storageType":"Capacity","trashCanReservedDays":"5","vSwitchId":"vsw-2ze9l3ppwzg6bl02j****"},"reclaimPolicy":"Retain","type":"nas"}}
  creationTimestamp: "20**-05-14T08:20:09Z"
  finalizers:
  - protection.alibabacloud.com/cnfs
  generation: 6
  name: cnfs-nas-filesystem
  resourceVersion: "122342382"
  uid: a9e9650c-68b2-405b-8274-0f5b6063****
spec:
  description: "cnfs"
  reclaimPolicy: Retain
  type: nas
  parameters:
    encryptType: SSE-KMS
    enableTrashCan: "true"
    filesystemType: standard
    protocolType: NFS
    storageType: Capacity
    trashCanReservedDays: "5"
    vSwitchId: vsw-2ze9l3ppwzg6bl02j****
status:
  conditions:
  - lastProbeTime: "20**-05-14 16:20:15"
    reason: The nas filesystem and mount target complete initialization.
    status: Ready
  fsAttributes:
    accessGroupName: DEFAULT_VPC_GROUP_NAME
    encryptType: SSE-KMS
    enableTrashCan: "true"
    filesystemId: 17f7e*****
    filesystemType: standard
    protocolType: NFS
    regionId: cn-beijing
    server: 17f7e48ece-h****.cn-beijing.nas.aliyuncs.com
    storageType: Capacity
    vSwitchId: vsw-2ze9l3ppwzg6bl02j****
    vpcId: vpc-2ze9sgmehjvwv5x74****
    zoneId: cn-beijing-h
  status: Available

参数说明

展开查看

参数

说明

status

CNFS的当前状态,包括Pending(等待)、Creating(创建中)、Initialization(创建文件系统中)、Available(可用)、Unavailable(暂时不可用,可以恢复为可用状态)、Fatal(不可用,无法恢复)、Terminating(删除中)。

conditions.lastProbeTime

最后探活的时间。

conditions.reason

处于当前状态的原因。

conditions.status

当前状态是否可用,可用为Ready,不可用为NotReady

fsAttributes.accessGroupName

挂载点所应用的权限组名称,目前仅支持DEFAULT_VPC_GROUP_NAME(专有网络默认权限组)。

fsAttributes.encryptType

可选,是否启用加密方式

  • None:不加密。

  • SSE-KMS:启用NAS托管密钥,即使用NAS完全托管的密钥加密每个文件系统,该密钥由NAS在KMS中创建和管理。

fsAttributes.enableTrashCan

是否开启回收站功能,避免误删除文件导致业务受阻或数据丢失。

  • true:开启。

  • false:不开启。

fsAttributes.filesystemId

文件系统ID。

fsAttributes.filesystemType

文件系统类型。默认为通用型NASstandard

fsAttributes.protocolType

文件传输协议类型。目前仅支持NFS协议

fsAttributes.regionId

CNFS所在的地域。

fsAttributes.server

NAS的挂载点地址。

fsAttributes.storageType

存储类型。通用型NAS支持性能型Performance、容量型Capacity、高级型Premium

fsAttributes.vSwitchId

CNFS使用的vSwitch。

fsAttributes.vpcId

CNFS所在的VPC。

fsAttributes.zoneId

CNFS所在的可用区。

资源释放指引

为避免产生预期外费用并确保数据安全,请遵循以下流程释放无需使用的资源。

  1. 删除工作负载

    • 操作:删除所有使用相关PVC的应用,如Deployment、StatefulSet等,停止Pod并卸载存储卷。

    • 命令示例:kubectl delete deployment <your-deployment-name>

  2. 删除PVC

    • 操作:删除应用关联的PVC,PV删除结果取决于回收策略(reclaimPolicy)。

      • Retain(推荐):删除PVC后,后端NAS上的数据和目录会完整保留。

      • Delete:删除PVC后,其绑定的PV也会被删除。后端NAS上的数据和目录将根据StorageClassarchiveOnDelete参数的设置进行处理。

        • "true"(默认):不会真正删除目录或文件,而是将其重命名,格式为archived-{pvName}.{timestamp}

        • "false" :数据被永久删除,此操作不可逆,请谨慎使用。

    • 命令示例:kubectl delete pvc <your-pvc-name>

  3. 删除PV

    • 操作:删除PV。主要针对静态PV,或在上一步中使用Retain策略后处于Released状态的PV。

      此操作仅移除Kubernetes中的资源定义,不删除后端NAS数据。
    • 命令示例:kubectl delete pv <your-pv-name>

  4. 删除Kubernetes存储定义(可选)

    • 操作:删除不再需要的StorageClass和CNFS对象。

      此操作仅移除Kubernetes中的资源定义,不删除后端NAS数据。
    • 命令示例:kubectl delete sc <your-storageclass-name>kubectl delete cnfs <your-cnfs-name>

  5. 删除后端NAS文件系统

    • 操作:请参见删除文件系统。此操作将永久删除该NAS上的所有数据,且无法恢复,请谨慎操作。执行前,请务必确认该NAS已无任何业务依赖。