文档

使用NAS动态存储卷

更新时间:

容器计算服务CSI支持Filesystem方式的NAS动态存储卷挂载,您可以通过容器计算服务控制台或kubectl两种方式进行挂载。本文介绍如何使用阿里云NAS动态存储卷,以及如何验证NAS存储卷的持久化存储与共享存储特性。

前提条件

  • 已创建ACS集群。具体操作,请参见创建ACS集群

  • ACS集群中CSI组件已升级至最新版本。更多信息,请参见管理组件

使用场景

  • 适用于对磁盘I/O要求较高的应用。

  • 选用持久化数据存储时,NAS读写性能相对于对象存储OSS高。

  • 可作为文件服务器实现跨主机文件共享。

注意事项

  • NAS支持同时被多个Pod挂载,此时多个Pod可能同时修改相同数据,需要应用自行实现数据的同步。

    说明

    NAS存储的/目录不支持修改权限、属主和属组。

  • 目前不支持在应用模板中配置securityContext.fsgroup参数,可能会造成挂载失败。

  • 目前使用NAS动态卷时,仅支持以filesystem的方式使用,共享目录为NAS的根目录(/)。

  • CSI插件不支持SMB挂载。

  • 数据卷挂载协议推荐使用NFSv3。

  • NAS卷只能挂载到相同VPC的ECS实例,不支持不同VPC网络的挂载。

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

  • 使用NAS数据卷前,建议将CSI存储插件升级到最新版本。

  • NAS挂载点创建后,等待一定时间,待挂载点状态可用后方可使用。

  • 在没有卸载NAS文件系统前,务必不要删除NAS挂载点,否则会造成操作系统无响应。

使用NAS动态存储卷

CSI插件支持使用Filesystem方式挂载NAS动态存储卷,您可以通过控制台和kubectl命令行两种方式进行操作。

Filesystem方式:仅支持通过kubectl命令行方式操作。

  • 当您的Kubernetes应用需要动态创建和删除NAS文件系统和挂载点时,您可以使用Filesystem方式进行挂载。

通过kubectl使用filesystem类型的NAS动态存储卷

重要

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

使用Filesystem类型NAS存储卷的Pod只能创建一个文件系统和一个挂载点,具体操作步骤如下。

  1. 创建StorageClass。

    1. 创建并复制以下内容到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

      参数

      描述

      volumeAs

      定义创建数据的类型,仅支持filesystem类型:

      • filesystem表示Provisioner自动创建NAS文件系统,一个PV对应一个NAS文件系统。

      fileSystemType

      定义创建NAS文件系统的类型。可选standard和extreme两种类型:

      • standard:通用型NAS。

      • extreme:极速型NAS。

      默认为通用型NAS。

      storageType

      定义创建NAS文件系统的存储规格类型。

      • 当fileSystemType=standard时,可选Performance(性能型)和Capacity(容量型)两种类型,默认为性能型。

      • 当fileSystemType=extreme时,可选standard(标准型)和advanced(高级型)两种类型,默认为标准型。

      regionId

      定义创建NAS文件系统所在地域。

      zoneId

      定义创建NAS文件系统所在可用区。

      vpcId

      定义创建NAS文件系统对应挂载点所在VPC。

      vSwitchId

      定义创建NAS文件系统对应挂载点所在vSwitch ID。

      accessGroupName

      定义创建NAS文件系统对应挂载点所用的AccessGroup。默认为DEFAULT_VPC_GROUP_NAME

      deleteVolume

      定义数据卷删除时处理NAS文件系统策略,由于NAS为共享文件系统,安全起见需要同时配置。

      provisioner

      驱动类型。本例中取值为nasplugin.csi.alibabacloud.com,表示使用阿里云NAS CSI插件。

      reclaimPolicy

      PV的回收策略。当值为DeletedeleteVolumetrue时,才会在删除PVC的时候将NAS文件系统删除。

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

      kubectl create -f alicloud-nas-fs.yaml
  2. 创建PVC和Pod挂载NAS存储卷。

    1. 创建并复制以下内容到pvc.yaml文件中。

      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: nas-csi-pvc-fs
      spec:
        accessModes:
          - ReadWriteMany
        storageClassName: alicloud-nas-fs
        resources:
          requests:
            storage: 20Gi
    2. 创建并复制以下内容到nginx.yaml文件中。

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: deployment-nas-fs
        labels:
          app: nginx
      spec:
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: nginx:1.7.9
              ports:
              - containerPort: 80
              volumeMounts:
                - name: nas-pvc
                  mountPath: "/data"
            volumes:
              - name: nas-pvc
                persistentVolumeClaim:
                  claimName: nas-csi-pvc-fs
    3. 执行以下命令创建PVC和Pod。

      kubectl create -f pvc.yaml -f nginx.yaml

这种场景下,CSI会在PVC创建时动态新建NAS文件系统和挂载点,PVC删除时动态删除挂载点和文件系统。

验证NAS的持久化存储

NAS提供了持久化存储服务,当某个Pod删除时,重新部署的Pod将自动同步之前Pod的所有数据。

根据以下示例验证NAS的持久化存储特性:

  1. 查看部署应用的Pod和NAS文件。

    1. 执行以下命令,查看部署的应用所在Pod的名称。

      kubectl get pod 

      预期输出:

      NAME                                READY   STATUS    RESTARTS   AGE
      deployment-nas-1-5b5cdb85f6-n****   1/1     Running   0          32s
      deployment-nas-2-c5bb4746c-4****    1/1     Running   0          32s
    2. 执行以下命令,查看任意一个Pod/data路径下的文件,本文以名为deployment-nas-1-5b5cdb85f6-n****的Pod为例。

      kubectl exec deployment-nas-1-5b5cdb85f6-n**** -- ls /data

      无返回结果,表明/data路径下无文件。

  2. 执行以下命令,在名为deployment-nas-1-5b5cdb85f6-n****的Pod/data路径下创建文件nas。

    kubectl exec deployment-nas-1-5b5cdb85f6-n**** -- touch /data/nas
  3. 执行以下命令,查看名为deployment-nas-1-5b5cdb85f6-n****的Pod/data路径下的文件。

    kubectl exec deployment-nas-1-5b5cdb85f6-n**** -- ls /data

    预期输出:

    nas
  4. 执行以下命令,删除Pod。

    kubectl delete pod deployment-nas-1-5b5cdb85f6-n****
  5. 同时在另一个窗口中,执行以下命令,查看Pod删除及Kubernetes重建Pod的过程。

    kubectl get pod -w -l app=nginx
  6. 验证删除Pod后,NAS里创建的文件是否还存在。

    1. 执行以下命令,查看Kubernetes重建的Pod名称。

      kubectl get pod

      预期输出:

      NAME                                READY   STATUS    RESTARTS   AGE
      deployment-nas-1-5b5cdm2g5-m****    1/1     Running   0          32s
      deployment-nas-2-c5bb4746c-4****    1/1     Running   0          32s
    2. 执行以下命令,查看名为deployment-nas-1-5b5cdm2g5-m****的Pod/data路径下的文件。

      kubectl exec deployment-nas-1-5b5cdm2g5-m**** -- ls /data

      预期输出:

      nas

      nas文件仍然存在,说明NAS的数据可持久化保存。

验证NAS存储卷的共享存储

NAS存储卷支持同时被多个Pod挂载,当某个Pod修改数据时,其余Pod将自行实现数据的同步。

根据以下示例验证NAS存储卷的共享存储特性:

  1. 查看部署的应用所在的Pod和NAS文件。

    1. 执行以下命令,查看应用所在的Pod名称。

      kubectl get pod 

      预期输出:

      NAME                                READY   STATUS    RESTARTS   AGE
      deployment-nas-1-5b5cdb85f6-n****   1/1     Running   0          32s
      deployment-nas-2-c5bb4746c-4****    1/1     Running   0          32s
    2. 执行以下命令,查看2个Pod/data路径下的文件。

      kubectl exec deployment-nas-1-5b5cdb85f6-n**** -- ls /data
      kubectl exec deployment-nas-2-c5bb4746c-4**** -- ls /data
  2. 执行以下命令,在任意一个Pod的/data路径下创建文件nas。

     kubectl exec deployment-nas-1-5b5cdb85f6-n**** -- touch /data/nas
  3. 执行以下命令,查看2个Pod/data路径下的文件。

    1. 执行以下命令,查看名为deployment-nas-1-5b5cdb85f6-n****的Pod/data路径下的文件。

      kubectl exec deployment-nas-1-5b5cdb85f6-n**** -- ls /data

      预期输出:

      nas
    2. 执行以下命令,查看名为deployment-nas-2-c5bb4746c-4****的Pod/data路径下的文件。

      kubectl exec deployment-nas-2-c5bb4746c-4**** -- ls /data

      预期输出:

      nas

      在任意一个Pod的/data下创建的文件,两个Pod下的/data路径下均存在此文件,说明两个Pod共享一个NAS。

相关文档

  • 本页导读