挂载云盘

云盘是阿里云提供的数据块级别的存储产品,具有低时延、高性能、持久性、高可靠等特点。部署阿里云CSI插件后,您可以在自建的Kubernetes集群使用阿里云云盘作为Volume。使用PVC方式挂载云盘时,支持静态数据卷和动态数据卷,本文为您介绍如何使用PVC方式,挂载云盘到ECI Pod上。

前提条件

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

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

    重要

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

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

注意事项

挂载云盘时,请注意以下事项:

  • 云盘为非共享存储,一个云盘只能挂载到一个Pod。

  • 云盘只能挂载到相同可用区的VNode节点下的ECI Pod,不支持跨可用区挂载。

静态挂载云盘

  1. 创建云盘。

    1. 登录ECS管理控制台

    2. 在VNode对应的地域和可用区下,创建一个按量付费的云盘。

      关于如何创建云盘,请参见创建云盘。创建完成后,请记录云盘ID。

      说明

      如果您使用已有云盘,请确保该云盘所属的地域和可用区与VNode一致,且该云盘未进行分区格式化。

  2. 创建PV。

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

      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: static-disk-pv
        labels:
          alicloud-pvname: static-disk-pv
      spec:
        capacity:
          storage: 25Gi
        accessModes:
          - ReadWriteOnce
        persistentVolumeReclaimPolicy: Retain
        csi:
          driver: diskplugin.csi.alibabacloud.com
          volumeHandle: "<your disk-id>"    #替换为云盘ID
        nodeAffinity:
          required:
            nodeSelectorTerms:
            - matchExpressions:
              - key: topology.diskplugin.csi.alibabacloud.com/zone
                operator: In
                values:
                - "<your-node-zone-id>"   #替换为VNode所在可用区

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

      参数

      描述

      driver

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

      volumeHandle

      云盘ID。

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

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

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

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

      kubectl create -f static-disk-pvc.yaml
  4. 将云盘挂载到ECI Pod。

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

      apiVersion: v1
      kind: Pod
      metadata:
        name: static-disk-test
        labels:
          alibabacloud.com/eci: "true"
      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
            name: web
          volumeMounts:
          - name: pvc-disk
            mountPath: /data
        volumes:
          - name: pvc-disk
            persistentVolumeClaim:
              claimName: static-disk-pvc
    2. 执行以下命令创建Pod。

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

      kubectl get pods -o wide

      预期返回:

      NAME                 READY   STATUS    RESTARTS   AGE   IP            NODE                                  NOMINATED NODE   READINESS GATES
      static-disk-test     1/1     Running   0          44s   172.16.XX.XX   cn-beijing.vnd-2ze8nd8xcl33t4pa****   <none>           <none>

      查看Pod中的文件目录,可以看到已生成云盘对应的挂载目录/data

      静态云盘csi

动态挂载云盘

  1. 创建StorageClass。

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

      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        name: alicloud-disk-essd
      provisioner: diskplugin.csi.alibabacloud.com
      parameters:
        type: cloud_essd
        regionId: cn-beijing 
        zoneId: cn-beijing-l 
        fstype: ext4
        readonly: "true"
        mkfsOptions: "-O project,quota"
        diskTags: "key1:value1,key2:value2"
        encrypted: "false"
        performanceLevel: PL1
      volumeBindingMode: Immediate
      reclaimPolicy: Delete
      allowVolumeExpansion: true

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

      参数

      描述

      provisioner

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

      type

      云盘类型。取值:

      • cloud_essd:ESSD云盘。

      • cloud_ssd:SSD云盘。

      • cloud_efficiency:高效云盘。

      • available:优先创建SSD云盘,若可用区内SSD云盘没有资源,则创建高效云盘。

      说明

      除available外,支持任意组合其它三种参数,例如:type: cloud_efficiency, cloud_ssd, cloud_essd,此时将依次尝试创建指定类型的云盘,直到创建成功。

      regionId、zoneId

      云盘所属的地域和可用区,需与VNode相同。

      fstype

      云盘的文件系统,默认为ext4。

      readonly

      挂载自动创建云盘的权限是否为可读。默认为false。

      • true:云盘具有只读权限。

      • false:云盘具有可读可写权限。

      mkfsOptions

      云盘格式化所用的参数。例如:mkfsOptions: "-O project,quota"

      diskTags

      云盘绑定的标签。格式为key1:value1,key2:value2

      encrypted

      云盘是否加密。默认为false,表示创建的云盘不加密。

      performanceLevel

      ESSD云盘的性能级别。可选值:PL0、PL1、PL2或PL3。更多信息,请参见ESSD云盘

      volumeBindingMode

      云盘的绑定模式。默认为Immediate,表示先创建云盘再创建Pod。

      reclaimPolicy

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

      • Delete:删除PVC时,PV和云盘会一起删除。

      • Retain:删除PVC时,PV和云盘不会被删除,需要您手动删除。

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

      allowVolumeExpansion

      是否自动扩容云盘。

    2. 创建StorageClass。

      kubectl create -f disk-sc.yaml
  2. 创建PVC。

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

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: disk-pvc
      spec:
        accessModes:
        - ReadWriteOnce
        volumeMode: Filesystem
        resources:
          requests:
            storage: 25Gi
        storageClassName: alicloud-disk-essd
    2. 执行以下命令创建PVC。

      kubectl create -f disk-pvc.yaml

      此时,系统将根据StorageClass的配置自动创建云盘,以及对应的PV。

  3. 将云盘挂载到ECI Pod。

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

      说明

      建议使用StatefulSet来挂载云盘,不建议使用Deployment。Deployment是无状态服务,重启Pod时,无法保证新Pod启动时间和旧Pod结束时间之间的时间叠加,且Deployment多副本模式不能为每个Pod配置独立的Volume。

      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: disk-test
      spec:
        selector:
          matchLabels:
            app: nginx
        serviceName: "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
                name: web
              volumeMounts:
              - name: pvc-disk
                mountPath: /data
            volumes:
              - name: pvc-disk
                persistentVolumeClaim:
                  claimName: disk-pvc
    2. 执行以下命令创建Statueful。

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

      kubectl get pods -o wide

      预期返回:

      NAME                              READY   STATUS              RESTARTS   AGE     IP             NODE                                  NOMINATED NODE   READINESS GATES
      disk-test-0                       1/1     Running             0          3m58s   172.16.XX.XX   cn-beijing.vnd-2ze8nd8xcl33t4pa****   <none>           <none>

      查看Pod中的文件目录,可以看到已生成云盘对应的挂载目录/data

      csi动态云盘