NAS是阿里云提供的一种可共享访问、弹性扩展、高可靠以及高性能的分布式文件系统。部署阿里云CSI插件后,您可以在自建的Kubernetes集群使用阿里云NAS作为Volume。挂载NAS时,支持静态数据卷和动态数据卷,本文为您介绍如何使用PVC方式,挂载NAS到ECI Pod上。

前提条件

  • 自建Kubernetes集群中已部署VNode。

  • 集群版本为1.16及以上版本,且已部署CSI-Provisioner组件。

    重要

    关于如何部署CSI-Provisioner组件,请参见alibaba-cloud-csi-driver。如果部署过程中出现问题,请在GitHub提交issue。

  • 如果您的Kubernetes集群部署在线下IDC,请确保已打通IDC与阿里云的网络。

注意事项

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

  • 在卸载NAS前,请勿删除NAS挂载点,否则可能会造成操作系统无响应。

静态挂载NAS

  1. 创建NAS文件系统和挂载点。

    1. 登录NAS控制台

    2. 创建NAS文件系统,并添加挂载点。

      NAS文件系统和挂载点必须与VNode处于同一VPC内。具体操作,请参见创建文件系统管理挂载点

  2. 创建PV。

    1. 参考参数说明表修改以下YAML内容,并保存为static-nas-pv.yaml。

      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: static-nas-pv
        labels:
          alicloud-pvname: static-nas-pv
      spec:
        capacity:
          storage: 25Gi
        accessModes:
          - ReadWriteMany
        csi:
          driver: nasplugin.csi.alibabacloud.com
          volumeHandle: static-nas-pv
          volumeAttributes:
            server: "2564f4****-ysu87.cn-beijing.nas.aliyuncs.com"
            path: "/test"
        mountOptions:
        - nolock,tcp,noresvport
        - vers=3

      相关参数说明如下表所示:

      参数

      描述

      driver

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

      volumeHandle

      PV的唯一标识符,与metedata中定义的name保持一致。

      server

      NAS的挂载点地址。

      path

      挂载子目录。极速型NAS需要以/share为父目录,例如/share/path1

      vers

      挂载NAS的NFS协议版本号。推荐使用v3,极速型NAS仅支持v3。

    2. 执行以下命令创建PV。

      kubectl create -f static-nas-pv.yaml
  3. 创建PVC。

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

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: static-nas-pvc
      spec:
        accessModes:
        - ReadWriteMany
        resources:
          requests:
            storage: 25Gi
        selector:
          matchLabels:
            alicloud-pvname: static-nas-pv 
    2. 执行以下命令创建PVC。

      kubectl create -f static-nas-pvc.yaml
  4. 将NAS挂载到ECI Pod。

    1. 将以下内容保存为static-nas-test.yaml。

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: static-nas-test
        labels:
          app: nginx
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            nodeSelector:    
              k8s.aliyun.com/vnode: "true"
            tolerations:     
            - key: k8s.aliyun.com/vnode
              operator: "Equal"
              value: "true"
              effect: "NoSchedule"
            containers:
            - name: nginx
              image: registry-vpc.cn-beijing.aliyuncs.com/eci_open/nginx:1.14.2
              ports:
              - containerPort: 80
              volumeMounts:
                - name: pvc-nas
                  mountPath: /data
            volumes:
              - name: pvc-nas
                persistentVolumeClaim:
                  claimName: static-nas-pvc
    2. 执行以下命令创建Deployment。

      kubectl create -f static-nas-test.yaml
    3. 查看结果。

      kubectl get pods -o wide

      预期返回:

      NAME                              READY   STATUS    RESTARTS   AGE   IP            NODE                                  NOMINATED NODE   READINESS GATES
      
      static-nas-test-5c4b6d4bd-4kggt   1/1     Running   0          95s   172.16.XX.XX   cn-beijing.vnd-2ze8nd8xcl33t4pa****   <none>           <none>
      static-nas-test-5c4b6d4bd-ql6m4   1/1     Running   0          95s   172.16.XX.XX   cn-beijing.vnd-2ze8nd8xcl33t4pa****   <none>           <none>

      查看Pod中的文件目录,可以看到已生成NAS对应的挂载目录/data,且第一个Pod中写入的文件可以在第二个Pod中查看,即两个Pod共享使用NAS存储。

      csi静态nas

动态挂载NAS

  1. 创建NAS文件系统和挂载点。

    1. 登录NAS控制台

    2. 创建NAS文件系统,并添加挂载点。

      NAS文件系统和挂载点必须与VNode处于同一VPC内。具体操作,请参见创建文件系统管理挂载点

  2. 创建StorageClass。

    1. 参考参数说明表修改以下YAML内容,并保存为nas-sc.yaml。

      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        name: alicloud-nas-subpath
      mountOptions:
      - nolock,tcp,noresvport
      - vers=3
      parameters:
        volumeAs: subpath
        server: "0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/k8s/"
      provisioner: nasplugin.csi.alibabacloud.com
      reclaimPolicy: Retain

      参数

      描述

      mountOptions

      配置NAS的options参数,包括NFS协议版本等。

      volumeAs

      PV类型。取值为subpath时,表示为子目录。CSI-Provisioner将自动创建NAS文件系统子目录。

      server

      创建子目录类型的PV时,NAS的挂载点地址。

      provisioner

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

      reclaimPolicy

      PV的回收策略,默认为Delete,支持Retain。

      • Delete:删除PVC时,PV和NAS文件系统会一起删除。

      • Retain:删除PVC时,PV和NAS文件系统不会被删除,需要您手动删除。

      如果数据安全性要求高,推荐使用Retain方式以免误删数据。

    2. 执行以下命令创建StorageClass。

      kubectl create -f nas-sc.yaml
  3. 创建NAS类型的PVC。

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

      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: nas-pvc
      spec:
        accessModes:
        - ReadWriteMany
        storageClassName: alicloud-nas-subpath
        resources:
          requests:
            storage: 25Gi
    2. 执行以下命令创建PVC。

      kubectl create -f nas-pvc.yaml
  4. 将NAS挂载到ECI实例。

    1. 将以下内容保存为nas-test.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:
            nodeSelector:    
              k8s.aliyun.com/vnode: "true"
            tolerations:     
            - key: k8s.aliyun.com/vnode
              operator: "Equal"
              value: "true"
              effect: "NoSchedule"
            containers:
            - name: nginx
              image: registry-vpc.cn-beijing.aliyuncs.com/eci_open/nginx:1.14.2
              volumeMounts:
                - name: pvc-nas
                  mountPath: /data
            volumes:
              - name: pvc-nas
                persistentVolumeClaim:
                  claimName: nas-pvc
    2. 执行以下命令创建Deployment。

      kubectl create -f nas-test.yaml
    3. 查看结果。

      kubectl get pods -o wide

      预期返回:

      NAME                              READY   STATUS    RESTARTS   AGE     IP             NODE                                  NOMINATED NODE   READINESS GATES
      nas-test-76c54d4b4-f7b88          1/1     Running   0          4m41s   172.16.XX.XX   cn-beijing.vnd-2ze8nd8xcl33t4pa****   <none>           <none>
      nas-test-76c54d4b4-lqz4b          1/1     Running   0          4m41s   172.16.XX.XX   cn-beijing.vnd-2ze8nd8xcl33t4pa****   <none>           <none>

      查看Pod中的文件目录,可以看到已生成NAS对应的挂载目录/data,且第一个Pod中写入的文件可以在第二个Pod中查看,即两个Pod共享使用NAS存储。

      csi动态nas