使用ENS云盘

ENS云盘是在ACK Edge集群的ENS节点上使用的云盘。ACK Edge集群支持使用CSI插件创建ENS云盘静态存储卷和ENS云盘动态存储卷。本文介绍如何在CSI插件中挂载ENS云盘静态存储卷和ENS云盘动态存储卷。

前提条件

使用说明

  • 在应用部署时,推荐通过StorageClass自动创建PV购买云盘。如果您已经购买云盘,则使用云盘静态存储卷

  • 申请云盘的大小,不能超出云盘的单盘容量范围。更多信息,请参见存储规格

  • 当Pod重建时,会重新挂载原云盘。若由于其他限制无法调度到原可用区,则Pod将会处于Pending状态。

  • 动态创建的云盘为按量付费的云盘,关于云盘计费项信息,请参见块存储计费。关于云盘的价格信息,请参见详细定价

  • ENS云盘为阿里云存储团队提供的非共享存储,只能同时被一个Pod挂载。

  • ACK Edge集群中与ENS云盘在同一地域的ENS节点才能挂载ENS云盘。

  • 不支持回收和删除ENS云盘。相关操作,需在ENS控制台操作。

使用ENS云盘动态存储卷

步骤一:创建storageclass

在多地域集群场景下,您可以根据不同的场景通过以下两种方式创建StorageClass。

方式一:使用Topology(延迟绑定)方式创建StorageClass

延迟绑定可以优化ACK Edge集群中存在多个地域的问题。以下通过部署名为storage-class-csi-topology.yaml文件为例,创建StorageClass。

  1. 使用以下内容,创建storage-class-topology.yaml文件。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alicloud-ens-disk-available
    provisioner: ensplugin.csi.alibabacloud.com
    parameters:
      type: available
      fsType: ext4
    volumeBindingMode: WaitForFirstConsumer
    reclaimPolicy: Retain
    allowVolumeExpansion: false

    参数

    说明

    name

    StorageClass的名称。

    provisioner

    配置为ensplugin.csi.alibabacloud.com。表示使用ENS云盘Provisioner插件创建StorageClass。

    type

    云盘类型。

    regionId

    可选,自动创建云盘所在的地域。

    reclaimPolicy

    云盘的回收策略,仅支持Retain,当删除PVC的时候,PV和云盘数据不会被删除,需要您手动删除。

    volumeBindingMode

    云盘的绑定模式。默认为Immediate,支持WaitForFirstConsumer

    • Immediate:表示先创建云盘再创建Pod。

    • WaitForFirstConsumer:延迟绑定,即调度器先调度Pod,并根据Pod的可用区信息创建云盘。

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

    kubectl apply -f storage-class-topology.yaml
  3. 查看创建的StorageClass。

    1. 登录容器服务管理控制台,在左侧导航栏选择集群

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择存储 > 存储类

    存储类页面查看创建的StorageClass。

方式二:先创建云盘再创建Pod的方式创建StorageClass

  1. 使用以下内容,创建storage-class-csi.yaml文件。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alicloud-ens-disk-available
    provisioner: ensplugin.csi.alibabacloud.com
    parameters:
      type: available
      regionId: xxx
    reclaimPolicy: Retain
    allowVolumeExpansion: false
    volumeBindingMode: Immediate
  2. 执行以下命令,创建StorageClass。

    kubectl apply -f storage-class-csi.yaml
  3. 查看创建的StorageClass。

    1. 登录容器服务管理控制台,在左侧导航栏选择集群

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择存储 > 存储类

    存储类页面查看创建的StorageClass。

步骤二:创建PVC

  1. 使用以下内容,创建pvc-ssd.yaml文件。

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

    kubectl create -f pvc-ssd.yaml
  3. 查看创建的PVC。

    在集群管理页左侧导航栏选择存储 > 存储声明。可以在存储声明页面查看创建的PVC。

步骤三:创建应用

  1. 使用以下内容,创建pvc-dynamic.yaml文件。

    创建一个名为nginx-dynamic的应用,并挂载PVC。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: nginx-dynamic
    spec:
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
              name: web
            volumeMounts:
            - name: pvc-disk
              mountPath: /data
          volumes:
            - name: pvc-disk
              persistentVolumeClaim:
                claimName: disk-pvc

    参数

    说明

    mountPath

    云盘挂载的位置。

    claimName

    PVC的名称,用于绑定PVC。

  2. 执行以下命令, 创建应用并挂载PVC。

    kubectl create -f pvc-dynamic.yaml
  3. 查看创建的应用。

    在集群管理页左侧导航栏选择工作负载 > 有状态。您可以在有状态页面看到创建的应用。

使用ENS云盘静态存储卷

步骤一:创建PV

  1. 使用以下内容,创建pv-static.yaml文件。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: csi-pv
      labels:
        alicloud-pvname: static-disk-pv
    spec:
      capacity:
        storage: 25Gi
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      csi:
        driver: ensplugin.csi.alibabacloud.com
        volumeHandle: "<your-disk-id>"
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: topology.ensplugin.csi.alibabacloud.com/region
              operator: In
              values:
              - "<your-node-region-id>"     # ENS节点RegionID。可通过查看ENS节点label中topology.ensplugin.csi.alibabacloud.com/region参数查看ENS节点RegionID。

    参数

    说明

    name

    PV的名称。

    labels

    设置PV的标签。

    storage

    云盘的可使用量。

    accessModes

    设置访问模式。

    persistentVolumeReclaimPolicy

    PV的回收策略。

    driver

    定义驱动类型。取值为ensplugin.csi.alibabacloud.com,表示使用ENS云盘CSI插件。

    volumeHandle

    定义云盘ID。

    nodeAffinity

    定义PV和PVC所属的区域信息。

    通过定义该参数,可以将PV和PVC所在的Pod调度到对应的区域上。

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

    kubectl create -f pv-static.yaml
  3. 查看创建的PV。

    1. 登录容器服务管理控制台,在左侧导航栏选择集群

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择存储 > 存储卷

    存储卷页面可看到创建的PV。

步骤二:创建PVC

  1. 使用以下内容,创建pvc-static.yaml文件。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: csi-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 25Gi
      selector:
        matchLabels:
          alicloud-pvname: static-disk-pv

    参数

    说明

    name

    PVC的名称。

    accessModes

    设置访问模式。

    storage

    声明应用使用量,不能大于存储卷的总量。

    matchLabels

    通过标签关联PV,与PV标签保持一致。

  2. 执行以下命令,创建PVC。

    kubectl create -f pvc-static.yaml
  3. 查看创建的PVC。

    在集群管理页左侧导航栏选择存储 > 存储声明。可以在存储声明页面查看创建的PVC。

步骤三:创建应用

本文以Web应用为例,在应用中挂载PVC。

  1. 使用以下内容,创建web.yaml文件。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      selector:
        matchLabels:
          app: nginx
      serviceName: "nginx"
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
              name: web
            volumeMounts:
            - name: pvc-disk
              mountPath: /data
          volumes:
            - name: pvc-disk
              persistentVolumeClaim:
                claimName: csi-pvc

    参数

    说明

    mountPath

    云盘挂载的位置。

    claimName

    PVC的名称,用于绑定PVC。

  2. 执行以下命令,创建一个挂载了ENS云盘静态存储卷的应用并挂载PVC。

    kubectl apply -f web.yaml
  3. 在集群管理页左侧导航栏选择工作负载 > 有状态

    有状态页面可看到创建的Web应用,且应用能正常启动,说明ENS云盘已经挂载成功。