全部产品
Search
文档中心

挂载NAS(PVC)

更新时间: 2022-05-19

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

前提条件

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

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

注意事项

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

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

静态挂载NAS

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

    1. 登录NAS控制台

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

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

  2. 创建PV。

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

      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: static-pv-nas
      spec:
        capacity:
          storage: 20Gi
        storageClassName: nas
        persistentVolumeReclaimPolicy: Recycle
        accessModes:
          - ReadWriteMany
        flexVolume:
          driver: "alicloud/nas"
          options:
            server: "1a93e496ef-****.cn-beijing.nas.aliyuncs.com"
            path: "/"
            vers: "3"

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

      参数

      描述

      driver

      驱动类型。此处配置为alicloud/nas,表示使用阿里云NAS FlexVolume插件。

      server

      NAS的挂载点地址。

      path

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

      vers

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

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

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

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

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

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

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

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: static-test-nas
        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-pvc-nas
    2. 执行以下命令创建Deployment。

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

      kubectl get pods -o wide

      预期返回:

      NAME                               READY   STATUS    RESTARTS   AGE     IP              NODE                                  NOMINATED NODE   READINESS GATES
      
      static-test-nas-79df5959d4-lvr4m   1/1     Running   0          26s     172.16.XX.XX    cn-beijing.vnd-2ze8nd8xcl33t4pa****   <none>           <none>
      static-test-nas-79df5959d4-xdbwz   1/1     Running   0          26s     172.16.XX.XX    cn-beijing.vnd-2ze8nd8xcl33t4pa****   <none>           <none>

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

      fv静态NAS

动态挂载NAS

部署NAS-Controller组件

采用动态挂载的方式挂载NAS时,需要先部署阿里云NAS-Controller组件,该组件自动创建NAS类型的PV。

注意

NAS-Controller组件必须部署在普通节点上,不支持部署在虚拟节点上。

  1. 创建用于部署NAS-Controller的YAML文件。

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

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: alicloud-nas-controller
      namespace: kube-system
    ---
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: alicloud-nas-controller
    rules:
      - apiGroups: [""]
        resources: ["persistentvolumes"]
        verbs: ["get", "list", "watch", "create", "delete"]
      - apiGroups: [""]
        resources: ["persistentvolumeclaims"]
        verbs: ["get", "list", "watch", "update"]
      - apiGroups: ["storage.k8s.io"]
        resources: ["storageclasses"]
        verbs: ["get", "list", "watch"]
      - apiGroups: [""]
        resources: ["events"]
        verbs: ["list", "watch", "create", "update", "patch"]
      - apiGroups: [""]
        resources: ["endpoints"]
        verbs: ["get", "watch", "list", "delete", "update", "create"]
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: alicloud-nas-controller
    subjects:
      - kind: ServiceAccount
        name: alicloud-nas-controller
        namespace: kube-system
    roleRef:
      kind: ClusterRole
      name: alicloud-nas-controller
      apiGroup: rbac.authorization.k8s.io
    ---
    kind: Deployment
    apiVersion: apps/v1
    metadata:
      name: alicloud-nas-controller
      namespace: kube-system
    spec:
      selector:
        matchLabels:
          app: alicloud-nas-controller
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: alicloud-nas-controller
        spec:
          tolerations:
          - operator: Exists
          affinity:
            nodeAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 1
                preference:
                  matchExpressions:
                  - key: node-role.kubernetes.io/master
                    operator: Exists
              requiredDuringSchedulingIgnoredDuringExecution:
                 nodeSelectorTerms:
                 - matchExpressions:
                   - key: type
                     operator: NotIn
                     values:
                     - virtual-kubelet
          priorityClassName: system-node-critical
          serviceAccount: alicloud-nas-controller
          hostNetwork: true
          containers:
            - name: nfs-provisioner
              image: registry.cn-hangzhou.aliyuncs.com/acs/alicloud-nas-controller:v1.14.8.17-7b898e5-aliyun
              env:
              - name: PROVISIONER_NAME
                value: alicloud/nas
              securityContext:
                privileged: true
              volumeMounts:
              - mountPath: /var/log
                name: log
          volumes:
          - hostPath:
              path: /var/log
            name: log
  2. 部署组件。

    kubectl create -f nas-controller.yaml
  3. 查看部署结果。

    kubectl -n kube-system get pods

    预期返回如下:

    NAME                                        READY   STATUS           RESTARTS   AGE
    alicloud-nas-controller-6dccf695d5-zxkwg    1/1     Running          0          3m7s

挂载NAS

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

    1. 登录NAS控制台

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

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

  2. 创建StorageClass。

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

      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        name: alicloud-nas-test
      mountOptions:
      - nolock,tcp,noresvport
      - vers=3
      parameters:
        volumeAs: subpath
        server: "1e9064****-gk***.cn-beijing.nas.aliyuncs.com"
      provisioner: alicloud/nas
      reclaimPolicy: Retain

      相关参数说明如下:

      参数

      描述

      mountOptions

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

      volumeAs

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

      server

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

      provisioner

      驱动类型。此处配置为alicloud/nas,表示使用阿里云NAS FlexVolume插件。

      reclaimPolicy

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

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

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

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

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

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

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

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

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

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

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: test-nas
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: uid
        template:
          metadata:
            labels:
              app: uid
          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:
              - mountPath: /data
                name: data
            volumes:
            - name: data
              persistentVolumeClaim:
                claimName: pvc-nas
    2. 执行以下命令创建Deployment。

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

      kubectl get pods -o wide

      预期返回:

      NAME                               READY   STATUS    RESTARTS   AGE     IP              NODE                                  NOMINATED NODE   READINESS GATES
      
      test-nas-7cf4d9f796-4h2kj          1/1     Running   0          50s     172.16.XX.XX    cn-beijing.vnd-2ze8nd8xcl33t4pa****   <none>           <none>
      test-nas-7cf4d9f796-dv5q2          1/1     Running   0          50s     172.16.XX.XX    cn-beijing.vnd-2ze8nd8xcl33t4pa****   <none>           <none>
      

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

      fv动态NAS