使用NAS动态存储卷

更新时间:
复制为 MD 格式

基于NAS动态存储卷,系统可以为工作负载按需自动创建和分配存储空间,无需预先创建PV。这不仅能满足数据持久化和共享(多Pod同时读写)的需求,还可以简化Web应用、日志保存等场景下的存储管理。

工作原理

使用动态存储卷时,应用在创建PVC时,系统会根据PVC指定的StorageClass,按需自动创建一个全新的存储卷及与之对应的PV。此模式更为灵活,且支持存储卷的自动扩容。

挂载模式

可通过StorageClass中的volumeAs参数指定挂载模式,定义PVNAS文件系统的对应关系。

挂载方式

说明

使用场景

subpath

子目录模式。一个PV对应一个NAS文件系统的独立子目录,便于数据隔离。

  • 多个Pod挂载同一NAS文件系统的某个子目录。

  • 多个Pod挂载同一NAS文件系统的不同子目录,实现隔离。

sharepath

共享目录模式。所有PV均对应StorageClass中定义的同一个NAS目录,所有使用此StorageClassPVC都指向NAS上同一个共享目录。

多个跨命名空间的Pod需要挂载同一个NAS子目录。

filesystem(不推荐)

文件系统模式。一个PV对应一个动态新建的、独立的NAS文件系统实例。

对性能、安全等有严格隔离要求,需要为应用动态创建和删除独立的NAS文件系统和挂载点。成本较高。

通用流程

挂载NAS动态存储卷的主要流程如下。

image
  1. 创建StorageClass:定义存储模板,声明NAS挂载点,根据业务需求选择挂载模式(subpath、sharepath等)。

  2. 创建PVC:应用通过PVC来“申请”使用存储资源。系统会根据PVC指定的StorageClass自动创建PV并与之绑定。

  3. 在应用中挂载:将已绑定的PVC挂载到应用Pod中,作为容器内的一个持久化目录。

准备工作

  • 已安装csi-plugin组件和csi-provisioner组件。

    CSI组件默认安装,请确保未手动卸载。可在组件管理页面查看安装情况。建议升级CSI组件至最新版本。
  • 使用subpathsharepath时,需已创建NAS文件系统,且满足以下条件。否则请重新创建文件系统

    NAS在挂载连通性、文件系统数量、协议类型等方面存在使用限制
    • 协议类型:仅支持NFS。

    • 专有网络VPC:NAS文件系统需与集群VPC保持一致。NAS支持跨可用区挂载,不支持跨VPC挂载。

    • 挂载点:添加与集群处于同一VPC内且状态可用的挂载点,具体操作请参见管理挂载点。请记录挂载点地址。

    • (可选)加密类型:如需加密存储卷数据,请在创建NAS文件系统时配置加密类型。

注意事项

  • 禁止删除挂载点:存储卷使用期间,请勿在NAS控制台删除其对应的挂载点,以免导致节点I/O异常。

  • 并发写入:NAS为共享存储。当多个Pod同时挂载一个存储卷时,应用自身需要处理并发写入可能带来的数据一致性问题。

    关于NAS并发写入的一些限制条件,请参见如何避免多进程或多客户端并发写同一日志文件可能出现的异常?读写访问文件类问题
  • 挂载性能:若在应用中配置了securityContext.fsgroup,kubelet会在挂载后递归执行chmodchown操作,可能导致Pod启动时间显著延长。

    如需优化,请参见NAS存储卷FAQ

方式一:使用subpath方式挂载

此方式下,每个PVC会自动在NAS文件系统下创建一个独立的子目录,作为其PV。

1. 创建StorageClass

StorageClass作为动态卷的供应模板,定义了存储资源的来源和行为。

kubectl

  1. 参见以下内容创建alicloud-nas-subpath.yaml

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      # StorageClass名称,需在集群内唯一
      name: alicloud-nas-subpath  
    mountOptions:
    - nolock,tcp,noresvport
    - vers=3
    parameters:
      # 设置为 subpath
      volumeAs: subpath
      # server 字段格式为 <nas-server-address>:/<path>
      server: "0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/k8s"
      archiveOnDelete: "true"
    provisioner: nasplugin.csi.alibabacloud.com
    reclaimPolicy: Retain
    allowVolumeExpansion: true

    参数

    描述

    mountOptions

    NAS的挂载参数,包括NFS协议版本等。默认使用v3协议挂载,可通过vers=4.0方式指定协议版本。关于不同NAS类型支持的NFS协议,请参见NFS协议

    parameters.volumeAs

    挂载模式,设置为subpath

    parameters.server

    NAS挂载点地址及待挂载的子目录路径,格式为<nas-server-address>:/<path>

    • <nas-server-address>:NAS文件系统的挂载点地址。可参见管理挂载点查看。

    • :/<path>:待挂载的NAS子目录。如未设置或指定的子目录不存在,则默认挂载到根目录。

      • 通用型NAS:根目录为/

      • 极速型NAS:根目录为/share。挂载子目录时,path需以/share开头(如/share/data)。

    parameters.archiveOnDelete

    删除PVC时,若reclaimPolicyDelete,后端存储的文件数据是否被真正删除。

    NAS为共享存储,提供此选项进行双重确认。
    • true(默认):不会真正删除目录或文件,而是将其归档并重命名,格式为archived-{pvName}.{timestamp}

    • false:后端对应的目录及数据会被真正删除。

      此处删除的是NASsubpath目录以及其中文件,NAS文件系统本身不会被删除。

      如需删除NAS文件系统,请参见删除文件系统

    在高频创建和删除PV的场景下,设置为 false 可能导致CSI控制器任务队列阻塞,新PV无法被创建,请参见使用NAS动态存储卷时Controller的任务队列已满且无法创建新的PV

    provisioner

    驱动类型。使用阿里云NAS CSI组件时固定为nasplugin.csi.alibabacloud.com

    reclaimPolicy

    PV的回收策略。

    • Delete(默认):删除PVC时,根据archiveOnDelete的配置处理后端存储数据。

    • Retain:删除PVC时,PVNAS文件不会被删除,需手动删除。适用于对数据安全性要求高的场景,以免误删数据。

    allowVolumeExpansion

    仅通用型NAS支持

    允许通过修改 PVC 容量来动态扩容由该 StorageClass 创建的 PV。

    该 StorageClass 将基于 NAS 的目录配额功能来管理PV容量,从而精确地管理和限制其容量。支持通过编辑 PVC 的 spec.resources.requests.storage 字段来实现在线扩容,请参见NAS动态存储卷设置目录配额

    NAS 目录配额的生效是一个异步过程。PV 刚刚创建或扩容完成后,如果立即进行高速、大批量的数据写入,存在因配额尚未完全生效而超出规定容量的可能。请参见使用限制了解更多使用限制。
  2. 创建StorageClass。

    kubectl create -f alicloud-nas-subpath.yaml

控制台

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

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

  3. 单击创建,配置StorageClass名称(集群内保持唯一)并选择存储卷类型NAS,按照页面提示完成StorageClass的创建。

    主要配置项如下。

    配置项

    说明

    选择挂载点

    NAS文件系统的挂载点地址。

    存储卷模式

    存储卷访问模式。本示例为子目录,即subpath,将在挂载路径下自动创建子目录。数据将存储于<NAS挂载点>:<挂载路径>/<pv-name>/下。

    挂载路径

    待挂载的NAS子目录。如果未设置,则默认挂载到根目录。

    如果NAS中没有该目录,系统会自动创建并进行挂载。
    • 通用型NAS:根目录为/

    • 极速型NAS:根目录为/share。挂载子目录时,path需以/share开头(如/share/data)。

    回收策略

    PV的回收策略。

    • Delete(默认):删除PVC时,根据archiveOnDelete的配置处理后端存储数据。

    • Retain:删除PVC时,PVNAS文件不会被删除,需手动删除。适用于对数据安全性要求高的场景,以免误删数据。

    挂载选项

    NAS的挂载参数,包括NFS协议版本等。默认使用v3协议挂载,可通过vers=4.0方式指定协议版本。关于不同NAS类型支持的NFS协议,请参见NFS协议

    创建后,可在存储类列表查看创建的StorageClass。

2. 创建PVC

PVC 作为应用的存储请求,将触发 StorageClass 的动态供应机制,自动创建并绑定一个匹配的 PV。

kubectl

  1. 参见以下内容创建nas-pvc.yaml

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata: 
      name: nas-csi-pvc
    spec:
      accessModes:
      - ReadWriteMany 
      # 指定待绑定的 StorageClass
      storageClassName: alicloud-nas-subpath  
      resources: 
        requests:
          # 声明所需使用的存储卷的容量
          storage: 20Gi  

    参数

    说明

    accessModes

    访问模式。可取值:

    • ReadWriteMany(默认):多节点读写。

    • ReadWriteOnce:单节点读写。

    • ReadOnlyMany:多节点只读。

    storageClassName

    待绑定的StorageClass。

    storage

    声明所需使用的存储卷的容量。默认情况下,此声明主要作为资源请求,并不限制Pod实际可用的存储空间。

    NAS容量上限由规格决定,请参见通用型NAS极速型NAS确认。

    但当StorageClassallowVolumeExpansiontrue时,此值将变为一个严格执行的硬性限制。CSI 将按照该配置设置NAS的目录配额,限制PV的可用容量。

  2. 创建PVC。

    kubectl create -f nas-pvc.yaml
  3. 查看PV。

    kubectl get pv

    预期输出如下,表明已基于StorageClass自动创建了PV,并绑定到PVC。

    NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS             VOLUMEATTRIBUTESCLASS   REASON   AGE
    nas-a7540d97-0f53-4e05-b7d9-557309******   20Gi       RWX            Retain           Bound    default/nas-csi-pvc   alicloud-nas-subpath     <unset>                          5m

控制台

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

  2. 存储声明页面,单击创建,配置PVC后,单击创建

    配置项

    说明

    存储声明类型

    选择NAS。

    名称

    PVC名称,在命名空间内保持唯一。

    分配模式

    选择使用存储类动态创建

    已有存储类

    单击选择存储类,选择此前创建的StorageClass。

    总量

    声明所需使用的存储卷的容量。默认情况下,此声明主要作为资源请求,并不限制Pod实际可用的存储空间。

    NAS容量上限由规格决定,请参见通用型NAS极速型NAS确认。

    但当StorageClassallowVolumeExpansiontrue时,此值将变为一个严格执行的硬性限制。CSI 将按照该配置设置NAS的目录配额,限制PV的可用容量。

    访问模式

    访问模式。可取值:

    • ReadWriteMany(默认):多节点读写。

    • ReadWriteOnce:单节点读写。

    • ReadOnlyMany:多节点只读。

3. 创建应用并挂载NAS

PVC创建后,可将其绑定的 PV 挂载到应用中。本小节将创建两个Deployment,引用同一个PVC,实现多个 Pod 共享同一NAS子目录。

kubectl

创建2Deployment并挂载同一PVC,使其共享同一个NAS文件系统的同一个子目录。

如需为多个Pod挂载同一NAS文件系统的不同子目录,请按照子目录创建不同的StorageClass和对应的PVC,再分别挂载PVC。
  1. 参见以下内容,分别创建nginx-1.yamlnginx-2.yaml

    两个应用的配置基本一致,两者引用同一PVC。
    • nginx-1.yaml

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nas-test-1     
        labels:
          app: nginx
      spec:
        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: nas-pvc
                  # NAS在容器中的挂载路径
                  mountPath: "/data"          
            volumes:
              - name: nas-pvc                 
                persistentVolumeClaim:
                  # 绑定此前创建的 PVC
                  claimName: nas-csi-pvc      
    • nginx-2.yaml

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nas-test-2     
        labels:
          app: nginx
      spec:
        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: nas-pvc
                  # NAS在容器中的挂载路径
                  mountPath: "/data"           
            volumes:
              - name: nas-pvc                 
                persistentVolumeClaim:
                  # 绑定此前创建的 PVC
                  claimName: nas-csi-pvc       
  2. 创建2Deployment。

    kubectl create -f nginx-1.yaml -f nginx-2.yaml
  3. 查看Pod状态。

    kubectl get pod -l app=nginx

    预期输出

    NAME                         READY   STATUS    RESTARTS   AGE
    nas-test-1-b75d5b6bc-*****   1/1     Running   0          51s
    nas-test-2-b75d5b6bc-*****   1/1     Running   0          44s
  4. 查看两个 Pod 详细配置,确认挂载的PVC。

    <podName>替换为两个Pod的实际名称。
    kubectl describe pod <podName> | grep "ClaimName:"

    预期输出中,两个Pod挂载的PVC一致,共享NAS文件系统的同一子目录。

控制台

重复以下操作,分别创建2Deployment并挂载同一PVC,使其共享同一个NAS文件系统的同一个子目录。

  1. ACK集群列表页面,单击目标集群名称,在集群详情页左侧导航栏,选择工作负载 > 无状态

  2. 单击使用镜像创建,按照页面提示完成应用的配置和创建。

    主要参数如下,其他参数保持默认即可。详见创建无状态工作负载Deployment

    配置项

    参数

    说明

    应用基本信息

    副本数量

    Deployment的副本数量。

    容器配置

    镜像名称

    用于部署应用的镜像地址。

    所需资源

    所需的vCPU和内存资源。

    数据卷

    单击增加云存储声明,然后完成参数配置。

    • 挂载源:选择之前创建的PVC。

    • 容器路径:输入NAS文件系统要挂载到的容器路径。

    部署完成后,可在无状态页面单击应用名称,在容器组页签下确认Pod已正常运行(状态为Running)。

后续结果验证可参见验证共享存储和持久化存储

方式二:使用sharepath方式挂载

此方式下,所有基于此StorageClass创建的PVC,创建PV时不会创建实际的目录,而会直接使用StorageClass中设置的路径,即每个PV实际上会对应同一个NAS目录。

1. 创建StorageClass

StorageClass作为动态卷的供应模板,定义了存储资源的来源和行为。

kubectl

  1. 参见以下内容创建alicloud-nas-sharepath.yaml。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alicloud-nas-sharepath
    mountOptions:
    - nolock,tcp,noresvport
    - vers=3
    parameters:
      volumeAs: sharepath
      # server 字段格式为 <nas-server-address>:/<path>
      server: "0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/k8s"
    provisioner: nasplugin.csi.alibabacloud.com
    reclaimPolicy: Retain

    参数

    描述

    mountOptions

    NAS的挂载参数,包括NFS协议版本等。默认使用v3协议挂载,可通过vers=4.0方式指定协议版本。关于不同NAS类型支持的NFS协议,请参见NFS协议

    parameters.volumeAs

    挂载方式,设置为sharepath

    parameters.server

    NAS挂载点地址及待挂载的子目录路径,格式为<nas-server-address>:/<path>

    • <nas-server-address>:NAS文件系统的挂载点地址。可参见管理挂载点查看。

    • :/<path>:待挂载的NAS子目录。如未设置或指定的子目录不存在,则默认挂载到根目录。

      • 通用型NAS:根目录为/

      • 极速型NAS:根目录为/share。挂载子目录时,path需以/share开头(如/share/data)。

    provisioner

    驱动类型。使用阿里云NAS CSI组件时固定为nasplugin.csi.alibabacloud.com

    reclaimPolicy

    PV的回收策略。使用sharepath时必须设置为 Retain

  2. 创建StorageClass。

    kubectl create -f alicloud-nas-sharepath.yaml

控制台

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

  2. 单击创建,配置StorageClass名称(集群内保持唯一)并选择存储卷类型NAS,按照页面提示完成StorageClass的创建。

    配置项

    说明

    选择挂载点

    NAS文件系统的挂载点地址。

    存储卷模式

    存储卷访问模式。本示例为共享目录,即sharepath。

    挂载路径

    待挂载的NAS子目录。如果未设置,则默认挂载到根目录。

    如果NAS中没有该目录,系统会自动创建并进行挂载。
    • 通用型NAS:根目录为/

    • 极速型NAS:根目录为/share。挂载子目录时,path需以/share开头(如/share/data)。

    回收策略

    使用sharepath时必须设置为 Retain

    挂载选项

    NAS的挂载参数,包括NFS协议版本等。默认使用v3协议挂载,可通过vers=4.0方式指定协议版本。关于不同NAS类型支持的NFS协议,请参见NFS协议

2. 创建PVC

PVC 作为应用的存储请求,将触发 StorageClass 的动态供应机制,自动创建并绑定一个匹配的 PV。

为了实现跨命名空间的数据共享,本小节将在两个命名空间下创建一个同名PVC。PVC 名称相同,但位于不同命名空间,因此是独立的资源。它们将通过同一StorageClass,在同一 NAS 文件系统上分别获得独立 PV。

kubectl

  1. 创建命名空间ns1ns2。

    kubectl create ns ns1
    kubectl create ns ns2
  2. 参见以下内容创建pvc.yaml,分别在 ns1 和 ns2 命名空间下创建同名 PVC。

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata: 
      name: nas-csi-pvc
      namespace: ns1
    spec:
      accessModes:
      - ReadWriteMany 
      storageClassName: alicloud-nas-sharepath
      resources: 
        requests:
          storage: 20Gi
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata: 
      name: nas-csi-pvc
      namespace: ns2
    spec:
      accessModes:
      - ReadWriteMany 
      storageClassName: alicloud-nas-sharepath
      resources: 
        requests:
          storage: 20Gi

    参数

    说明

    accessModes

    访问模式。可取值:

    • ReadWriteMany(默认):多节点读写。

    • ReadWriteOnce:单节点读写。

    • ReadOnlyMany:多节点只读。

    storageClassName

    待绑定的StorageClass。

    storage

    声明所需使用的存储卷的容量。默认情况下,此声明主要作为资源请求,并不限制Pod实际可用的存储空间。

    NAS容量上限由规格决定,请参见通用型NAS极速型NAS确认。

    但当StorageClassallowVolumeExpansiontrue时,此值将变为一个严格执行的硬性限制。CSI 将按照该配置设置NAS的目录配额,限制PV的可用容量。

  3. 创建PVC。

    kubectl create -f pvc.yaml
  4. 查看PV状态,确认已为 PVC 自动创建并绑定了对应的 PV。

    kubectl get pv

    预期输出如下,两个状态 PV 均为 Bound , CLAIM 显示每个 PV 分别绑定到两个命名空间下的 PVC(ns1/nas-csi-pvc 和 ns2/nas-csi-pvc)。

    NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS             VOLUMEATTRIBUTESCLASS   REASON   AGE
    nas-0b448885-6226-4d22-8a5b-d0768c******   20Gi       RWX            Retain           Bound    ns1/nas-csi-pvc       alicloud-nas-sharepath   <unset>                          74s
    nas-bcd21c93-8219-4a11-986b-fd934a******   20Gi       RWX            Retain           Bound    ns2/nas-csi-pvc       alicloud-nas-sharepath   <unset>                          74s

控制台

  1. 创建命名空间。

    • 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择命名空间与配额

    • 单击创建,安装页面提示创建命名空间ns1ns2。

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

  3. 在命名空间ns1下,创建一个存储声明。

    存储声明页面,选择命名空间ns1,按照页面提示完成PVC的创建。

    配置项

    说明

    存储声明类型

    选择NAS。

    名称

    PVC名称,在命名空间内保持唯一。

    分配模式

    选择使用存储类动态创建

    已有存储类

    单击选择存储类,选择此前创建的StorageClass。

    总量

    声明所需使用的存储卷的容量。默认情况下,此声明主要作为资源请求,并不限制Pod实际可用的存储空间。

    NAS容量上限由规格决定,请参见通用型NAS极速型NAS确认。

    但当StorageClassallowVolumeExpansiontrue时,此值将变为一个严格执行的硬性限制。CSI 将按照该配置设置NAS的目录配额,限制PV的可用容量。

    访问模式

    访问模式。可取值:

    • ReadWriteMany(默认):多节点读写。

    • ReadWriteOnce:单节点读写。

    • ReadOnlyMany:多节点只读。

  4. 参见上一步,在命名空间ns2下,再次创建一个PVC。

    创建后,返回存储声明页面,在命名空间ns1ns2下,确认2PVC均已绑定自动创建的PV。

3. 创建应用并挂载NAS

PVC创建后,可将其绑定的 PV 挂载到应用中。本小节在2Namespace下分别创建应用,并挂载相应的PVC,从而让它们共享StorageClass中定义的NAS子目录。

kubectl

  1. 参见以下内容,分别创建nginx-ns1.yamlnginx-ns2.yaml

    2个应用的配置基本一致,分别绑定相应Namespace下的PVC。
    • nginx-ns1.yaml

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nas-test
        namespace: ns1   
      spec:
        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: nas-pvc
                  mountPath: "/data"
            volumes:
              - name: nas-pvc
                persistentVolumeClaim:
                  claimName: nas-csi-pvc
    • nginx-ns2.yaml

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nas-test
        namespace: ns2   
      spec:
        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: nas-pvc
                  mountPath: "/data"
            volumes:
              - name: nas-pvc
                persistentVolumeClaim:
                  claimName: nas-csi-pvc
  2. 创建2Deployment。

    kubectl create -f nginx-ns1.yaml -f nginx-ns2.yaml
  3. 查看Pod状态。

    kubectl get pod -A -l app=nginx

    预期输出:

    NAMESPACE   NAME                         READY   STATUS    RESTARTS   AGE
    ns1         nas-test-b75d5b6bc-*****     1/1     Running   0          2m19s
    ns2         nas-test-b75d5b6bc-*****     1/1     Running   0          2m11s
  4. 查看 Pod 详细配置,确认PVC挂载。

    <namespace-name><pod-name>分别替换为实际NameSpacePod名称。
    kubectl describe pod -n <namespace-name> <pod-name> | grep "ClaimName:"

    预期输出中,两个Pod分别挂载了 ns1/nas-csi-pvc和 ns2/nas-csi-pvc

控制台

  1. ACK集群列表页面,单击目标集群名称,在集群详情页左侧导航栏,选择工作负载 > 无状态

  2. 在命名空间ns1下,创建一个Deployment,并挂载相应的PVC。

    1. 选择命名空间ns1,单击使用镜像创建

    2. 按照页面提示完成应用的创建。

      主要参数如下,其他参数保持默认即可。详见创建无状态工作负载Deployment

      配置项

      参数

      说明

      应用基本信息

      副本数量

      Deployment的副本数量。

      容器配置

      镜像名称

      用于部署应用的镜像地址。

      所需资源

      所需的vCPU和内存资源。

      数据卷

      单击增加云存储声明,然后完成参数配置。

      • 挂载源:选择之前创建的PVC。

      • 容器路径:输入NAS文件系统要挂载到的容器路径,如/data。

  3. 参见上一步,在命名空间ns2下,再次创建一个Deployment,并挂载相应的PVC。

    返回无状态页面,在命名空间ns1ns2下,分别查看2Deployment的部署情况,确认Pod已正常Running,且挂载了对应的PVC。

后续结果验证可参见验证共享存储和持久化存储

方式三:使用filesystem方式挂载

filesystem 模式适用于需要为应用动态创建和管理专属 NAS 文件系统及挂载点的场景。与sharepath不同,每个以filesystem创建的 PV 都对应一个独立的 NAS 文件系统实例。

一个 filesystem 类型的 PV 对应一个独立的 NAS 文件系统和一个挂载点。
  • filesystem类型的PV删除时默认保留NAS文件系统和挂载点。如需在删除PV时同步删除NAS文件系统和挂载点,需在StorageClass中进行以下配置:

    • reclaimPolicy: Delete

    • parameters.deleteVolume: "true"

  • 使用ACK专有集群时,需授予csi-provisioner相应的权限。

    展开查看授权流程

    filesystem类型的NAS存储卷涉及NAS文件系统和挂载点的动态创建与删除,因此ACK专有集群需要授予csi-provisioner相应的权限。

    RAM Policy的最小集合如下。

    {
        "Action": [
            "nas:DescribeMountTargets",
            "nas:CreateMountTarget",
            "nas:DeleteFileSystem",
            "nas:DeleteMountTarget",
            "nas:CreateFileSystem"
        ],
        "Resource": [
            "*"
        ],
        "Effect": "Allow"
    }

    可通过以下任意一种方式进行授权:

    • 编辑ACK专有集群Master RAM角色中的自定义策略内容,添加以上NAS相关的权限设置。请参见修改自定义权限策略内容和备注自定义授权

    • 创建RAM用户并授权以上RAM Policy,并生成AccessKey,配置到csi-provisionerenv变量中。

      env:
      - name: CSI_ENDPOINT
        value: unix://socketDir/csi.sock
      - name: ACCESS_KEY_ID
        value: ""
      - name: ACCESS_KEY_SECRET
        value: ""

1. 创建StorageClass

StorageClass作为动态卷的供应模板,定义了存储资源的来源和行为。

  1. 参见以下内容创建alicloud-nas-fs.yaml,定义一个filesystem模式的StorageClass。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alicloud-nas-fs
    mountOptions:
    - nolock,tcp,noresvport
    - vers=3
    parameters:
      volumeAs: filesystem
      fileSystemType: standard
      storageType: Performance
      regionId: cn-beijing
      zoneId: cn-beijing-e
      vpcId: "vpc-2ze2fxn6popm8c2mzm****"
      vSwitchId: "vsw-2zwdg25a2b4y5juy****"
      accessGroupName: DEFAULT_VPC_GROUP_NAME
      deleteVolume: "false"
    provisioner: nasplugin.csi.alibabacloud.com
    reclaimPolicy: Retain

    参数

    描述

    mountOptions

    NAS的挂载参数,包括NFS协议版本等。默认使用v3协议挂载,可通过vers=4.0方式指定协议版本。关于不同NAS类型支持的NFS协议,请参见NFS协议

    parameters.volumeAs

    挂载方式,设置为filesystem

    parameters.fileSystemType

    NAS文件系统的类型。取值:

    • standard(默认):通用型NAS。

    • extreme:极速型NAS。

    parameters.storageType

    NAS文件系统的存储规格。

    • 通用型NAS的可取值:

      • Performance(默认):性能型

      • Capacity:容量型

    • 极速型NAS的可取值:

      • standard(默认):标准型

      • advance:高级型

    parameters.regionId

    NAS文件系统所属地域。需与集群保持一致。

    parameters.zoneId

    NAS文件系统所属可用区。同一VPC下,NAS可以跨可用区挂载。

    parameters.vpcId

    NAS文件系统挂载点所属VPC。需与集群保持一致。

    parameters.vSwitchId

    NAS文件系统挂载点所在vSwitch ID。

    parameters.accessGroupName

    NAS文件系统挂载点所在权限组。默认为DEFAULT_VPC_GROUP_NAME

    parameters.deleteVolume

    删除PVC时,是否同时删除PV,以及对应的NAS文件系统和挂载点。由于NAS为共享文件系统,出于安全考虑需要同时配置deleteVolumereclaimPolicy

    provisioner

    驱动类型。使用阿里云NAS CSI组件时固定为nasplugin.csi.alibabacloud.com

    reclaimPolicy

    PV的回收策略。当值为DeletedeleteVolumetrue时,才会在删除PVC的同时,删除PV以及对应的NAS文件系统和挂载点。

  2. 执行以下命令创建StorageClass。

    kubectl create -f alicloud-nas-fs.yaml

2. 创建PVC

  1. 参见以下内容创建nas-pvc-fs.yaml,申请使用存储资源。

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: nas-csi-pvc-fs
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: alicloud-nas-fs
      resources:
        requests:
          storage: 20Gi

    相关参数说明如下:

    参数

    说明

    accessModes

    配置访问模式。可取值:

    • ReadWriteMany(默认):多节点读写。

    • ReadWriteOnce:单节点读写。

    • ReadOnlyMany:多节点只读。

    storage

    可分配的存储容量,即待创建的NAS存储卷容量。

    极速型NAS的最小容量限制为100 GiB。如果StorageClass中定义了极速型NAS,此处storage的值须≥100 GiB。

    storageClassName

    待绑定的StorageClass。

  2. 创建PVC。

    kubectl create -f nas-pvc-fs.yaml

3. 创建应用并挂载NAS

  1. 参见以下内容,创建nas-fs.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: deployment-nas-fs
      labels:
        app: nginx-test
    spec:
      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: nas-pvc
                mountPath: "/data"
          volumes:
            - name: nas-pvc
              persistentVolumeClaim:
                claimName: nas-csi-pvc-fs
  2. 创建Deployment。

    kubectl create -f nas-fs.yaml
  3. 检查PVC状态。

    kubectl get pvc nas-csi-pvc-fs

    预期输出如下,表明PVC 已成功与PV绑定。

    NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      VOLUMEATTRIBUTESCLASS   AGE
    nas-csi-pvc-fs   Bound    nas-8338540d-34a1-4796-89cf-be2a7*******   20Gi       RWX            alicloud-nas-fs   <unset>                 13m
  4. 检查 PV 信息中新建的NAS 文件系统 ID。

    nas-8338540d-34a1-4796-89cf-be2a7*******替换为实际PV名称。
    kubectl describe pv nas-8338540d-34a1-4796-89cf-be2a7******* | grep "fileSystemId"

    预期输出的ID即为NAS文件系统ID,可登录NAS控制台,在文件系统列表页面查看。

验证共享存储和持久化存储

成功部署应用后,可验证存储卷是否按预期工作。本小节以subpath 模式下创建的 nas-test-1 和 nas-test-2 为例进行验证。

共享存储

持久化存储

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

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

    kubectl get pod | grep nas-test

    预期输出:

    nas-test-1-b75d5b6bc-*****           1/1     Running   0          50s
    nas-test-2-b75d5b6bc-*****           1/1     Running   0          60s
  2. 在一个Pod中创建文件。

    以名为nas-test-1-b75d5b6bc-*****Pod作为示例:

    kubectl exec nas-test-1-b75d5b6bc-***** -- touch /data/test.txt
  3. 在另一个Pod中查看文件是否存在。

    以名为nas-test-2-b75d5b6bc-*****Pod为例。

    kubectl exec nas-test-2-b75d5b6bc-***** -- ls /data

    预期输出:

    test.txt

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

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

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

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

    kubectl get pod | grep nas-test

    预期输出:

    nas-test-1-5bb845b795-*****           1/1     Running   0          115m
    nas-test-2-5b6bccb75d-*****           1/1     Running   0          103m
  3. 在新Pod中查看此前创建的文件是否存在。

    以名为nas-test-1-5bb845b795-*****Pod为例。

    kubectl exec nas-test-1-5bb845b795-***** -- ls /data

    预期输出:

    test.txt

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

适用于生产环境

  • 安全与数据保护

    • 使用Retain回收策略: 推荐将StorageClassreclaimPolicy设置为Retain,防止因误删PVC而导致后端数据被删除。

    • 使用权限组进行访问控制:NAS通过权限组来管理网络访问权限。请遵循最小权限原则,在权限组中仅添加集群节点的私网IP地址或其所属的vSwitch网段,避免授权范围过大(如 0.0.0.0/0)。

  • 性能与成本优化

    • 选择合适的NAS类型:参见文件系统选型,根据应用对IOPS和吞吐量的要求合理选择NAS类型。

    • 优化挂载选项 (mountOptions):根据工作负载特性调整NFS挂载参数。例如,使用vers=4.0vers=4.1协议版本可能在某些场景下获得更好的性能和文件锁定能力。对于大规模文件读写,可测试调整rsizewsize参数以优化读写性能。

  • 运维与可靠性

    • 配置健康检查:为应用Pod配置存活探针(Liveness Probe),检查挂载点是否正常。当挂载失效时,ACK可自动重启Pod,触发存储卷的重新挂载。

    • 监控与告警:利用容器存储监控配置告警,及时发现存储卷的异常或性能瓶颈。

资源释放指引

为避免产生预期外费用,当您不再需要使用NAS存储卷时,请按照以下顺序释放相关资源。

  1. 删除工作负载

    • 操作:删除所有使用该NAS存储卷的应用(如Deployment、StatefulSet等)。此操作将停止应用Pod对存储卷的挂载和读写。

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

  2. 删除PVC

    • 操作:删除应用所关联的PVC。删除PVC后,其绑定的PV和后端NAS的后续行为取决于对应StorageClass中定义的reclaimPolicy

      • subpath模式

        • reclaimPolicy: Retain:删除PVC后,其绑定的PV会进入Released状态。PV对象和后端NAS上的对应子目录及数据都会被保留,需手动删除。

        • reclaimPolicy: Delete:删除PVC后,其绑定的PV会被自动删除。后端NAS子目录的处理方式取决于archiveOnDelete参数:

          • archiveOnDelete: "true":后端数据不会被删除,而是被重命名归档为 archived-{pvName}.{timestamp}

          • archiveOnDelete: "false":后端NAS上与该PV对应的子目录及其中数据会被彻底删除。请谨慎操作。

          在 ACK Serverless 集群中,由于权限限制,即使配置为reclaimPolicy: Delete,后端NAS目录及数据也不会被删除或归档,仅PV对象会被删除。
      • sharepath模式

        reclaimPolicy 仅支持 Retain。删除PVC后,其绑定的PV会进入Released状态。由于是共享目录,PV对象和后端的NAS共享目录及数据会被保留。

      • filesystem模式

        • reclaimPolicy: Retain:删除PVC后,其绑定的PV会进入Released状态。PV对象、动态创建的后端NAS文件系统及挂载点都会被保留。

        • reclaimPolicy: Delete:删除PVC后,其绑定的PV会被自动删除。后端NAS文件系统的处理方式取决于deleteVolume参数:

          • deleteVolume: "false":后端NAS文件系统和挂载点会被保留,需手动删除。

          • deleteVolume: "true":后端NAS文件系统和挂载点会被自动删除。请谨慎操作。

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

  3. 删除PV

    • 操作:当PV处于AvailableReleased状态时,可执行删除操作。此操作仅从Kubernetes集群中移除该PV的定义,不会删除后端NAS文件系统上的数据。

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

  4. 删除后端NAS文件系统(可选)

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

    • filesystem模式:如在删除PVC时后端NAS文件系统未被自动删除,请参见删除文件系统,定位并手动删除对应的文件系统。

相关文档