2.3. 为复制存储库配置对象存储

您必须将对象存储配置为用作复制存储库。MTC 将数据从源集群复制到复制存储库,然后从复制存储库复制到目标集群。

MTC 支持将数据从源集群迁移到目标集群的文件系统和快照数据复制方法。您可以选择适合于您的环境并受您的存储供应商支持的方法。

支持以下存储供应商:

在受限环境中,您可以创建一个内部托管的复制存储库。

先决条件

  • 所有集群都必须具有对复制存储库的不间断网络访问权限。
  • 如果您将代理服务器与内部托管的复制存储库搭配使用,您必须确保代理允许访问复制存储库。

2.3.1. 配置 MCG 存储桶做为复制存储库

您可以安装 OpenShift Container Storage Operator,并将一个 Multi-Cloud Object Gateway(MCG)存储桶配置为 Migration Toolkit for Containers(MTC)的复制仓库。

2.3.1.1. 安装 OpenShift Container Storage Operator

您可以从 OperatorHub 安装 OpenShift Container Storage Operator。

流程

  1. 在 OpenShift Container Platform Web 控制台中,点击 OperatorsOperatorHub
  2. 使用 Filter by keyword (本例中为 OCS)来查找 OpenShift Container Storage Operator
  3. 选择 OpenShift Container Storage Operator 并点 Install
  4. 选择一个 Update ChannelInstallation ModeApproval Strategy
  5. 点击 Install

    Installed Operators 页面中,OpenShift Container Storage Operator 会出现在 openshift-storage 项目中,状态为 Succeeded

2.3.1.2. 创建 Multi-Cloud Object Gateway 存储桶

您可以创建 Multi-Cloud Object Gateway(MCG)存储桶的自定义资源(CR)。

流程

  1. 登录到 OpenShift Container Platform 集群:

    $ oc login
  2. 使用以下内容创建 NooBaa CR 配置文件,noobaa.yml

    apiVersion: noobaa.io/v1alpha1
    kind: NooBaa
    metadata:
      name: noobaa
      namespace: openshift-storage
    spec:
     dbResources:
       requests:
         cpu: 0.5 1
         memory: 1Gi
     coreResources:
       requests:
         cpu: 0.5 2
         memory: 1Gi
    1 2
    对于非常小的集群,您可以将 cpu 的值改为 0.1
  3. 创建 NooBaa 对象:

    $ oc create -f noobaa.yml
  4. 使用以下内容创建 BackingStore CR 配置文件,bs.yml

    apiVersion: noobaa.io/v1alpha1
    kind: BackingStore
    metadata:
      finalizers:
      - noobaa.io/finalizer
      labels:
        app: noobaa
      name: mcg-pv-pool-bs
      namespace: openshift-storage
    spec:
      pvPool:
        numVolumes: 3 1
        resources:
          requests:
            storage: 50Gi 2
        storageClass: gp2 3
      type: pv-pool
    1
    指定持久性卷池中的卷数量。
    2
    指定卷的大小。
    3
    指定存储类。
  5. 创建 BackingStore 对象:

    $ oc create -f bs.yml
  6. 使用以下内容创建 BucketClass CR 配置文件,bc.yml

    apiVersion: noobaa.io/v1alpha1
    kind: BucketClass
    metadata:
      labels:
        app: noobaa
      name: mcg-pv-pool-bc
      namespace: openshift-storage
    spec:
      placementPolicy:
        tiers:
        - backingStores:
          - mcg-pv-pool-bs
          placement: Spread
  7. 创建 BucketClass 对象:

    $ oc create -f bc.yml
  8. 使用以下内容创建 ObjectBucketClaim CR 配置文件,obc.yml

    apiVersion: objectbucket.io/v1alpha1
    kind: ObjectBucketClaim
    metadata:
      name: migstorage
      namespace: openshift-storage
    spec:
      bucketName: migstorage 1
      storageClassName: openshift-storage.noobaa.io
      additionalConfig:
        bucketclass: mcg-pv-pool-bc
    1
    记录在 MTC web 控制台中添加复制存储库的存储桶名称。
  9. 创建 ObjectBucketClaim 对象:

    $ oc create -f obc.yml
  10. 监控资源创建过程以验证 ObjectBucketClaim 的状态变为 Bound

    $ watch -n 30 'oc get -n openshift-storage objectbucketclaim migstorage -o yaml'

    这个过程可能需要五到十分钟。

  11. 获取并记录以下值,当您将复制存储库添加到 MTC web 控制台时需要这些值:

    • S3 端点:

      $ oc get route -n openshift-storage s3
    • S3 provider access key:

      $ oc get secret -n openshift-storage migstorage -o go-template='{{ .data.AWS_ACCESS_KEY_ID }}' | base64 --decode
    • S3 provider secret access key:

      $ oc get secret -n openshift-storage migstorage -o go-template='{{ .data.AWS_SECRET_ACCESS_KEY }}' | base64 --decode

2.3.2. 将 AWS S3 存储桶配置为复制存储库

您可以将 AWS S3 存储桶配置为 MTC 的 Migration Toolkit 的复制仓库。

先决条件

  • AWS S3 存储桶必须可以被源和目标集群访问。
  • 您必须安装了 AWS CLI
  • 如果您使用快照复制方法:

    • 您必须有权访问 EC2 Elastic Block Storage (EBS)。
    • 源和目标集群必须位于同一区域。
    • 源和目标集群必须具有相同的存储类。
    • 存储类必须与快照兼容。

流程

  1. 创建 AWS S3 存储桶:

    $ aws s3api create-bucket \
        --bucket <bucket_name> \ 1
        --region <bucket_region> 2
    1
    指定 S3 存储桶名称。
    2
    指定 S3 存储桶区域,例如 us-east-1
  2. 创建 IAM 用户 velero

    $ aws iam create-user --user-name velero
  3. 创建 EC2 EBS 快照策略:

    $ cat > velero-ec2-snapshot-policy.json <<EOF
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "ec2:DescribeVolumes",
                    "ec2:DescribeSnapshots",
                    "ec2:CreateTags",
                    "ec2:CreateVolume",
                    "ec2:CreateSnapshot",
                    "ec2:DeleteSnapshot"
                ],
                "Resource": "*"
            }
        ]
    }
    EOF
  4. 为一个或所有 S3 存储桶创建 AWS S3 访问策略:

    $ cat > velero-s3-policy.json <<EOF
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:GetObject",
                    "s3:DeleteObject",
                    "s3:PutObject",
                    "s3:AbortMultipartUpload",
                    "s3:ListMultipartUploadParts"
                ],
                "Resource": [
                    "arn:aws:s3:::<bucket_name>/*" 1
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "s3:ListBucket",
                    "s3:GetBucketLocation",
                    "s3:ListBucketMultipartUploads"
                ],
                "Resource": [
                    "arn:aws:s3:::<bucket_name>" 2
                ]
            }
        ]
    }
    EOF
    1 2
    要授予对单一 S3 存储桶的访问权限,请指定存储桶名称。要授予对所有 AWS S3 存储桶的访问权限,请指定 * 而不是存储桶名称,如下例所示:

    输出示例

    "Resource": [
        "arn:aws:s3:::*"

  5. 将 EC2 EBS 策略附加到 velero

    $ aws iam put-user-policy \
      --user-name velero \
      --policy-name velero-ebs \
      --policy-document file://velero-ec2-snapshot-policy.json
  6. 将 AWS S3 策略附加到 velero

    $ aws iam put-user-policy \
      --user-name velero \
      --policy-name velero-s3 \
      --policy-document file://velero-s3-policy.json
  7. velero 创建访问密钥:

    $ aws iam create-access-key --user-name velero
    {
      "AccessKey": {
            "UserName": "velero",
            "Status": "Active",
            "CreateDate": "2017-07-31T22:24:41.576Z",
            "SecretAccessKey": <AWS_SECRET_ACCESS_KEY>, 1
            "AccessKeyId": <AWS_ACCESS_KEY_ID> 2
        }
    }
    1 2
    记录 AWS_SECRET_ACCESS_KEYAWS_ACCESS_KEY_ID 以将 AWS 存储库添加到 MTC web 控制台。

2.3.3. 将 Google Cloud Provider 存储桶配置为复制存储库

您可以将 Google Cloud Provider(GCP)存储桶配置为 MTC 的 Migration Toolkit for Containers 复制仓库。

先决条件

  • AWS S3 存储桶必须可以被源和目标集群访问。
  • 您必须安装了 gsutil
  • 如果您使用快照复制方法:

    • 源和目标集群必须位于同一区域。
    • 源和目标集群必须具有相同的存储类。
    • 存储类必须与快照兼容。

流程

  1. 登录到 gsutil:

    $ gsutil init

    输出示例

    Welcome! This command will take you through the configuration of gcloud.
    
    Your current configuration has been set to: [default]
    
    To continue, you must login. Would you like to login (Y/n)?

  2. 设置 BUCKET 变量:

    $ BUCKET=<bucket_name> 1
    1
    指定存储桶名称。
  3. 创建存储桶:

    $ gsutil mb gs://$BUCKET/
  4. PROJECT_ID 变量设置为您的活跃项目:

    $ PROJECT_ID=`gcloud config get-value project`
  5. 创建 velero IAM 服务帐户:

    $ gcloud iam service-accounts create velero \
        --display-name "Velero Storage"
  6. 创建 SERVICE_ACCOUNT_EMAIL 变量:

    $ SERVICE_ACCOUNT_EMAIL=`gcloud iam service-accounts list \
      --filter="displayName:Velero Storage" \
      --format 'value(email)'`
  7. 创建 ROLE_PERMISSIONS 变量:

    $ ROLE_PERMISSIONS=(
        compute.disks.get
        compute.disks.create
        compute.disks.createSnapshot
        compute.snapshots.get
        compute.snapshots.create
        compute.snapshots.useReadOnly
        compute.snapshots.delete
        compute.zones.get
    )
  8. 创建 velero.server 自定义角色:

    $ gcloud iam roles create velero.server \
        --project $PROJECT_ID \
        --title "Velero Server" \
        --permissions "$(IFS=","; echo "${ROLE_PERMISSIONS[*]}")"
  9. 为项目添加 IAM 策略绑定:

    $ gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member serviceAccount:$SERVICE_ACCOUNT_EMAIL \
        --role projects/$PROJECT_ID/roles/velero.server
  10. 更新 IAM 服务帐户:

    $ gsutil iam ch serviceAccount:$SERVICE_ACCOUNT_EMAIL:objectAdmin gs://${BUCKET}
  11. 将 IAM 服务帐户的密钥保存到当前目录中的 credentials-velero 文件中:

    $ gcloud iam service-accounts keys create credentials-velero \
      --iam-account $SERVICE_ACCOUNT_EMAIL

2.3.4. 将 Microsoft Azure Blob 存储容器配置为复制存储库

您可以将 Microsoft Azure Blob 存储容器配置为 Migration Toolkit for Containers(MTC)的复制仓库。

先决条件

  • 您必须具有 Azure 存储帐户
  • 您必须安装了 Azure CLI
  • Azure Blob 存储容器必须可以被源和目标集群访问。
  • 如果您使用快照复制方法:

    • 源和目标集群必须位于同一区域。
    • 源和目标集群必须具有相同的存储类。
    • 存储类必须与快照兼容。

流程

  1. 设置 AZURE_RESOURCE_GROUP 变量:

    $ AZURE_RESOURCE_GROUP=Velero_Backups
  2. 创建 Azure 资源组:

    $ az group create -n $AZURE_RESOURCE_GROUP --location <CentralUS> 1
    1
    指定位置。
  3. 设置 AZURE_STORAGE_ACCOUNT_ID 变量:

    $ AZURE_STORAGE_ACCOUNT_ID=velerobackups
  4. 创建 Azure 存储帐户:

    $ az storage account create \
      --name $AZURE_STORAGE_ACCOUNT_ID \
      --resource-group $AZURE_RESOURCE_GROUP \
      --sku Standard_GRS \
      --encryption-services blob \
      --https-only true \
      --kind BlobStorage \
      --access-tier Hot
  5. 设置 BLOB_CONTAINER 变量:

    $ BLOB_CONTAINER=velero
  6. 创建 Azure Blob 存储容器:

    $ az storage container create \
      -n $BLOB_CONTAINER \
      --public-access off \
      --account-name $AZURE_STORAGE_ACCOUNT_ID
  7. velero 创建服务主体和凭证:

    $ AZURE_SUBSCRIPTION_ID=`az account list --query '[?isDefault].id' -o tsv` \
      AZURE_TENANT_ID=`az account list --query '[?isDefault].tenantId' -o tsv` \
      AZURE_CLIENT_SECRET=`az ad sp create-for-rbac --name "velero" --role "Contributor" --query 'password' -o tsv` \
      AZURE_CLIENT_ID=`az ad sp list --display-name "velero" --query '[0].appId' -o tsv`
  8. credentials-velero 文件中保存服务主体的凭证:

    $ cat << EOF  > ./credentials-velero
    AZURE_SUBSCRIPTION_ID=${AZURE_SUBSCRIPTION_ID}
    AZURE_TENANT_ID=${AZURE_TENANT_ID}
    AZURE_CLIENT_ID=${AZURE_CLIENT_ID}
    AZURE_CLIENT_SECRET=${AZURE_CLIENT_SECRET}
    AZURE_RESOURCE_GROUP=${AZURE_RESOURCE_GROUP}
    AZURE_CLOUD_NAME=AzurePublicCloud
    EOF