使用NAS存储卷

对于共享数据,I/O要求较高的应用场景,您可以使用NAS文件系统作为持久化存储卷。本文介绍如何为应用挂载NAS存储卷,并验证NAS的共享存储和持久化存储。

背景信息

NAS是一种可共享访问、弹性扩展、高可靠以及高性能的分布式文件系统,适用于共享数据,以及I/O要求较高的应用场景。更多信息,请参见存储概述

说明
  • 各类型NAS文件系统的存储规格、性能、计费、支持的地域和可用区等信息,请参见通用型NAS极速型NAS

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

根据是否已有NAS文件系统,您可以选择以下方式挂载使用NAS存储卷:

前提条件

ACS集群中已安装csi-provisioner组件。

说明

您可以在ACS集群管理页的左侧导航栏单击组件管理,然后在存储页签下确认csi-provisioner组件的安装情况。

使用限制

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

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

    说明

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

  • 仅支持通过NFSv3协议挂载NAS文件系统。

注意事项

  • NAS为共享存储,一个NAS存储卷可以挂载到多个Pod上。此时多个Pod可能同时修改相同数据,需要应用自行实现数据的同步。

  • 挂载NAS时,请勿在应用的YAML中配置securityContext.fsgroup,这可能会造成挂载失败。

    说明

    NAS文件系统的/目录不支持修改权限、属主和属组。

  • 挂载NAS后,请勿删除挂载点,否则会造成操作系统无响应。

使用已有NAS文件系统作为存储卷

步骤一:获取NAS文件系统信息

  1. 获取ACS Pod使用的VPC和交换机ID。

    说明

    以下步骤为控制台操作,您也可以执行kubectl get cm -n kube-system acs-profile -o yaml命令查看acs-profileYAML,在vpcIdvSwitchIds中获取Pod使用的VPC ID和交换机ID。

    1. 登录容器计算服务控制台

    2. 集群列表页面,单击目标集群名称,进入该集群的管理页面。

    3. 在左侧导航栏,选择配置管理 > 配置项

    4. 配置项页面上方将命名空间改为kube-system,然后找到acs-profile,单击YAML 编辑

    5. vpcIdvSwitchIds中获取Pod使用的VPC ID和交换机ID。

  2. 确认已有的NAS文件系统满足要求,并获取挂载点地址。

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

    2. 找到目标NAS文件系统,确认地域、可用区和协议类型满足要求。

      • NAS不支持跨VPC挂载,即不支持跨地域使用。请确保已有NAS的所属地域与ACS一致。

      • 同一VPC下,NAS可以跨可用区挂载,但建议和ACS集群中Pod使用的可用区一致,性能相对更优。

      • 确认NAS文件系统的协议类型为NFS。目前不支持挂载SMB协议的NAS文件系统。

      nas

    3. 确认挂载点满足要求,并获取挂载点地址。

      1. 单击文件系统ID。

      2. 在文件系统详情页左侧导航栏,单击挂载使用

      3. 挂载点区域,确认已有挂载点满足要求,然后获取挂载点地址。

        说明
        • 通用型NAS在创建文件系统时会自动创建一个挂载点,极速型NAS需要手动创建挂载点。

        • 如果已有挂载点不满足要求,可创建新的挂载点。具体操作,请参见管理挂载点

        • 挂载点的VPC必须和ACS集群中Pod使用的VPC一致,否则会导致挂载失败。

        • 挂载点的交换机建议和ACS集群中Pod使用的交换机一致,性能相对更优。

        • 挂载点的状态为可用

        NAS挂载点.png

步骤二:创建PVC

kubectll

  1. 将以下YAML内容保存为nas-pvc.yaml。

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: nas-pvc
      annotations:
        csi.alibabacloud.com/mountpoint: *******-mw***.cn-shanghai.nas.aliyuncs.com
        csi.alibabacloud.com/mount-options: nolock,tcp,noresvport
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 20Gi
      storageClassName: alibaba-cloud-nas

    相关参数说明如下:

    重要

    根据上述YAML创建PVC时,系统会根据annotations中关于NAS的配置先创建静态PV,然后再创建PVC,关联该PV。

    参数

    说明

    csi.alibabacloud.com/mountpoint

    要挂载的NAS文件系统目录。用于关联之前创建的NAS文件系统。

    • 如果输入挂载点地址,例如****-****.<region>.nas.aliyuncs.com,则表示挂载的目录为NAS文件系统的根目录(/)。

    • 如果输入挂载点地址和子目录,例如****-****.<region>.nas.aliyuncs.com:/dir,则表示挂载的目录为NAS文件系统的/dir目录。如果/dir目录不存在,系统会自动新建。

    csi.alibabacloud.com/mount-options

    挂载参数。建议使用nolock,tcp,noresvport

    accessModes

    访问模式。

    storage

    分配给Pod的存储容量,即要创建的NAS存储卷容量。

  2. 创建PVC。

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

    kubectl get pv

    预期返回如下,在创建PVC时已基于传入的NAS文件系统挂载点等信息,自动创建对应的PV。

    NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS        REASON   AGE
    nas-ea7a0b6a-bec2-4e56-b767-47222d3a****   20Gi       RWX            Retain           Bound    default/nas-pvc   alibaba-cloud-nas            1m58s
  4. 查看PVC。

    kubectl get pvc

    预期返回如下,PVC已关联自动创建的PV。

    NAME      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS        VOLUMEATTRIBUTESCLASS  AGE
    nas-pvc   Bound    nas-ea7a0b6a-bec2-4e56-b767-47222d3a****   20Gi       RWX            alibaba-cloud-nas   <unset>                2m14s

控制台

  1. 登录容器计算服务控制台

  2. 集群列表页面,单击目标集群名称,进入该集群的管理页面。

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

  4. 存储声明页面,单击创建

  5. 在弹出的对话框中,完成参数配置,然后单击创建

    参数

    说明

    示例

    存储声明类型

    选择NAS

    NAS

    名称

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

    nas-pvc

    分配模式

    选择使用挂载点域名创建

    使用挂载点域名创建

    存储驱动

    默认已选择CSI

    CSI

    总量

    分配给Pod的存储容量,即要创建的NAS存储卷容量。

    20Gi

    访问模式

    支持ReadWriteManyReadWriteOnce。

    ReadWriteMany

    挂载点域名

    配置要挂载的NAS文件系统目录。

    • 如果输入挂载点地址,例如****-****.<region>.nas.aliyuncs.com,则表示挂载的目录为NAS文件系统的根目录(/)。

    • 如果输入挂载点地址和子目录,例如****-****.<region>.nas.aliyuncs.com:/dir,则表示挂载的目录为NAS文件系统的/dir目录。如果/dir目录不存在,系统会自动新建。

    350514****-mw***.cn-shanghai.nas.aliyuncs.com

    创建完成后,在存储声明页面可以看到新创建的PVC,该PVC已绑定自动创建的PV(即NAS存储卷)。您可以在存储卷页面查看对应PV的详细信息。

    nas-pvc.png

    nas-pv.png

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

kubectll

  1. 使用以下YAML内容,创建nas-test.yaml文件。

    以下YAML示例可以创建包含2PodDeployment,2Pod均通过名为nas-pvcPVC申请存储资源,挂载路径均为/data

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nas-test
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
            ports:
            - containerPort: 80
            volumeMounts:
              - name: pvc-nas
                mountPath: /data
          volumes:
            - name: pvc-nas
              persistentVolumeClaim:
                claimName: nas-pvc
  2. 创建Deployment并挂载NAS。

    kubectl create -f nas-test.yaml
  3. 查看DeploymentPod的部署情况。

    kubectl get pod | grep nas-test

    返回示例如下,已创建2Pod。

    nas-test-****-***a   1/1     Running   0          40s
    nas-test-****-***b   1/1     Running   0          40s
  4. 查看挂载路径。

    命令示例如下,预期会返回NAS文件系统挂载目录下的数据。默认为空。

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

控制台

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

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

  3. 完成Deployment的参数配置,单击创建

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

    配置页

    参数

    说明

    示例

    应用基本信息

    应用名称

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

    nas-test

    副本数量

    配置Deployment的副本数量。

    2

    容器配置

    镜像名称

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

    registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest

    所需资源

    设置所需的vCPU和内存资源。

    0.25 vCPU,0.5 GiB

    数据卷

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

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

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

    • 挂载源:nas-pvc

    • 容器路径:/data

  4. 查看应用部署情况。

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

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

新建NAS文件系统作为存储卷

步骤一:创建StorageClass

  1. 参考参数说明表修改以下YAML内容,并保存为nas-sc.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-shanghai
      zoneId: cn-shanghai-e
      vpcId: "vpc-2ze2fxn6popm8c2mzm****"
      vSwitchId: "vsw-2zwdg25a2b4y5juy****"
      accessGroupName: DEFAULT_VPC_GROUP_NAME
      deleteVolume: "false"
    provisioner: nasplugin.csi.alibabacloud.com
    reclaimPolicy: Retain

    相关参数说明如下:

    重要

    不同类型和存储规格的NAS文件系统支持的地域、可用区不同。请根据业务的存储需求、ACS集群所属地域和ACS集群中Pod使用的VPC和交换机信息等确定您要在哪个地域、可用区,以及哪个VPC、交换机下创建什么类型的NAS文件系统和挂载点。相关参考如下:

    • 各类型NAS文件系统的存储规格、性能、计费、支持的地域和可用区等信息,请参见通用型NAS极速型NAS

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

    • 您可以执行kubectl get cm -n kube-system acs-profile -o yaml命令查看acs-profileYAML,在vpcIdvSwitchIds中获取Pod使用的VPC ID和交换机ID。

    参数

    说明

    volumeAs

    目前仅支持filesystem,表示会自动创建一个NAS文件系统,即一个NAS存储卷对应一个NAS文件系统。

    fileSystemType

    NAS文件系统的类型。

    • standard(默认):通用型NAS,更多信息,请参见通用型NAS

    • extreme:极速型NAS,更多信息,请参见极速型NAS

    storageType

    NAS文件系统的存储规格。

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

      • Performance(默认):性能型

      • Capacity:容量型

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

      • standard(默认):标准型

      • advanced:高级型

    regionId

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

    zoneId

    NAS文件系统所属可用区。请根据ACS集群中Pod所使用的交换机,选择对应的可用区。

    说明

    同一VPC下,NAS可以跨可用区挂载。建议选择同一可用区,性能相对更优。

    vpcIdvSwitchId

    NAS文件系统挂载点所属的VPC ID和交换机ID。需配置为ACS集群中Pod使用的VPC ID和交换机ID。

    accessGroupName

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

    provisioner

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

    reclaimPolicy

    PV的回收策略。目前仅支持Retain,表示删除PV时,会保留对应的NAS文件系统和挂载点。

  2. 创建StorageClass。

    kubectl create -f nas-sc.yaml
  3. 查看StorageClass。

    kubectl get sc

    预期返回:

    NAME                             PROVISIONER                       RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
    alicloud-nas-fs                  nasplugin.csi.alibabacloud.com    Retain          Immediate              false                  13m
    ......

步骤二:创建PVC

  1. 将以下YAML内容保存为nas-pvc-fs.yaml。

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

    相关参数说明如下:

    参数

    说明

    accessModes

    访问模式。

    storage

    分配给Pod的存储容量,即要创建的NAS存储卷容量。

    说明

    由于极速型NAS100 GiB的最小容量限制,如果StorageClass中定义的NAS文件系统类型为极速型NAS,此处storage的值必须≥100 GiB,否则无法创建对应的PV。

    storageClassName

    要绑定的StorageClass名称。

  2. 创建PVC。

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

    kubectl get pvc

    返回示例如下,PVC已关联自动创建的PV。您可以前往NAS文件系统控制台查看对应的NAS文件系统。

    NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      VOLUMEATTRIBUTESCLASS  AGE
    nas-pvc-fs   Bound    nas-04a730ba-010d-4fb1-9043-476d8c38****   20Gi       RWX            alicloud-nas-fs   <unset>                14s

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

  1. 使用以下YAML内容,创建nas-test-fs.yaml文件。

    以下YAML示例可以创建包含2PodDeployment,2Pod均通过名为nas-pvc-fsPVC申请存储资源,挂载路径均为/data

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nas-test
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
            ports:
            - containerPort: 80
            volumeMounts:
              - name: pvc-nas
                mountPath: /data
          volumes:
            - name: pvc-nas
              persistentVolumeClaim:
                claimName: nas-pvc-fs
  2. 创建Deployment并挂载NAS。

    kubectl create -f nas-test-fs.yaml
  3. 查看DeploymentPod的部署情况。

    kubectl get pod | grep nas-test

    返回示例如下,已创建2Pod。

    nas-test-****-***a   1/1     Running   0          40s
    nas-test-****-***b   1/1     Running   0          40s
  4. 查看挂载路径。

    命令示例如下,预期会返回NAS文件系统挂载目录下的数据。默认为空。

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

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

按照上文示例创建的Deployment中含有2Pod,2Pod挂载了同一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-c***Pod作为示例:

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

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

      test.txt