使用NAS动态存储卷

更新时间: 2023-10-27 17:22:55

阿里云Kubernetes CSI支持挂载filesystem类型NAS动态存储卷。本文介绍如何使用阿里云NAS动态存储卷,及如何验证NAS存储卷的持久化存储与共享存储特性。

前提条件

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

  • 已开通NAS并创建NAS文件系统。请参见创建文件系统

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

  • 已创建NAS挂载点。请参见管理挂载点

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

使用场景

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

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

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

注意事项

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

    说明

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

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

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

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

步骤一:创建PVC

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

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

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

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

  5. 创建存储声明对话框中,配置参数。

    配置项

    说明

    存储声明类型

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

    名称

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

    分配模式

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

    已有存储类

    单击选择存储类,在选择存储类对话框目标存储类右侧操作列单击选择

    专有网络

    表示创建通用型NAS文件系统所使用的专有网络,和当前ACS集群的专有网络保持一致。

    虚拟交换机

    表示创建通用型NAS文件系统所使用的虚拟交换机,从下拉菜单任意选择一项即可。

    总量

    固定为10Pi,表示通用型NAS文件系统的最大容量。

    访问模式

    默认为ReadWriteOnce,也可选择ReadWriteMany

  6. 单击创建

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

步骤二:创建应用

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

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

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

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

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

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

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

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

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

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

通过kubectl命令行方式使用filesystem类型的NAS动态存储卷

重要

filesystem类型的NAS动态卷在删除时默认保留文件系统和挂载点, 暂不支持在释放PV资源的同时释放NAS文件系统和挂载点。

当您的Kubernetes应用需要动态创建和删除NAS文件系统和挂载点时, 可以使用filesystem类型。

使用filesystem类型NAS存储卷的Pod只能创建一个文件系统和一个挂载点, 多个Pod之间无法共享一个存储卷。操作步骤如下。

  1. 创建并复制以下内容到pvc.yaml文件中。其中csi.alibabacloud.com/vpc-id的值应与ACS集群的专有网络ID保持一致,并从该专有网络中选取一个虚拟交换机ID作为csi.alibabacloud.com/vswitch-id的值。

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: nas-pvc-fs
      annotations:
        csi.alibabacloud.com/vpc-id: vpc-****
        csi.alibabacloud.com/vswitch-id: vsw-****
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: alicloud-nas
      resources:
        requests:
          storage: 20Gi
  1. 创建并复制以下内容到nginx.yaml文件中。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nas-fs
      labels:
        app: nginx
    spec:
      replicas: 2
      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-pvc-fs
  1. 执行以下命令创建PVC和Pod,挂载NAS存储卷。

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

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

验证NAS的持久化存储

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

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

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

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

      kubectl get pod 

      预期输出:

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

      kubectl exec nas-76b8f6df86-5**** -- ls /data

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

  2. 执行以下命令,在名为nas-76b8f6df86-5****的Pod/data路径下创建文件nas

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

    kubectl exec nas-76b8f6df86-5**** -- ls /data

    预期输出:

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

    kubectl delete pod nas-76b8f6df86-5****
  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
      nas-76b8f6df86-g****    1/1     Running   0          25s
      nas-76b8f6df86-l****    1/1     Running   0          2m
    2. 执行以下命令,查看名为nas-76b8f6df86-g****的Pod/data路径下的文件。

      kubectl exec nas-76b8f6df86-g**** -- ls /data

      预期输出:

      nas

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

验证NAS存储卷的共享存储

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

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

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

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

      kubectl get pod 

      预期输出:

      NAME                    READY   STATUS    RESTARTS   AGE
      nas-76b8f6df86-g****    1/1     Running   0          25s
      nas-76b8f6df86-l****    1/1     Running   0          2m
    2. 执行以下命令,查看2个Pod/data路径下的文件。

      kubectl exec nas-76b8f6df86-g**** -- ls /data
      kubectl exec nas-76b8f6df86-l**** -- ls /data
  2. 执行以下命令,在任意一个Pod的/data路径下创建文件nas

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

    1. 执行以下命令,查看名为nas-76b8f6df86-g****的Pod/data路径下的文件。

      kubectl exec nas-76b8f6df86-g**** -- ls /data

      预期输出:

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

      kubectl exec nas-76b8f6df86-l**** -- ls /data

      预期输出:

      nas

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