使用NAS动态存储卷

NAS存储卷适用于大数据分析、共享数据、Web应用以及保存日志等场景。除使用静态存储卷外,您也可以创建PVC并配置StorageClass来实现存储资源的动态分配,让系统为您自动预留持久化存储卷,无需预先手动创建和配置存储资源。您可以通过subpath方式、sharepath方式以及filesystem方式挂载NAS动态存储卷。

前提条件

  • 集群默认已安装CSI组件。如需升级,请参见升级csi-plugincsi-provisioner

    说明

    如果您集群中使用Flexvolume组件,由于Flexvolume已废弃,请参见迁移FlexvolumeCSI完成迁移后再进行挂载。您可以在运维管理 > 组件管理,在存储页签下确认存储组件类型。

使用限制

  • 不支持挂载SMB协议的NAS文件系统。

  • NAS文件系统只能挂载到相同VPCPod上,不支持跨VPC挂载。

    说明

    同一VPC下,NAS可以跨可用区挂载。

  • 通用型NAS与极速型NAS在挂载连通性、文件系统数量及协议类型等方面存在相应约束条件。更多信息,请参见使用限制

注意事项

挂载说明

StorageClass中的volumeAs参数可以定义PVNAS文件系统(及其子目录)的对应关系,请根据您的业务场景选择合适的挂载方式。

挂载方式

说明

使用场景

使用subpath方式挂载

创建子目录类型的PV,一个PV对应一个NAS文件系统的子目录。

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

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

使用sharepath方式挂载

创建PV时不会创建实际的目录,每个PV实际上会对应同一个NAS目录。

多个跨NamespacePod挂载同一个NAS子目录。

使用filesystem方式挂载(不推荐)

自动创建NAS文件系统,一个PV对应一个NAS文件系统。

单独使用一个NAS文件系统。需要动态创建和删除NAS文件系统和挂载点。

使用subpath方式挂载

重要

使用subpath方式挂载时,请确保CSI组件的版本为1.31.4及以上。如需升级,请参见升级csi-plugincsi-provisioner

步骤一:获取NAS文件系统和挂载点信息

  1. 登录NAS控制台,在左侧导航栏,单击文件系统 > 文件系统列表

  2. 创建NAS文件系统和挂载点。

    仅支持挂载NFS协议的NAS文件系统,挂载点和集群节点需在同一VPC内。

    • 如果您使用已有NAS,请确认NAS满足条件。

    • 如果您没有可用的NAS,请创建满足条件的NAS文件系统和挂载点。具体操作,请参见创建文件系统管理挂载点

  3. 获取挂载点信息。

    1. 单击文件系统ID,然后在左侧导航栏,单击挂载使用

    2. 挂载点区域,确认已有挂载点的状态为可用,然后获取挂载点地址。

步骤二:创建存储类(StorageClass)

kubectl

  1. 修改以下YAML内容,并保存为alicloud-nas-subpath.yaml。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alicloud-nas-subpath
    mountOptions:
    - nolock,tcp,noresvport
    - vers=3
    parameters:
      volumeAs: subpath
      server: "0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/k8s"
      archiveOnDelete: "true"
    provisioner: nasplugin.csi.alibabacloud.com
    reclaimPolicy: Retain
    allowVolumeExpansion: true

    参数

    描述

    mountOptions

    NAS的挂载参数,包括NFS协议版本等。推荐使用NFS v3协议,极速型NAS仅支持NFS v3。关于NFS协议的更多信息,请参见NFS协议

    parameters

    volumeAs

    挂载方式。本示例设置为subpath,表示创建子目录类型的PV。一个PV对应一个NAS文件系统的子目录。

    server

    要挂载的NAS文件系统的挂载点地址及子目录。格式为<NAS挂载点地址>:<挂载目录>。如未设置子目录,则默认挂载根目录/

    archiveOnDelete

    表示在reclaimPolicyDelete时,是否删除后端存储文件数据。由于NAS为共享存储,添加此选项进行双重确认。

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

    • false:会真正删除后端对应的存储资源。

    说明

    provisioner

    驱动类型。固定为nasplugin.csi.alibabacloud.com,表示使用阿里云NAS CSI插件。

    reclaimPolicy

    PV的回收策略,默认为Delete,支持Retain

    • Delete:需配合archiveOnDelete一起使用。

      • archiveOnDeletetrue时,删除PVC时,NAS中的文件只会被重命名,不会被删除。

      • archiveOnDeletefalse时,删除PVC时,NAS中的文件会被真正删除。

        重要

        此处真正删除的是NASsubpath目录以及其中的文件,NAS文件系统本身不会被删除,如需继续删除NAS文件系统,请参见删除文件系统

    • Retain:删除PVC的时候,PVNAS中文件不会被删除,需要您手动删除。

    如果数据安全性要求高,推荐使用Retain方式以免误删数据。

    allowVolumeExpansion

    仅通用型NAS文件系统支持设置此参数。开启时,该StorageClass动态创建的PV将会被配置NAS目录配额以限制可使用的容量,并支持通过更新PVC进行卷容量扩容。更多信息,请参见NAS动态存储卷设置目录配额

    说明

    NAS配额的生效是异步的,即动态创建出PV后,目录配额不能保证立即生效,且快速连续写入大量数据可能会超出设置的容量上限。关于NAS目录配额的更多信息,请参见目录配额

  2. 创建StorageClass。

    kubectl create -f alicloud-nas-subpath.yaml

控制台

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

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

  3. 存储类页面,单击创建

  4. 创建对话框中,StorageClass的相关配置完成后,单击创建

    主要配置项如下所示。

    配置项

    说明

    示例值

    名称

    StorageClass的名称。格式要求请参考界面提示。

    alicloud-nas-subpath

    存储卷类型

    选择NAS

    NAS

    选择挂载点

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

    0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com

    存储卷模式

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

    说明

    子目录模式仅在CSI组件为1.31.4及以上版本时生效,否则均为共享目录模式。

    子目录

    挂载路径

    要挂载的NAS子目录。

    • 如果未设置,则默认挂载到根目录。

    • 如果NAS中没有该目录,会自动创建后再进行挂载。

    说明

    通用型NAS的根目录为/,极速型NAS的根目录为/share。挂载极速型NAS的子目录时,path必须以/share开头,如/share/data

    /k8s

    回收策略

    PV的回收策略。推荐使用Retain模式,以免误删数据。

    • Delete:需配合archiveOnDelete一起使用。由于控制台界面暂不支持配置archiveOnDelete,仅在此处选择Delete不会生效,即删除PVC时不会真正删除PVNAS文件。如需配置archiveOnDelete请通过YAML创建PV,具体YAML示例,请参考kubectl操作。

    • Retain:删除PVC时,PVNAS文件不会被删除,需要您手动删除。

    Retain

    挂载选项

    NAS的挂载参数,包括NFS协议版本等。推荐使用NFS v3协议,极速型NAS仅支持NFS v3。关于NFS协议的更多信息,请参见NFS协议

    保持默认

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

步骤三:创建存储声明(PVC)

kubectl

  1. 修改YAML内容,并保存为nas-pvc.yaml。

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

    参数

    说明

    accessModes

    配置访问模式。默认为ReadWriteMany,支持ReadWriteOnceReadOnlyMany

    storageClassName

    要绑定的StorageClass的名称。

    storage

    声明所需使用的存储卷的容量。

    重要
    • 默认情况下,NAS存储卷的实际可用容量不受该配置限制,由NAS文件系统的规格决定,请参见通用型NAS极速型NAS确认具体可用容量。

    • 如果使用通用型NAS,且StorageClassallowVolumeExpansiontrue时,CSI将按照该配置设置NAS目录配额,限制NAS存储卷的可用容量。

  2. 创建PVC。

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

    kubectl get pvc

    预期返回如下,可以看到CSI已基于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. 存储声明页面,单击创建

  3. 在弹出的创建存储声明页面中,配置完成后,单击创建

    配置项

    说明

    示例值

    存储声明类型

    选择NAS。

    NAS

    名称

    创建的存储声明名称在命名空间内必须唯一。

    pvc-nas

    分配模式

    本示例选择使用存储类动态创建

    使用存储类动态创建

    已有存储类

    单击选择存储类,在弹出的对话中选择上一步创建的存储类。

    alicloud-nas-subpath

    总量

    创建存储卷的容量,此处设置的大小不会限制应用可使用的最大容量。

    重要
    • 默认情况下,NAS存储卷的实际可用容量不受该配置限制,由NAS文件系统的规格决定,请参见通用型NAS极速型NAS确认具体可用容量。

    • 如果使用通用型NAS,且StorageClassallowVolumeExpansiontrue时,CSI将按照该配置设置NAS目录配额,限制NAS存储卷的可用容量。

    20Gi

    访问模式

    默认为ReadWriteMany,也可选择ReadWriteOnceReadOnlyMany

    ReadWriteMany

步骤四:创建应用并挂载NAS

kubectl

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

说明

如果要为多个Pod挂载同一NAS文件系统的不同子目录,请按照子目录创建不同的StorageClass和对应的PVC,再分别挂载PVC。

  1. 修改以下YAML内容,分别保存为nginx-1.yamlnginx-2.yaml。

    YAML示例如下,除metadata.name外,nginx-1.yamlnginx-2.yaml的其他配置均一致,2个应用绑定同一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
                mountPath: "/data"           # NAS在容器中的挂载路径
          volumes:
            - name: nas-pvc                 
              persistentVolumeClaim:
                claimName: nas-csi-pvc       # 用于绑定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
                mountPath: "/data"           # NAS在容器中的挂载路径
          volumes:
            - name: nas-pvc                 
              persistentVolumeClaim:
                claimName: nas-csi-pvc       # 用于绑定PVC
  2. 创建2Deployment。

    kubectl create -f nginx-1.yaml -f nginx-2.yaml
  3. 查看Pod信息。

    kubectl get pod -l app=nginx

    预期返回如下,已为不同的应用挂载同一个NAS文件系统的同一个子目录。

    NAME                         READY   STATUS    RESTARTS   AGE
    nas-test-1-b75d5b6bc-vqwq9   1/1     Running   0          51s
    nas-test-2-b75d5b6bc-8k9vx   1/1     Running   0          44s

控制台

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

  1. 在集群管理页左侧导航栏,选择工作负载 > 无状态

  2. 无状态页面,单击使用镜像创建

  3. 配置创建应用的参数信息。

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

    配置项

    参数

    说明

    示例

    应用基本信息

    应用名称

    Deployment名称,自定义输入。格式要求请参考界面提示。

    deployment-nas-1

    副本数量

    Deployment的副本数量。

    1

    容器配置

    镜像名称

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

    anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6

    所需资源

    所需的vCPU和内存资源。

    0.25 vCPU,512 MiB

    数据卷

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

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

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

    • 挂载源:pvc-nas

    • 容器路径:/data

    nas1.png

  4. 查看应用部署状态。

    1. 无状态页面,单击应用名称。

    2. 容器组页签下,确认Pod已正常运行(状态为Running)。

使用sharepath方式挂载

步骤一:获取NAS文件系统和挂载点信息

  1. 登录NAS控制台,在左侧导航栏,单击文件系统 > 文件系统列表

  2. 创建NAS文件系统和挂载点。

    仅支持挂载NFS协议的NAS文件系统,挂载点和集群节点需在同一VPC内。

    • 如果您使用已有NAS,请确认NAS满足条件。

    • 如果您没有可用的NAS,请创建满足条件的NAS文件系统和挂载点。具体操作,请参见创建文件系统管理挂载点

  3. 获取挂载点信息。

    1. 单击文件系统ID,然后在左侧导航栏,单击挂载使用

    2. 挂载点区域,确认已有挂载点的状态为可用,然后获取挂载点地址。

步骤二:创建存储类(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: "0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/sharepath"
    provisioner: nasplugin.csi.alibabacloud.com
    reclaimPolicy: Retain

    参数

    描述

    mountOptions

    NAS的挂载参数,包括NFS协议版本等。推荐使用NFS v3协议,极速型NAS仅支持NFS v3。关于NFS协议的更多信息,请参见NFS协议

    parameters

    volumeAs

    挂载方式。本示例设置为sharepath,表示创建PV时不会创建实际的目录,将会直接使用StorageClass里设置的路径,即每个PV实际上会对应同一个NAS目录。

    server

    要挂载的NAS文件系统的挂载点地址及子目录。格式为<NAS挂载点地址>:<挂载目录>。如未设置子目录,则默认挂载根目录/

    provisioner

    驱动类型。固定为nasplugin.csi.alibabacloud.com,表示使用阿里云NAS CSI插件。

    reclaimPolicy

    PV的回收策略。使用sharepath方式挂载时必须要设置为 Retain

  2. 创建StorageClass。

    kubectl create -f alicloud-nas-sharepath.yaml

控制台

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

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

  3. 存储类页面,单击创建

  4. 创建对话框中,StorageClass的相关配置完成后,单击创建

    主要配置项如下所示。

    配置项

    说明

    示例值

    名称

    StorageClass的名称。格式要求请参考界面提示。

    alicloud-nas-sharepath

    存储卷类型

    选择NAS

    NAS

    选择挂载点

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

    0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com

    存储卷模式

    存储卷访问模式。本示例选择共享目录,即使用sharepath方式挂载,表示创建PV时不会创建实际的目录,将会直接使用StorageClass里设置的路径,这意味着每个PV实际上会对应同一个NAS目录,便于跨Namespace共享目录使用场景。

    共享目录

    挂载路径

    要挂载的NAS子目录。

    • 如果未设置,则默认挂载到根目录。

    • 如果NAS中没有该目录,会自动创建后再进行挂载。

    说明

    通用型NAS的根目录为/,极速型NAS的根目录为/share。挂载极速型NAS的子目录时,path必须以/share开头,如/share/data

    /sharepath

    回收策略

    使用sharepath方式挂载时必须要设置为 Retain

    Retain

    挂载选项

    NAS的挂载参数,包括NFS协议版本等。推荐使用NFS v3协议,极速型NAS仅支持NFS v3。关于NFS协议的更多信息,请参见NFS协议

    保持默认

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

步骤三:创建存储声明(PVC)

以下示例将在2个不同Namespace下创建PVC,

kubectl

为实现跨NamespacePod的挂载NAS,您需要先创建2个不同的Namespace。

  1. 创建命名空间ns1ns2。

    kubectl create ns ns1
    kubectl create ns ns2
  2. 修改以下YAML内容,并保存为pvc.yaml。

    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,支持ReadWriteOnceReadOnlyMany

    storageClassName

    要绑定的StorageClass的名称。

    storage

    声明所需使用的存储卷的容量。

    重要
    • 默认情况下,NAS存储卷的实际可用容量不受该配置限制,由NAS文件系统的规格决定,请参见通用型NAS极速型NAS确认具体可用容量。

    • 如果使用通用型NAS,且StorageClassallowVolumeExpansiontrue时,CSI将按照该配置设置NAS目录配额,限制NAS存储卷的可用容量。

  3. 创建PVC。

    kubectl create -f pvc.yaml
  4. 查看PV。

    kubectl get pv

    预期返回如下,可以看到CSI已基于StorageClass自动创建了2PV,并绑定到不同命名空间下的2PVC。

    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. 在命名空间ns下,创建一个存储声明。

    1. 存储声明页面,选择命名空间ns1,单击创建

    2. 在弹出的创建存储声明页面中,配置完成后,单击创建

      配置项

      说明

      示例值

      存储声明类型

      选择NAS。

      NAS

      名称

      创建的存储声明名称在命名空间内必须唯一。

      pvc-nas

      分配模式

      本文中选择使用存储类动态创建

      使用存储类动态创建

      已有存储类

      单击选择存储类,在弹出的对话框中选择已创建的存储类。

      alicloud-nas-sharepath

      总量

      创建的存储卷的容量。

      20Gi

      访问模式

      默认为ReadWriteMany,也可选择ReadWriteOnceReadOnlyMany

      ReadWriteMany

  4. 参考上一步,在命名空间ns2下,再创建一个存储声明。

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

步骤四:创建应用并挂载NAS

2个不同Namespace下分别创建应用,并挂载相应Namespace下的PVC,它们将共享StorageClass中定义的NAS目录。

kubectl

  1. 修改以下YAML内容,分别保存为nginx-ns1.yamlnginx-ns2.yaml。

    YAML示例如下,除metadata.namespace外,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下的Pod挂载同一个NAS文件系统的子目录。

    NAMESPACE   NAME                         READY   STATUS    RESTARTS   AGE
    ns1         nas-test-b75d5b6bc-ljvfd     1/1     Running   0          2m19s
    ns2         nas-test-b75d5b6bc-666hn     1/1     Running   0          2m11s

控制台

  1. 在集群管理页左侧导航栏,选择工作负载 > 无状态

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

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

    2. 配置创建应用的参数信息。

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

      配置项

      参数

      说明

      示例

      应用基本信息

      应用名称

      Deployment名称,自定义输入。格式要求请参考界面提示。

      nginx

      副本数量

      Deployment的副本数量。

      2

      容器配置

      镜像名称

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

      anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6

      所需资源

      所需的vCPU和内存资源。

      0.25 vCPU,512 MiB

      数据卷

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

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

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

      • 挂载源:pvc-nas

      • 容器路径:/data

      nas1.png

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

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

使用filesystem方式挂载

当应用需要动态创建和删除NAS文件系统和挂载点时,您可以使用filesystem方式挂载NAS,使用filesystem类型NAS存储卷的Pod只能创建一个文件系统和一个挂载点。

重要

filesystem类型的NAS动态卷在删除时默认保留文件系统和挂载点,如需在释放PV资源的同时释放NAS文件系统和挂载点,则需要同时设置StorageClass中的reclaimPolicyDeletedeleteVolume的值为true

步骤一:RAM Policy设置和授予(仅ACK专有集群需执行)

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: ""

步骤二:创建存储类(StorageClass)

  1. 修改以下YAML内容,并保存为alicloud-nas-fs.yaml。

    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协议版本等。推荐使用NFS v3协议,极速型NAS仅支持NFS v3。关于NFS协议的更多信息,请参见NFS协议

    parameters

    volumeAs

    挂载方式。本示例设置为filesystem,表示会自动创建NAS文件系统,一个PV对应一个NAS文件系统。

    fileSystemType

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

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

    • extreme:极速型NAS。

    storageType

    NAS文件系统的存储规格。

    • 对于通用型NAS,可选值如下:

      • Performance(默认):性能型

      • Capacity:容量型

    • 对于极速型NAS,可选值如下:

      • standard(默认):标准型

      • advanced:高级型

    regionId

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

    zoneId

    NAS文件系统所属可用区。

    说明

    同一VPC下,NAS可以跨可用区挂载。

    vpcId

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

    vSwitchId

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

    accessGroupName

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

    deleteVolume

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

    provisioner

    驱动类型。此处须配置为nasplugin.csi.alibabacloud.com,表示使用阿里云NAS CSI组件。

    reclaimPolicy

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

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

    kubectl create -f alicloud-nas-fs.yaml

步骤三:创建存储声明(PVC)

  1. 修改以下YAML,保存为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
  2. 创建PVC。

    kubectl create -f nas-pvc-fs.yaml

步骤四:创建应用并挂载NAS

  1. 修改以下YAML,保存为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

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

按照上文示例创建的多个Pod挂载了同一NAS文件系统。您可以通过以下方式进行验证:

  • 在一个Pod中创建文件,然后另一个Pod中查看文件,以此来验证共享存储。

  • 重建Deployment,然后在新创建的Pod中查看文件系统中的数据是否存在,以此来验证持久化存储。

  1. 查看Pod信息。

    kubectl get pod | grep nas-test

    返回示例如下:

    nas-test-*****a   1/1     Running   0          40s
    nas-test-*****b   1/1     Running   0          40s
  2. 验证共享存储。

    1. 在一个Pod中创建文件。

      以名为nas-test-*****aPod作为示例:

      kubectl exec nas-test-*****a -- touch /data/test.txt
    2. 在另一个Pod中查看文件。

      以名为nas-test-*****bPod作为示例:

      kubectl exec nas-test-*****b -- ls /data

      预期返回如下,可以看到已共享新建的文件test.txt

      test.txt
  3. 验证持久化存储。

    1. 重建Deployment。

      kubectl rollout restart deploy nas-test
    2. 查看Pod,等待新Pod创建成功。

      kubectl get pod | grep nas-test

      返回示例如下:

      nas-test-*****c   1/1     Running   0          67s
      nas-test-*****d   1/1     Running   0          49s
    3. 在新Pod中查看文件系统中的数据是否存在。

      以名为nas-test-*****cPod作为示例:

      kubectl exec nas-test-*****c -- ls /data

      预期返回如下,可以看到NAS文件系统中的数据依然存在,在新Pod的挂载目录下可以重新获取。

      test.txt

常见问题

在挂载和使用NAS存储卷的过程中,如果遇到问题,可参考以下文档进行排查。

相关文档