k8s通过NFS使用阿里云NAS动态存储卷

通过NFS使用NAS动态存储卷

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

  • 参考文档:https://help.aliyun.com/document_detail/477383.html#section-0ee-mcw-3q2

当您的多个Kubernetes应用或者Pod需要挂载相同的NAS存储卷共享数据时,或不同的Pod挂载相同NAS文件系统的不同子目录时, 可以使用subpath类型的NAS动态存储卷方式。

NAS动态存储卷的挂载方式为subpath类型时,您需要手动创建NAS文件系统和挂载点。

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

    1. 登录NAS控制台
    2. 创建NAS文件系统。请参见创建文件系统
    3. 添加挂载点。请参见管理挂载点
  2. 创建StorageClass。

    1. 创建并复制以下内容到alicloud-nas-subpath.yaml文件中。

      • 挂载参数参考:https://help.aliyun.com/document_detail/90529.html

      • 推荐您通过NFS v3协议挂载文件系统,以获得最佳访问性能。

      • NFS v4.0支持文件锁(包括range lock),如果您需要使用多台Linux ECS实例同时修改一个文件,请使用NFS v4.0协议挂载文件系统。

      • 文件系统版本。

        • vers=3:使用NFS v3协议挂载文件系统。

        • vers=4

          :使用NFS v4协议挂载文件系统。

          其中,minorversion为协议次版本号,NAS支持的NFS v4协议版本为4.0,因此使用NFS v4协议挂载文件系统时,次版本号为0。

        说明

        • 容量型或性能型NAS:支持NFS v3和NFS v4.0。
        • 极速型NAS:只支持NFS v3,不支持NFS v4。
      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参数在mountOptions中配置,包括NFS协议版本。
      volumeAs可选subpathfilesystem,分别表示创建子目录类型的PV和文件系统类型PV。
      server表示创建子目录类型的PV时,NAS文件系统的挂载点地址。
      provisioner驱动类型。本例中取值为nasplugin.csi.alibabacloud.com,表示使用阿里云NAS CSI插件。
      reclaimPolicyPV的回收策略,默认为Delete,支持Retain。Delete模式:需配合archiveOnDelete一起使用。当archiveOnDeletetrue,删除PVC时,PV和NAS文件只是被重命名,不会被删除。当archiveOnDeletefalse,删除PVC时,PV和NAS文件会被真正删除。Retain模式:删除PVC的时候,PV和NAS文件系统不会被删除,需要您手动删除。如果数据安全性要求高,推荐使用Retain方式以免误删数据。
      archiveOnDelete表示在reclaimPolicyDelete时,是否删除后端存储。因为NAS为共享存储,添加此选项进行双重确认。在参数parameters下配置。默认为true,表示不会真正删除目录或文件,而是将其Rename,格式为:archived-{pvName}.{timestamp};如果是配置为false,表示会真正删除后端对应的存储资源。说明 在业务流量非常大时,不适合配置为false。更多信息,请参见使用NAS动态存储卷时Controller的任务队列已满且无法创建新的PV
    2. 执行以下命令创建StorageClass。

      kubectl create -f alicloud-nas-subpath.yaml
      
  3. 执行以下命令创建PVC。

    1. 创建并复制以下内容到pvc.yaml文件中。

      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata: 
        name: nas-csi-pvc
      spec:
        accessModes:
        - ReadWriteMany 
        storageClassName: alicloud-nas-subpath
        resources: 
          requests:
            storage: 20Gi
      
      参数说明
      namePVC的名称。
      accessModes配置访问模式。
      storageClassNameStorageClass的名称,用于绑定StorageClass。
      storage声明应用存储使用量。
    2. 执行以下命令创建PVC。

      kubectl create -f pvc.yaml
      
  4. 执行以下命令创建应用。

    创建应用nginx-1nginx-2共享NAS存储卷的同一个子目录。

    1. 创建并复制以下内容到nginx-1.yaml文件中。

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: deployment-nas-1
        labels:
          app: nginx-1
      spec:
        selector:
          matchLabels:
            app: nginx-1
        template:
          metadata:
            labels:
              app: nginx-1
          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-csi-pvc
      
      • mountPath:NAS在容器中挂载的位置。
      • claimName:PVC的名称,用于绑定PVC。本例中为nas-csi-pvc
    2. 创建并复制以下内容到nginx-2.yaml文件中。

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: deployment-nas-2
        labels:
          app: nginx-2
      spec:
        selector:
          matchLabels:
            app: nginx-2
        template:
          metadata:
            labels:
              app: nginx-2
          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-csi-pvc
      
      • mountPath:NAS在容器中挂载的位置。本例为/data。
      • claimName:输入与nginx-1应用相同的PVC名称,本例为nas-csi-pvc
    3. 执行以下命令创建应用nginx-1nginx-2

      kubectl create -f nginx-1.yaml -f nginx-2.yaml
      
  5. 执行以下命令查看Pod信息。

    kubectl get pod
    

    预期输出:

    NAME                                READY   STATUS    RESTARTS   AGE
    deployment-nas-1-5b5cdb85f6-n****   1/1     Running   0          32s
    deployment-nas-2-c5bb4746c-4****    1/1     Running   0          32s
    123
    

    说明 NAS存储卷的0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/share/nas-79438493-f3e0-11e9-bbe5-00163e09****会同时挂载到deployment-nas-1-5b5cdb85f6-n****deployment-nas-2-c5bb4746c-4****的/data目录下。其中:

    • /share:StorageClass中指定的subpath。
    • nas-79438493-f3e0-11e9-bbe5-00163e09****:PV的名称。

    如果您需要为不同的Pod挂载同一个NAS文件系统的不同子目录, 则需要分别创建pvc-1nginx-1以及pvc-2nginx-2

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

  • 文档:https://help.aliyun.com/document_detail/204013.html#section-jgf-w0l-0hh
  1. 执行以下命令创建静态PV。

    kubectl create -f pv-nas.yaml
    

    以下为创建静态卷PV的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
        volumeAttributes:
          server: "2564f4****-ysu87.cn-shenzhen.nas.aliyuncs.com"
          path: "/csi"
      mountOptions:
      - nolock,tcp,noresvport
      - vers=3
    1234567891011121314151617181920
    
    参数说明
    namePV的名称。
    labels设置PV的标签。
    storageNAS的可使用量。
    accessModes配置访问模式。
    driver驱动类型。本例中取值为nasplugin.csi.alibabacloud.com,表示使用阿里云NAS CSI插件。
    volumeHandle配置PV的唯一标识符。若需要同时使用多个PV,则各个PV中该值必须不一致。
    serverNAS挂载点。
    path挂载子目录,极速NAS需要以/share为父目录。
    vers挂载NAS数据卷的NFS协议版本号,推荐使用v3,极速类型NAS只支持v3。
  2. 执行以下命令创建静态PVC。

    创建NAS存储声明PVC,使用selector筛选PV,精确配置PVC和PV的绑定关系。

    kubectl create -f pvc-nas.yaml
    

    以下为创建静态卷PVC的YAML示例文件。

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc-nas
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
      selector:
        matchLabels:
          alicloud-pvname: pv-nas
    
    参数说明
    namePVC的名称。
    accessModes配置访问模式。
    storage声明应用使用量,不能大于存储卷的总量。
    matchLabels输入PV的标签,用于关联PV。
  3. 执行以下命令创建名为nas-static的应用,并挂载PVC。

    kubectl create -f nas.yaml
    

    以下为创建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
    
    参数说明
    mountPathNAS在容器中挂载的位置。
    claimNamePVC的名称,用于绑定PVC。
  4. 执行以下命令,查看Pod信息。

    kubectl get pod
    

    预期输出:

    NAME                          READY   STATUS    RESTARTS   AGE
    nas-static-5b5cdb85f6-n****   1/1     Running   0          32s
    nas-static-c5bb4746c-4****    1/1     Running   0          32s
    

三、验证NAS的持久化存储

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

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

      kubectl get pod 
      

      预期输出:

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

      kubectl exec nas-static-5b5cdb85f6-n**** ls /data
      

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

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

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

    kubectl exec nas-static-5b5cdb85f6-n**** ls /data
    

    预期输出:

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

    kubectl delete pod nas-static-5b5cdb85f6-n****
    
  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-static-5b5cdb85f6-n****   1/1     Running   0          32s
      nas-static-c5bb4746c-4****    1/1     Running   0          32s
      
    2. 执行以下命令,查看名为nas-static-5b5cdb85f6-n****的Pod /data路径下的文件。

      kubectl exec nas-static-5b5cdb85f6-n**** ls /data
      

      预期输出:

      nas
      

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

四、验证NAS的共享存储

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

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

      kubectl get pod 
      

      预期输出:

      NAME                          READY   STATUS    RESTARTS   AGE
      nas-static-5b5cdb85f6-n****   1/1     Running   0          32s
      nas-static-c5bb4746c-4****    1/1     Running   0          32s
      
    2. 执行以下命令,查看2个Pod /data路径下的文件。

      kubectl exec nas-static-5b5cdb85f6-n**** ls /data
      kubectl exec nas-static-c5bb4746c-4**** ls /data
      
  2. 执行以下命令,在任意一个Pod的/data路径下创建文件nas。

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

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

      kubectl exec nas-static-5b5cdb85f6-n**** ls /data
      

      预期输出:

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

      kubectl exec nas-static-c5bb4746c-4**** ls /data
      

      预期输出:

      nas
      

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值