跳至内容

如何在 Amazon EKS 中将 EBS 卷从 gp2 迁移到 gp3?

4 分钟阅读
0

我想将我的 Amazon Elastic Block Store (Amazon EBS) 卷类型从通用 SSD (gp2) 迁移到 Amazon Elastic Kubernetes Service (Amazon EKS) 中的通用 SSD (gp3)。

简短描述

您可以使用 Amazon EBS 容器存储接口 (CSI) 驱动程序在 PersistentVolumeClaims (PVC) 中使用注释修改 Amazon EBS 卷。此功能在 aws-ebs-csi-driver v1.19.0-eksbuild.2 或更高版本中可用。您可以修改 PVC 中的 typeiopsthroughput 参数:

要在 Amazon EKS 集群中将 EBS 卷从 gp2 迁移到 gp3,请完成以下步骤:

  1. 在您的 Amazon EKS 集群中安装 Amazon EBS CSI 驱动程序
  2. 启用 Amazon EBS CSI 驱动程序中的卷修改功能。
  3. 更改 EBS 卷类型。

解决方法

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

在 Amazon EBS CSI 驱动程序中安装卷修改功能

卷修改功能在 Amazon EBS CSI 驱动程序版本 1.19.0 中可用。它由 Helm 图表 2.19.0 或 Amazon EKS 托管插件 v1.19.0-eksbuild.2 使用。此功能是作为一个名为 volumemodifier 的附加 sidecar 实现的。您必须在 Amazon EBS CSI 驱动程序中手动将其激活。有关详细信息,请参阅 GitHub 网站上的 Volume modification(卷修改)

要启用 Amazon EKS 中的卷修改功能,请配置以下方法之一:

  • 使用 Helm 进行自行管理的插件配置
  • Amazon EKS 托管插件配置

使用 Helm 进行自行管理的插件配置

  1. 通过 Helm 图表安装自行管理的 Amazon EBS CSI 驱动程序,然后将 controller.volumeModificationFeature.enabled 设置为 true
    YAML 示例:

    cat values.yaml  
    controller:
      volumeModificationFeature:
        enabled: true
  2. 升级配置。运行以下命令:

    helm upgrade aws-ebs-csi-driver --namespace kube-system \
        aws-ebs-csi-driver/aws-ebs-csi-driver -f values.yaml

Amazon EKS 托管插件配置

  1. 创建配置文件。运行以下命令:

    cat eks-addon-ebs-csi-driver-config.json
    {
      "controller": {
        "volumeModificationFeature": {
           "enabled": true
        }
      }
    }
  2. 使用配置文件更新 Amazon EBS CSI 驱动程序插件。运行以下命令:

    aws eks update-addon --cluster-name eks-demo \
        --addon-name aws-ebs-csi-driver \
        --service-account-role-arn arn:aws:iam::{AWS_ACCOUNT_ID}:role/AmazonEKS-EBS-CSI-DriverRole \
        --configuration-values 'file://eks-addon-ebs-csi-driver-config.json'
    
    {
        "update": {
             ...
            "status": "InProgress",
            "type": "AddonUpdate",
            "params": [
                ...
                {
                    "type": "ConfigurationValues",
                    "value": "{\n  \"controller\": {\n    \"volumeModificationFeature\": {\n       \"enabled\": true\n    }\n  }\n}"
                }
            ],
            ...
        }
    }
  3. 验证附加的 sidecar volumemodifier 是否处于活动状态。运行以下命令:

    kubectl get pod -n kube-system -l=app=ebs-csi-controller

    输出示例:

    NAME                                  READY   STATUS    RESTARTS   AGE
    ebs-csi-controller-5f985b94f4-lk7lv   7/7     Running   0          2m29s
    ebs-csi-controller-5f985b94f4-m5nn8   7/7     Running   0          2m29s
  4. 检查容器名称。运行以下命令:

    kubectl get pod -n kube-system ebs-csi-controller-5f985b94f4-lk7lv -o jsonpath='{.spec.containers[*].name}{"\n"}'

    输出示例:

    ebs-plugin csi-provisioner csi-attacher csi-snapshotter volumemodifier csi-resizer liveness-probe

更改 EBS 卷类型

  1. 查看当前 PVC 和 PersistentVolume (PV) 状态。运行以下命令:

    kubectl get sc

    输出示例:

    NAME   PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
    gp2    kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   false                  6h23m
    
    kubectl get pvc ebs-demo-claim        

    输出示例:

    NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
    ebs-demo-claim   Bound    pvc-10d1d621-22f4-4fb6-a64a-51cdf03a9e30   4Gi        RWO            gp2            <unset>                 18s
    kubectl get pv pvc-10d1d621-22f4-4fb6-a64a-51cdf03a9e30                                                

    输出示例:

    NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
    pvc-10d1d621-22f4-4fb6-a64a-51cdf03a9e30   4Gi        RWO            Delete           Bound    default/ebs-demo-claim   gp2            <unset>                          36s
  2. 查看 PV 详细信息。运行以下命令:

    kubectl get pv pvc-10d1d621-22f4-4fb6-a64a-51cdf03a9e30 -o yaml

    输出示例:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      annotations:
        pv.kubernetes.io/migrated-to: ebs.csi.aws.com
        pv.kubernetes.io/provisioned-by: kubernetes.io/aws-ebs
        ...
      ...
    spec:
      awsElasticBlockStore:
        fsType: ext4
        volumeID: vol-0296e8e6fa4b27670
      claimRef:
        apiVersion: v1
        kind: PersistentVolumeClaim
        name: ebs-demo-claim
        namespace: default
        ...
      persistentVolumeReclaimPolicy: Delete
      storageClassName: gp2
      volumeMode: Filesystem
    status:
      phase: Bound
      ...
  3. 查看 Amazon EBS 的详细信息。运行以下命令:

    aws ec2 describe-volumes --volume-ids vol-0296e8e6fa4b27670

    输出示例:

    {
        "Volumes": [
            {
                "AvailabilityZone": "us-east-1a",
                "Size": 4,
                "State": "in-use",
                "VolumeId": "vol-0296e8e6fa4b27670",
                "Iops": 100,
                "VolumeType": "gp2"
                ...
            }
        ]
    }
  4. 添加 gp3 类型的注释。运行以下命令:

    kubectl annotate pvc ebs-demo-claim ebs.csi.aws.com/volumeType="gp3"

    输出示例:

    persistentvolumeclaim/ebs-demo-claim annotated
  5. 验证注释。运行以下命令:

    kubectl get pvc ebs-demo-claim -o yaml                              

    输出示例:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      annotations:
        ebs.csi.aws.com/volumeType: gp3
        ...
      ...
      name: ebs-demo-claim
      namespace: default
    kubectl get pv pvc-10d1d621-22f4-4fb6-a64a-51cdf03a9e30 -o yaml
    

    输出示例:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      annotations:
        ebs.csi.aws.com/volumeType: gp3
        ...
    spec:
      awsElasticBlockStore:
        fsType: ext4
        volumeID: vol-0296e8e6fa4b27670
      claimRef:
        apiVersion: v1
        kind: PersistentVolumeClaim
        name: ebs-demo-claim
        namespace: default
      ...
  6. 监控修改。运行以下命令:

    kubectl describe pvc ebs-demo-claim   

    输出示例:

    Name:          ebs-demo-claim
    ...
    Events:
      Type    Reason                        Age    From                                                                                      Message
      ----    ------                        ----   ----                                                                                      -------
      ...
      Normal  ProvisioningSucceeded         5m20s  ebs.csi.aws.com_ebs-csi-controller-676f998966-bh79n_ec5572b3-c1ec-4b3a-838a-d4b21b8c668f  Successfully provisioned volume pvc-10d1d621-22f4-4fb6-a64a-51cdf03a9e30
      Normal  VolumeModificationStarted     64s    volume-modifier-for-k8s-ebs.csi.aws.com                                                   External modifier is modifying volume pvc-10d1d621-22f4-4fb6-a64a-51cdf03a9e30
      Normal  VolumeModificationSuccessful  57s    volume-modifier-for-k8s-ebs.csi.aws.com  
  7. 确认卷类型已更改为 gp3。运行以下命令:

    aws ec2 describe-volumes --volume-ids vol-0296e8e6fa4b27670

    输出示例:

    {
        "Volumes": [
            {
                "AvailabilityZone": "us-east-1a",
                "Size": 4,
                "State": "in-use",
                "VolumeId": "vol-0296e8e6fa4b27670",
                "Iops": 3000,
                "VolumeType": "gp3",
                "Throughput": 125
                ...
            }
        ]
    }

使用卷快照迁移卷

Amazon EBS CSI 驱动程序提供了 CSI 卷快照功能。您可以使用快照将永久卷从树内 gp2 StorageClass 迁移到 Amazon EBS CSI gp3 StorageClass。有关详细信息,请参阅 GitHub 网站上的 Volume snapshots(卷快照)

要使用卷快照,请完成以下步骤:

  1. 安装 Amazon EBS CSI 驱动程序
  2. 安装 VolumeSnapshotClassVolumeSnapshotContentVolumeSnapshot 对象。有关详细信息,请参阅 GitHub 网站上的 snapshotclass.yamlvolume-snapshot-content.yamlsnapshot.yaml
  3. 使用这些对象从快照创建新的 gp3 类型的永久卷。有关详细信息,请参阅 Migrating Amazon EKS clusters from gp2 to gp3 EBS volumes(将 Amazon EKS 集群从 gp2 迁移到 gp3 EBS 卷)

相关信息

Simplifying Amazon EBS volume migration and modification on Kubernetes using the EBS CSI Driver(使用 EBS CSI 驱动程序在 Kubernetes 上简化 Amazon EBS 卷迁移和修改)