阿里云Kubernetes CSI支持2种类型的NAS动态存储卷挂载:subpath方式和filesystem方式。

前提条件

使用此方案,需要在集群中部署CSI驱动(Kubernetes集群默认已部署该驱动)。

如果您没有部署CSI-Plugin,请参见安装插件

subpath类型的NAS动态存储卷

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

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

  1. 创建NAS文件系统和挂载点。
    1. 登录NAS控制台
    2. 创建NAS文件系统。请参见管理文件系统
      创建文件系统
    3. 添加挂载点。请参见管理挂载点
      添加挂载点
  2. 创建StorageClass。
    1. 创建并拷贝以下内容到alicloud-nas-subpath.yaml文件中。
      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        name: alicloud-nas-subpath
      mountOptions:
      - nolock,tcp,noresvport
      - vers=3
      parameters:
        volumeAs: subpath
        server: "xxxxxxx.cn-hangzhou.nas.aliyuncs.com:/k8s/"
      provisioner: nasplugin.csi.alibabacloud.com
      reclaimPolicy: Retain
    2. 执行以下命令创建StorageClass。
      kubectl create -f alicloud-nas-subpath.yaml
  3. 创建PV/PVC和Pod挂载NAS存储卷。
    创建Pod nginx-1nginx-2共享NAS存储卷的同一个子目录,pvc.yamlnginx-1.yamlnginx-2.yaml文件内容如下。
    pvc.yaml
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: nas-csi-pvc
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: alicloud-nas-subpath
      resources:
        requests:
          storage: 20Gi
    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
    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
    执行以下命令,创建并查看PVC和Deployment。
    kubectl create -f pvc.yaml -f nginx-1.yaml -f nginx-2.yaml
    
    kubectl get po
    NAME                                READY   STATUS    RESTARTS   AGE
    deployment-nas-1-5b5cdb85f6-nhklx   1/1     Running   0          32s
    deployment-nas-2-c5bb4746c-4jw5l    1/1     Running   0          32s
    说明 NAS存储卷的xxxxxxx.cn-hangzhou.nas.aliyuncs.com:/share/nas-79438493-f3e0-11e9-bbe5-00163e09c2be会同时挂载到deployment-nas-1-5b5cdb85f6-nhklxdeployment-nas-2-c5bb4746c-4jw5l/data目录下。其中:
    • /share:StorageClass中指定的subpath。
    • nas-79438493-f3e0-11e9-bbe5-00163e09c2be:PV的名称。

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

filesystem类型的NAS动态存储卷

注意 filesystem类型的NAS动态卷在删除时默认保留文件系统和挂载点, 若需要在释放pv资源的同时释放NAS文件系统和挂载点, 则需要同时设置StorageClass中的reclaimPolicy为Delete且deleteVolume的值为true

当您的Kubernetes应用需要动态创建和删除NAS文件系统和挂载点时, 可以使用filesystem类型。

使用filesystem类型NAS存储卷的Pod只能创建一个文件系统和一个挂载点, 多个Pod之间无法共享一个存储卷。操作步骤如下。

  1. RAM Policy设置和授予。
    filesystem类型的NAS存储卷涉及NAS文件系统和挂载点的动态创建与删除, 需要授予csi-nasprovisioner相应的权限,RAM Policy的最小集合如下。
    {
        "Action": [
            "nas:DescribeMountTargets",
            "nas:CreateMountTarget",
            "nas:DeleteFileSystem",
            "nas:DeleteMountTarget",
            "nas:CreateFileSystem"
        ],
        "Resource": [
            "*"
        ],
            "Effect": "Allow"
    }

    您可以通过以下任意一种方式进行授权:

    • 编辑Kubernetes集群的Master RAM角色中的自定义策略内容,添加以上NAS相关的权限设置。请参见角色授权自定义授权
    • 创建子账号授权以上RAM Policy并生成AccessKey,配置到StatefulSet csi-provisioner中csi-nasprovisioner的env变量中。请参见角色授权
      env:
          - name: CSI_ENDPOINT
              value: unix://socketDir/csi.sock
          - name: ACCESS_KEY_ID
              value: ""
          - name: ACCESS_KEY_SECRET
              value: ""
  2. 创建StorageClass。
    1. 创建并拷贝以下内容到alicloud-nas-fs.yaml文件中。
      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        name: alicloud-nas-fs
      mountOptions:
      - nolock,tcp,noresvport
      - vers=3
      parameters:
        volumeAs: filesystem
        vpcId: "vpc-xxxxxxxxxxxx"
        vSwitchId: "vsw-xxxxxxxxx"
        deleteVolume: "false"
      provisioner: nasplugin.csi.alibabacloud.com
      reclaimPolicy: Retain
      参数 描述
      volumeAs 定义创建数据的类型,可选filesystem和subpath两种类型:
      • filesystem表示provisioner自动创建NAS文件系统,一个PV对应一个NAS文件系统。
      • subpath类型表示一个PV对应一个NAS文件系统的子目录,provisioner自动创建NAS文件系统子目录。
      storageType 定义创建NAS文件系统的类型,可选Performance、Capacity两种类型,分别表示性能型、容量型。默认性能型。
      zoneId 定义创建NAS文件系统所在可用区。
      vpcId 定义创建NAS文件系统对应挂载点所在VPC。
      vSwitchId 定义创建NAS文件系统对应挂载点所在vSwitch ID。
      accessGroupName 定义创建NAS文件系统对应挂载点所用的AccessGroup。默认:DEFAULT_VPC_GROUP_NAME。
      deleteVolume 定义数据卷删除时处理NAS文件系统策略,由于NAS为共享文件系统,安全起见需要同时配置。
      reclaimPolicy Delete、且deleteVolume为true才会在删除PVC的时候把NAS文件系统删除。
    2. 执行以下命令创建StorageClass。
      kubectl create -f alicloud-nas-fs.yaml
  3. 创建PV/PVC和Pod挂载NAS存储卷。
    pvc.yamlnginx.yaml文件内容如下。
    pvc.yaml
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: nas-csi-pvc-fs
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: alicloud-nas-fs
      resources:
        requests:
          storage: 20Gi
    nginx.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: deployment-nas-fs
      labels:
        app: nginx
    spec:
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        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-fs
    执行以下命令,创建PVC和Deployment。
    kubectl create -f pvc.yaml -f nginx.yaml

这种场景下,CSI会在PVC创建时动态新建NAS文件系统和挂载点,PVC删除时动态删除挂载点和文件系统。