使用NAS静态存储卷

更新时间: 2024-01-16 18:10:44

阿里云Kubernetes CSI支持两种类型的NAS动态存储卷挂载:subpath方式和filesystem方式。本文介绍如何使用阿里云NAS静态存储卷,及如何实现持久化存储与共享存储。

前提条件

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

  • 已开通NAS并创建NAS文件系统。具体操作,请参见创建文件系统

    若需要加密NAS存储卷中的数据,创建NAS文件系统时请配置加密类型。

  • 已创建NAS挂载点。具体操作,请参见管理挂载点

    NAS挂载点需要和集群节点在同一个VPC内。

使用场景

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

  • 读写性能相对于对象存储OSS高。

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

注意事项

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

    说明

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

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

通过控制台的方式使用NAS静态存储卷

步骤一:获取ACS集群的地域和可用区信息

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

  2. 在集群列表页面,选择目标集群。

  3. 在集群管理页左侧导航栏,选择集群信息

  4. 集群信息页面,单击集群资源标签。

  5. 记录ACS集群的“虚拟专有网络 VPC”和“Pod 虚拟交换机”信息,并且分别点击查看它们的详情,记录下它们的ID和名称,以及地域和可用区信息。

image.png

步骤二:创建NAS文件系统和挂载点

  1. 登录NAS文件系统控制台

  2. 点击页面下方“创建通用型NAS”的按钮。

  3. 配置创建通用型NAS的各个选项,其中:

    1. 地域与ACS集群的地域保持一致;

    2. 可用区建议与步骤一中的ACS集群所在可用区保持一致;

    3. 存储规格根据您的自身需求选择即可;

    4. 协议类型选择NFS;

    5. 专有网络选择与ACS集群一致的VPC。注意这里选择的是专有网络的名称,而非ID;

    6. 虚拟交换机建议选择位于上述可用区的交换机。这里选择的同样是虚拟交换机的名称,而非ID;

  4. 创建NAS文件系统后,在集群管理页左侧导航栏,选择文件系统 > 文件系统列表,点击刚才自己创建的文件系统查看详情。

  5. 在文件系统详情页左侧导航栏,选择挂载使用,点击添加挂载点按钮查看挂载点,等待其状态变为可用。

image.png

说明

如果要创建极速型NAS,则需要先创建文件系统,然后进入文件系统添加挂载点。关于专有网络和虚拟交换机等参数选择请同样遵循上述说明。

步骤三:创建PVC

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

  2. 在集群列表页面,选择目标集群。

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

  4. 存储声明页面,单击右上角的创建

  5. 在弹出的创建存储声明页面中,填写界面参数。

    参数

    说明

    存储声明类型

    支持云盘和NAS两种云存储类型。 本文中选择NAS

    名称

    创建的存储声明名称在集群内必须唯一。

    分配模式

    选择使用挂载点域名创建。

    总量

    所创建存储卷的容量。

    说明

    所创建存储卷声明的容量不能超过待挂载的存储卷容量。

    挂载点域名

    填写步骤二中获取的挂载点域名,默认共享目录为NAS的根目录(/)。

    重要
    • 如果希望共享subpath子目录,或步骤二中创建的是极速型NAS,则需要通过kubectl命令行的方式完成。

    • 极速型NAS的共享目录必须以/share开头,例如:/share/share/subdir

  6. 单击创建

    创建成功后可以在列表中看到创建的存储声明,状态为Pending,等待Pod消费。

image.png

步骤四:创建应用

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

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

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

    以下主要为您介绍数据卷的配置。关于其他参数的描述,请参见创建无状态工作负载Deployment

    ACS数据卷支持配置本地存储和云存储。

    • 本地存储:支持配置项(ConfigMap)、保密字典(Secret)和临时目录(EmptyDir),将对应的挂载源挂载到容器路径中。更多信息,请参见Volumes

    • 云存储:支持云存储类型。

    本例中配置了一个NAS类型的数据卷,将该NAS存储卷挂载到容器中/tmp路径下。

    image.png

  4. 所有的信息都配置完成后,单击创建

    创建成功后,就可以正常使用数据卷了。

通过kubectl命令行方式使用NAS静态存储卷

前提条件:已使用kubectl连接Kubernetes集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群

  1. 同之前的步骤一:获取ACS集群的地域和可用区信息

  2. 同之前的步骤二:创建NAS文件系统和挂载点

  3. 创建静态PVC。

    1. 保存以下示例YAML内容至pvc-nas.yaml文件中。

      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: pvc-nas
        annotations:
          csi.alibabacloud.com/mountpoint: ****.nas.aliyuncs.com
      spec:
        accessModes:
          - ReadWriteMany
        resources:
          requests:
            storage: 20Gi
        storageClassName: alicloud-nas

      参数

      说明

      name

      PVC的名称。

      metadata.annotations.csi.alibabacloud.com/mountpoint

      挂载点地址,用于关联之前创建的NAS文件系统。

      重要

      如果填写的是****.nas.aliyuncs.com,则表示共享的目录为NAS的根目录(/);如果填写的是****.nas.aliyuncs.com:/dir,则表示共享的目录为NAS的/dir目录,如果/dir目录,不存在则会自动新建。

      accessModes

      配置访问模式。

      storage

      声明应用使用量,不能大于存储卷的总量。

    2. 执行以下命令创建静态PVC。

      kubectl create -f pvc-nas.yaml
  4. 创建名为nas-static的应用,并挂载PVC。

    1. 以下为创建nas-static应用的nas.yaml示例文件。

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nas-static
        labels:
          app: nginx
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: nginx
              ports:
              - containerPort: 80
              volumeMounts:
                - name: pvc-nas
                  mountPath: "/data"
            volumes:
              - name: pvc-nas
                persistentVolumeClaim:
                  claimName: pvc-nas

      参数

      说明

      mountPath

      NAS在容器中挂载的位置。

      claimName

      PVC的名称,用于绑定PVC。

    2. 执行以下命令创建名为nas-static的应用,并挂载PVC。

      kubectl create -f nas.yaml
  5. 执行以下命令,查看Pod信息。

    kubectl get pod

    预期输出:

    NAME                          READY   STATUS    RESTARTS   AGE
    nas-static-785b747ddf-q****   1/1     Running   0          32s
    nas-static-785b747ddf-z****   1/1     Running   0          32s

验证NAS的持久化存储

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

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

      kubectl get pod 

      预期输出:

      NAME                          READY   STATUS    RESTARTS   AGE
      nas-static-785b747ddf-q****   1/1     Running   0          32s
      nas-static-785b747ddf-z****   1/1     Running   0          32s
    2. 执行以下命令,查看任意一个应用的/data路径下的文件,本文以名为nas-static-785b747ddf-q****的Pod为例。

      kubectl exec nas-static-785b747ddf-q**** -- ls /data

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

  2. 执行以下命令,在名为nas-static-785b747ddf-q****Pod的/data路径下创建文件nas

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

    kubectl exec nas-static-785b747ddf-q**** -- ls /data

    预期输出:

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

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

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

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

      kubectl get pod

      预期输出:

      NAME                          READY   STATUS    RESTARTS   AGE
      nas-static-785b747ddf-6****   1/1     Running   0          25s
      nas-static-785b747ddf-z****   1/1     Running   0          2m
    2. 执行以下命令,查看名为nas-static-785b747ddf-6****的Pod /data路径下的文件。

      kubectl exec nas-static-785b747ddf-6**** -- ls /data

      预期输出:

      nas

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

验证NAS的共享存储

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

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

      kubectl get pod 

      预期输出:

      NAME                          READY   STATUS    RESTARTS   AGE
      nas-static-785b747ddf-6****   1/1     Running   0          25s
      nas-static-785b747ddf-z****   1/1     Running   0          2m
    2. 执行以下命令,查看2个Pod /data路径下的文件。

      kubectl exec nas-static-785b747ddf-6**** -- ls /data
      kubectl exec nas-static-785b747ddf-z**** -- ls /data
  2. 执行以下命令,在任意一个Pod的/data路径下创建文件nas

     kubectl exec nas-static-785b747ddf-6**** -- touch /data/nas
  3. 执行以下命令,查看2个Pod /data路径下的文件。

    1. 执行以下命令,查看名为nas-static-785b747ddf-6****的Pod /data路径下的文件。

      kubectl exec nas-static-785b747ddf-6**** -- ls /data

      预期输出:

      nas
    2. 执行以下命令,查看名为nas-static-785b747ddf-z****的Pod /data路径下的文件。

      kubectl exec nas-static-785b747ddf-z**** -- ls /data

      预期输出:

      nas

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