使用NAS静态存储卷

NAS存储卷是一种可共享访问、弹性扩展、高可靠以及高性能的分布式文件系统,适用于大数据分析、共享数据、Web应用以及保存日志等场景。通过CSI组件可以使用已有的NAS创建PVPVC,并在工作负载中挂载,实现数据的持久化存储和共享存储。

  • 静态存储卷:需预先创建PV(如NAS文件系统)来代表已有的存储资源。应用通过创建PVC来“匹配”并申请使用此PV。常用于纳管存量存储资源。但其绑定的PVC默认不支持在线扩容。

  • 动态存储卷:无需预先创建PV。应用创建PVC时,系统会根据PVC指定的StorageClass,按需自动创建一个全新的存储卷及与之对应的PV。此模式更灵活,且支持存储卷扩容。

前提条件

  • 确认已有NAS满足以下条件,否则请重新创建文件系统或者使用NAS存储卷

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

    • 挂载点和集群节点在同一VPC内,且状态可用。如需添加挂载点,请参见管理挂载点

      NAS文件系统只能挂载到相同VPCPod上,不支持跨VPC挂载。同一VPC下,NAS可以跨可用区挂载。

    说明

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

注意事项

挂载NAS静态存储卷(kubectl)

步骤一:创建PV

  1. 获取集群kubeconfig并通过kubectl工具连接集群

  2. 修改以下YAML内容,并保存为pv-nas.yaml。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-nas
      labels:
        alicloud-pvname: pv-nas
    spec:
      capacity:
        storage: 5Gi
      accessModes:
        - ReadWriteMany
      csi:
        driver: nasplugin.csi.alibabacloud.com
        volumeHandle: pv-nas   # 必须与PV Name保持一致。
        volumeAttributes:
          server: "0c47****-mpk25.cn-shenzhen.nas.aliyuncs.com"  # NAS挂载点地址。挂载点所属VPC必须与集群所属VPC一致。
          path: "/csi"  # 挂载子目录。
      mountOptions:
      - nolock,tcp,noresvport
      - vers=3

    参数

    说明

    name

    PV的名称。

    labels

    设置PV的标签。

    storage

    PV的容量。

    重要

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

    accessModes

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

    driver

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

    volumeHandle

    配置PV的唯一标识符,必须与PV Name保持一致。若需要同时使用多个PV,则各个PV中该值须唯一。

    server

    NAS挂载点地址。挂载点所属VPC必须与集群所属VPC一致。

    关于如何查看挂载点地址,请参见管理挂载点

    path

    要挂载的NAS子目录。

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

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

    说明

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

    mountOptions

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

  3. 创建PV。

    kubectl create -f pv-nas.yaml
  4. 查看PV。

    kubectl get pv

    预期返回:

    NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM    STORAGECLASS     VOLUMEATTRIBUTESCLASS   REASON   AGE
    pv-nas   5Gi        RWX            Retain           Available                             <unset>                          25s

步骤二:创建PVC

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

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc-nas
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
      selector:
        matchLabels:
          alicloud-pvname: pv-nas

    参数

    说明

    name

    PVC名称。

    accessModes

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

    storage

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

    重要

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

    matchLabels

    输入PV的标签,用于关联PV。

  2. 创建PVC。

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

    kubectl get pvc

    预期返回如下,可以看到PVC已关联PV。

    NAME       STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
    pvc-nas    Bound    pv-nas    5Gi        RWX                           <unset>                 5s

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

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

    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: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80
            volumeMounts:
              - name: pvc-nas
                mountPath: "/data"
          volumes:
            - name: pvc-nas
              persistentVolumeClaim:
                claimName: pvc-nas

    参数

    说明

    mountPath

    NAS在容器中挂载的位置。

    claimName

    PVC的名称,用于绑定PVC。

  2. 创建Deployment并挂载NAS。

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

    kubectl get pod -l app=nginx

    预期返回:

    NAME                  READY   STATUS    RESTARTS   AGE
    nas-test-****-***a    1/1     Running   0          32s
    nas-test-****-***b    1/1     Running   0          32s

验证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-*****cPod作为示例:

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

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

      test.txt

常见问题

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