变更云盘类型

ACK支持使用多种类型的云盘作为存储卷,可以满足不同场景的存储性能和成本需求。使用云盘存储卷时,您可以根据需求变更云盘类型。例如您在创建云盘时选择了SSD云盘,但后期需要更高的IOPS,您可以将SSD云盘变配为ESSD云盘。

前提条件

  • 集群的版本为v1.20及以上,并且使用CSI存储插件。

  • 集群中已安装storage-operator组件,且组件版本不低于v1.26.1-50a1499-aliyun。

    说明

    storage-operator组件在集群中默认安装。您可以在集群管理页的左侧导航栏选择运维管理 > 组件管理,在存储页签下确认storage-operator组件的安装情况和版本信息。更多信息,请参见管理storage-operator组件

  • 如果您的集群是ACK专有集群,需确保集群的WorkerRoleMasterRole具备ModifyDiskSpec权限。具体操作,请参见创建自定义权限策略

    说明

    如果是ACK托管集群,无需进行授权操作。

    展开查看权限策略内容

    {
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "ecs:CreateSnapshot",
                    "ecs:DescribeSnapshot",
                    "ecs:DeleteSnapshot",
                    "ecs:ModifyDiskSpec",
                    "ecs:DescribeTaskAttribute"
                ],
                "Resource": "*"
            }
        ]
    }

注意事项

  • 当前云盘类型为ESSD AutoPL云盘或者普通云盘时,不支持变更类型。

    支持变配的情况如下:

    当前云盘类型

    可变配到的云盘类型

    高效云盘

    SSD云盘、ESSD云盘(PL0、PL1、PL2PL3)、ESSD AutoPL云盘

    说明

    华东1(杭州)D可用区暂不支持高效云盘变更为SSD云盘。

    SSD云盘

    ESSD云盘(PL0、PL1、PL2PL3)、ESSD AutoPL云盘

    ESSD云盘PL0

    ESSD云盘(PL1、PL2PL3)、ESSD AutoPL云盘

    ESSD云盘PL1、PL2、PL3

    ESSD云盘PL1、PL2PL3性能级别间相互变配、ESSD AutoPL云盘

  • 某些类型的云盘不支持挂载到某些规格的ECS实例,您需要确保当前Pod所调度到的ECS实例支持变更后的云盘类型。关于云盘类型和ECS实例规格的匹配关系,请参见实例规格族

  • 作为存储卷的云盘必须采用按量付费方式,变更云盘类型后,会直接按照新的云盘类型进行计费。

更多信息,请参见使用限制

步骤一:配置storage-operator组件开启云盘变配

连接集群,执行以下命令修改storage-operatorConfigMap文件,开启云盘变配功能。storage-operator组件中默认的storage-controller负责云盘变配。

kubectl patch configmap/storage-operator \
  -n kube-system \
  --type merge \
  -p '{"data":{"storage-controller":"{\"imageRep\":\"acs/storage-controller\",\"imageTag\":\"\",\"install\":\"true\",\"template\":\"/acs/templates/storage-controller/install.yaml\",\"type\":\"deployment\"}"}}'

步骤二:创建CR实现云盘变配

重要

为了减少变配操作对您业务带来的影响,请您在业务低峰期进行变配。

  1. 创建用于测试云盘变配的StatefulSet。

    如果您已有挂载了云盘的StatefulSet,可跳过该步骤。

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

      以下YAML将创建一个StatefulSet,该StatefulSet包含一个Pod,Pod挂载了一个40 GiBESSD PL1云盘。

      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: nginx-diskspec
      spec:
        selector:
          matchLabels:
            app: nginx
        replicas: 1
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
              ports:
              - containerPort: 80
              volumeMounts:
              - name: pvc-disk
                mountPath: /data
            volumes:
              - name: pvc-disk
                persistentVolumeClaim:
                  claimName: disk-pvc
        volumeClaimTemplates:
          - metadata:
              name: pvc-disk
              labels:
                app: nginx
            spec:
              accessModes: [ "ReadWriteOnce" ]
              storageClassName: "alicloud-disk-essd"
              resources:
                requests:
                  storage: 40Gi    
    2. 创建StatefulSet。

      kubectl create -f StatefulSet.yaml
    3. 查看Pod部署情况。

      kubectl get pod -l app=nginx

      预期返回:

      NAME                 READY   STATUS    RESTARTS   AGE
      nginx-diskspec-0     1/1     Running   0          4m4s
    4. 查看PVC信息,并获取PV名称。

      kubectl get pvc pvc-disk-nginx-diskspec-0

      返回示例如下,从VOLUME字段中可以获得PV名称为d-uf6ijdcp3aeoi82w****

      NAME                           STATUS    VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS                VOLUMEATTRIBUTESCLASS   AGE
      pvc-disk-nginx-diskspec-0      Bound     d-uf6ijdcp3aeoi82w****   40Gi       RWO            alicloud-disk-essd          <unset>                 5m6s
  2. 确认变更前的云盘类型。

    kubectl get pv d-uf6ijdcp3aeoi82w**** -o=jsonpath='{.metadata.labels}'

    返回示例如下,cloud_essd.PL1表示当前云盘类型为ESSD云盘PL1。

    {"csi.alibabacloud.com/disktype":"cloud_essd.PL1"}
  3. 创建CR,执行云盘变配操作。

    1. 创建cr.yaml文件。

      YAML示例如下,请根据实际情况替换pvNamesdesiredDiskType

      apiVersion: storage.alibabacloud.com/v1beta1
      kind: ContainerStorageOperator
      metadata:
        name: default
      spec:
        operationType: DISKUPGRADE
        operationParams:
          pvNames: "d-uf6ijdcp3aeoi82w****"
          desiredDiskType: "cloud_auto"

      参数

      说明

      operationType

      取值为DISKUPGRADE,表明当前的操作为云盘变配。

      pvNames

      声明操作对象(PV名称),支持填写多个pvName,多个pvName间使用英文半角逗号(,)隔开,例如 "disk-1***,disk-2***,disk-3***"。

      desiredDiskType

      声明变更后的云盘类型。请根据注意事项中支持的变配类型进行配置。

      • cloud_auto:ESSD AutoPL云盘

      • cloud_essd.PL0:ESSD云盘PL0

      • cloud_essd.PL1:ESSD云盘PL1

      • cloud_essd.PL2:ESSD云盘PL2

      • cloud_essd.PL3:ESSD云盘PL3

      • cloud_ssd:SSD云盘

    2. 创建CR。

      kubectl create -f cr.yaml
  4. 确认变更后的云盘类型。

    1. 观察CR status,确认变配操作成功。

      kubectl get ContainerStorageOperator default -o yaml

      在返回的status字段中确认状态,示例如下:

        status:
          message: []
          process: 100%
          status: SUCCESS
    2. 查看PVlabels,确认已经变配到ESSD AutoPL云盘。

      kubectl get pv d-uf6ijdcp3aeoi82w**** -o=jsonpath='{.metadata.labels}'

      预期返回如:

      {"csi.alibabacloud.com/disktype":"cloud_auto"}