使用NAS静态存储卷

更新时间:
复制为 MD 格式

NAS存储卷提供数据持久化(Pod重建后数据不丢失)和数据共享(多Pod同时读写)能力。ACK支持将已有的NAS文件系统,以静态存储卷的方式挂载给工作负载使用。

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

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

流程指引

ACK集群中挂载NAS静态存储卷主要流程如下。

image
  1. 创建PV:在集群中“注册”已有的NAS文件系统,声明其挂载地址(根目录或特定子目录)、容量、访问模式等。

  2. 创建PVC:应用通过PVC来“申请”使用已注册的存储资源。PVC会与符合条件的PV自动绑定。

  3. 在应用中挂载:将已绑定的PVC挂载到应用Pod中,作为容器内的一个持久化目录。

准备工作

  • 已安装csi-plugin组件和csi-provisioner组件。

    CSI组件默认安装,请确保未手动卸载。可在组件管理页面查看安装情况。建议升级CSI组件至最新版本。
  • 已创建NAS文件系统,且满足以下条件。否则请重新创建文件系统或者使用NAS动态存储卷

    NAS在挂载连通性、文件系统数量、协议类型等方面存在使用限制
    • 协议类型:仅支持NFS。

    • 专有网络VPC:NAS文件系统需与集群VPC保持一致。NAS支持跨可用区挂载,不支持跨VPC挂载。

    • 挂载点:添加与集群处于同一VPC内且状态可用的挂载点,具体操作请参见管理挂载点。请记录挂载点地址。

    • (可选)加密类型:如需加密存储卷数据,请在创建NAS文件系统时配置加密类型。

注意事项

  • 禁止删除挂载点:存储卷使用期间,请勿在NAS控制台删除其对应的挂载点,以免导致节点I/O异常。

  • 并发写入:NAS为共享存储。当多个Pod同时挂载一个存储卷时,应用自身需要处理并发写入可能带来的数据一致性问题。

    关于NAS并发写入的一些限制条件,请参见如何避免多进程或多客户端并发写同一日志文件可能出现的异常?读写访问文件类问题
  • 挂载性能:若在应用中配置了securityContext.fsgroup,kubelet会在挂载后递归执行chmodchown操作,可能导致Pod启动时间显著延长。

    如需优化,请参见NAS存储卷FAQ

步骤一:创建PV

创建PV,在集群中“注册”已有的NAS文件系统。

kubectl

  1. 参见以下内容创建pv-nas.yaml文件。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      # PV名称,需在集群内保持唯一
      name: pv-nas  
      # PV标签,用于后续匹配PVC
      labels:  
        alicloud-pvname: pv-nas
    spec:
      capacity:
        # 容量声明仅作标识,实际容量由NAS文件系统决定
        storage: 5Gi  
      accessModes:
        - ReadWriteMany
      # PV回收策略
      persistentVolumeReclaimPolicy: Retain
      csi:
        # 驱动类型,使用NAS存储卷时固定为此值
        driver: nasplugin.csi.alibabacloud.com  
        # 需与 metadata.name 保持一致
        volumeHandle: pv-nas   
        volumeAttributes:
          server: "0c47****-mpk25.cn-shenzhen.nas.aliyuncs.com"  # 替换为NAS挂载点地址
          # 待挂载的NAS子目录,若不存在会自动创建
          path: "/csi"
      mountOptions:
      - nolock,tcp,noresvport
      - vers=3

    参数

    说明

    storage

    PV容量声明。此声明仅为PVC匹配依据,不限制实际可用容量。应用实际可用存储上限为NAS文件系统总容量。

    NAS实际容量上限由其规格决定,请参见通用型NAS极速型NAS

    accessModes

    配置访问模式。可取值:

    • ReadWriteMany(默认):多节点读写。

    • ReadWriteOnce:单节点读写。

    • ReadOnlyMany:多节点只读。

    persistentVolumeReclaimPolicy

    PV的回收策略,即PVC被删除后如何处理对应的PV及后端NAS数据。

    • Retain(推荐):删除PVC后,PV进入Released状态,后端NAS数据被完整保留,需手动删除。

    • Delete:删除PVC后,PV也会被删除。需配合archiveOnDelete一起使用。静态PV不支持archiveOnDelete,即使配置为Delete,删除PVC时也不会真正删除PVNAS文件。

      如需配置archiveOnDelete,请参见使用NAS动态存储卷

    driver

    驱动类型。使用阿里云NAS CSI组件时固定为nasplugin.csi.alibabacloud.com

    volumeHandle

    PV在后端存储系统中的唯一标识符,需与PV Name(即metadata.name)保持一致。如需同时使用多个PV,则各个PV中该值须唯一。

    server

    NAS挂载点地址。

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

    path

    待挂载的NAS子目录。如果未设置,则默认挂载到根目录。

    如果NAS中没有该目录,系统会自动创建并进行挂载。
    • 通用型NAS:根目录为/

    • 极速型NAS:根目录为/share。挂载子目录时,path需以/share开头(如/share/data)。

    mountOptions

    NAS的挂载参数,包括NFS协议版本等。默认使用v3协议挂载,可通过vers=4.0方式指定协议版本。关于不同NAS类型支持的NFS协议,请参见NFS协议

  2. 创建PV。

    kubectl create -f pv-nas.yaml
  3. 查看PV状态和属性。

    kubectl get pv

    预期输出:

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

    预期输出表明,PV 已成功创建,容量为 5Gi,当前处于Available状态,即未被任何应用通过 PVC 占用。

控制台

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

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择存储 > 存储卷

  3. 存储卷页面,单击创建,在弹出的对话框完成参数配置,然后单击创建

    配置项

    说明

    存储卷类型

    选择NAS

    名称

    PV名称,在集群内保持唯一。

    总量

    PV容量声明。此声明仅为PVC匹配依据,不限制实际可用容量。应用实际可用存储上限为NAS文件系统总容量。

    NAS实际容量上限由其规格决定,请参见通用型NAS极速型NAS

    访问模式

    配置访问模式。可取值:

    • ReadWriteMany:多节点读写。

    • ReadWriteOnce:单节点读写。

    是否使用CNFS

    是否使用容器网络文件系统CNFS,利用其在自动化运维、缓存加速、性能监控等方面提供的增强能力。

    如需使用CNFS管理已有NAS,请参见创建CNFS管理NAS文件系统(推荐)

    挂载点域名

    未开启CNFS时可配置

    NAS挂载点地址。

    如需获取地址,请参见管理挂载点
    • 选择挂载点:选择此前添加的挂载点地址。

    • 自定义:使用自定义域名作为挂载地址。请确保已完成自定义域名到目标NAS挂载点的解析配置。

    高级选项(选填)

    挂载路径

    待挂载的NAS子目录。如果未设置,则默认挂载到根目录。

    如果NAS中没有该目录,系统会自动创建并进行挂载。
    • 通用型NAS:根目录为/

    • 极速型NAS:根目录为/share。挂载子目录时,path需以/share开头(如/share/data)。

    回收策略

    • Retain(默认):删除PVC时,PVNAS文件不会被删除,需手动删除。

    • 删除:删除PVC后,PV也会被删除。需配合archiveOnDelete一起使用。静态PV不支持archiveOnDelete,即使配置为Delete,删除PVC时也不会真正删除PVNAS文件。

      如需配置archiveOnDelete,请参见使用NAS动态存储卷

    挂载选项

    NAS的挂载参数,包括NFS协议版本等。默认使用v3协议挂载,可通过vers=4.0方式指定协议版本。关于不同NAS类型支持的NFS协议,请参见NFS协议

    标签

    PV的标签。

    创建完成后,可在存储卷页面查看新创建的PV。

步骤二:创建PVC

创建PVC,为应用声明其所需的持久化存储容量。

kubectl

  1. 创建pvc-nas.yaml文件,关联此前创建的PV。

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc-nas  # PVC名称,需在命名空间内保持唯一
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
      selector:
        matchLabels:
          alicloud-pvname: pv-nas   # 通过标签精确匹配此前创建的PV

    参数

    说明

    accessModes

    访问模式。可取值:

    • ReadWriteMany(默认):多节点读写。

    • ReadWriteOnce:单节点读写。

    • ReadOnlyMany:多节点只读。

    storage

    声明所需使用的存储卷的容量。此处声明的所需容量仅为 PV 匹配的依据,并非实际容量的限制。

    NAS实际容量上限由规格决定,请参见通用型NAS极速型NAS确认。

    matchLabels

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

  2. 创建PVC。

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

    kubectl get pvc

    预期输出:

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

    预期输出表明,PVC已成功分配5Gi的存储容量,绑定(Bound)到名为 pv-nas 的PV上,可被应用挂载和使用。

控制台

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

  2. 存储声明页面,单击创建,按页面提示完成PVC的配置和创建。

    配置项

    说明

    存储声明类型

    选择NAS

    名称

    PVC名称,需在命名空间内保持唯一。

    分配模式

    选择已有存储卷。

    本文使用此前创建的PV。若未创建PV,可选择分配模式创建存储卷

    已有存储卷

    选择此前创建的PV。

    总量

    声明所需使用的存储卷的容量。此处声明的所需容量仅为 PV 匹配的依据,并非实际容量的限制。

    NAS实际容量上限由规格决定,请参见通用型NAS极速型NAS确认。

    访问模式

    访问模式。可取值:

    • ReadWriteMany(默认):多节点读写。

    • ReadWriteOnce:单节点读写。

    • ReadOnlyMany:多节点只读。

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

PVC创建后,可将其绑定的 PV 挂载到应用中。

kubectl

  1. 参见以下内容创建deploy.yaml,引用此前创建的PVC。

    该应用会创建2Pod,挂载至同一NAS文件系统,以便后续验证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
                # NAS存储卷的挂载路径
                mountPath: "/data"  
          volumes:
            # 指定待使用的 PVC
            - name: pvc-nas  
              persistentVolumeClaim:
                claimName: pvc-nas
  2. 创建Deployment。

    kubectl create -f deploy.yaml
  3. 查看应用Pod部署情况。

    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

控制台

  1. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

  2. 无状态页面,单击使用镜像创建,按照页面提示完成应用的配置。

    主要参数如下,其他参数保持默认即可,详见创建无状态工作负载Deployment

    配置项

    参数

    说明

    应用基本信息

    应用名称

    Deployment名称。

    副本数量

    Deployment的副本数量。

    多个副本会挂载至同一NAS文件系统,以便后续验证NAS的共享存储。

    容器配置

    镜像名称

    应用镜像地址。

    所需资源

    所需的vCPU和内存资源。

    数据卷

    单击增加云存储声明(PersistentVolumeClaim),完成参数配置。

    • 挂载源:此前创建的PVC。

    • 容器路径:NAS文件系统需要挂载到的容器路径,如/data。

    部署后,可在无状态页面单击应用名称,在容器组页签下确认Pod已正常运行(状态为Running)。

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

成功部署应用后,可验证存储卷是否按预期工作。

共享存储

持久化存储

在一个Pod中创建文件,然后另一个Pod中查看,验证数据的共享存储。

  1. 查看Pod信息,获取Pod名称。

    kubectl get pod | grep nas-test

    预期输出:

    nas-test-*****a   1/1     Running   0          40s
    nas-test-*****b   1/1     Running   0          40s
  2. 在一个Pod中创建文件。

    以名为nas-test-*****aPod作为示例:

    kubectl exec nas-test-*****a -- touch /data/test.txt
  3. 在另一个Pod中查看文件是否存在。

    以名为nas-test-*****bPod为例。

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

    预期输出:

    test.txt

    可以查看到此前新建的文件,表明数据可在多Pod间共享。

重建Deployment,在新建Pod中查看文件系统中的数据是否存在,验证数据的持久化存储。

  1. 删除应用Pod以触发重建。

    kubectl rollout restart deploy nas-test
  2. 查看Pod,等待新Pod启动并进入Running状态。

    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

    预期输出:

    test.txt

    可以查看到此前写入的文件,表明数据可持久化存储。

适用于生产环境

  • 安全与权限管理

    • 使用权限组进行访问控制:NAS通过权限组来管理网络访问权限。请遵循最小权限原则,在权限组中仅添加集群节点的私网IP地址或其所属的vSwitch网段,避免授权范围过大(如 0.0.0.0/0)。

  • 性能与成本优化

    • 选择合适的NAS类型:参见文件系统选型,根据应用对IOPS和吞吐量的要求合理选择NAS类型。

    • 优化挂载选项 (mountOptions):根据工作负载特性调整NFS挂载参数。例如,使用vers=4.0vers=4.1协议版本可能在某些场景下获得更好的性能和文件锁定能力。对于大规模文件读写,可测试调整rsizewsize参数以优化读写性能。

  • 运维与可靠性

    • 配置健康检查:为应用Pod配置存活探针(Liveness Probe),检查挂载点是否正常。当挂载失效时,ACK可自动重启Pod,触发存储卷的重新挂载。

    • 监控与告警:利用容器存储监控配置告警,及时发现存储卷的异常或性能瓶颈。

    • 使用Retain回收策略:对于生产数据,将PVpersistentVolumeReclaimPolicy设置为Retain,防止因误删PVC而导致后端NAS文件系统中的数据被意外删除。

资源释放指引

为避免产生预期外费用,当您不再需要使用NAS存储卷时,请按照以下顺序释放相关资源。

  1. 删除工作负载

    • 操作:删除所有使用该NAS存储卷的应用(如Deployment、StatefulSet等)。此操作将停止应用Pod对存储卷的挂载和读写。

    • 命令示例:kubectl delete deployment <your-deployment-name>

  2. 删除PVC

    • 操作:删除应用所关联的PVC。删除后,其绑定PV的后续行为取决于该PVpersistentVolumeReclaimPolicy

    • 回收策略说明:

      • Retain(推荐):删除PVC后,其绑定的PV会进入Released(已释放)状态。PV对象和后端NAS数据都会被完整保留,需手动删除。

      • Delete:删除PVC后,对应的PV对象会被删除。请注意:

        • PV指向NAS根目录时,后端的NAS数据仍会保留,防止误删除。

        • 当一个静态PV的 volumeHandle 值是 path 值的后缀时(如volumeHandleapp,而path/exports/app),删除PVC将触发后端NAS子目录的自动删除。请务必谨慎使用。

    • 命令示例:kubectl delete pvc <your-pvc-name>

  3. 删除PV

    • 操作:当PV处于AvailableReleased状态时,可执行删除操作。此操作仅从Kubernetes集群中移除该PV的定义,不会删除后端NAS文件系统上的数据。

    • 命令示例:kubectl delete pv <your-pv-name>

  4. 删除后端NAS文件系统(可选)

    • 操作:请参见删除文件系统。此操作将永久删除该NAS上的所有数据,且无法恢复,请谨慎操作。执行前,请务必确认该NAS已无任何业务依赖。

相关文档