1.4. 配置复制存储库
您必须将对象存储配置为用作复制存储库。集群应用程序迁移工具将数据从源集群复制到复制存储库,然后使用文件系统或者快照数据复制方法从复制存储库复制到目标集群。
支持以下存储供应商:
- 通用 S3 对象存储,例如 Minio 或 Ceph S3
- 多云对象网关 (MCG)
- Amazon Web Services (AWS) S3
- Google Cloud Provider (GCP)
- Microsoft Azure
1.4.1. 了解用于迁移的数据复制方法
CAM 工具支持文件系统和快照数据复制方法,用于将数据从源集群迁移到目标集群。您可以选择适合于您的环境并受您的存储供应商支持的方法。
1.4.1.1. 文件系统复制方法
CAM 工具将数据文件从源集群复制到复制存储库,并从那里复制到目标集群。
优点 | 限制: |
---|---|
|
|
1.4.1.2. 快照复制方法
CAM 工具将源集群的数据快照复制到云供应商的对象存储,后者配置为复制存储库。数据在目标集群上恢复。
AWS、Google Cloud Provider 和 Microsoft Azure 支持快照复制方法。
优点 | 限制: |
---|---|
|
|
将多云对象网关(MCG)配置为迁移的复制存储库只是技术预览功能。红帽产品服务等级协议 (SLA) 不支持技术预览功能,并且这些功能可能并不完善。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的详情,请参阅 https://access.redhat.com/support/offerings/techpreview/。
1.4.2. 配置 MCG 存储桶做为复制存储库
您可以安装 OpenShift Container Storage Operator,并将一个 Multi-Cloud Object Gateway (MCG) 存储桶配置为复制存储库。
1.4.2.1. 安装 OpenShift Container Storage Operator
您可以从 OperatorHub 安装 OpenShift Container Storage Operator。
流程
-
在 OpenShift Container Platform web 控制台中,点 Administration
Namespaces。 - 点 Create Namespace。
-
在 Name 字段中输入
openshift-storage
,点 Create。 -
点 Operators
OperatorHub。 - 使用 Filter by keyword (本例中为 OCS)来查找 OpenShift Container Storage Operator。
- 选择 OpenShift Container Storage Operator 并点 Install。
-
在 Create Operator Subscription 页面中,选择
openshift-storage
命名空间。 - 指定您的更新频道和批准策略。
点 Subscribe。
在 Installed Operators 页面中,OpenShift Container Storage Operator 会出现在 openshift-storage 项目中,状态为 Succeeded。
1.4.2.2. 创建 Multi-Cloud Object Gateway 存储桶
您可以创建 Multi-Cloud Object Gateway (MCG) 存储桶的自定义资源 (CR) 。
流程
登录到 OpenShift Container Platform 集群:
$ oc login
使用以下内容创建
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
创建
NooBaa
对象:$ oc create -f noobaa.yml
使用以下内容创建
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
创建
BackingStore
对象:$ oc create -f bs.yml
使用以下内容创建
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
创建
BucketClass
对象:$ oc create -f bc.yml
使用以下内容创建
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
- 记录下在 CAM web 控制台中添加为复制存储库的存储桶的名称。
创建
ObjectBucketClaim
对象:$ oc create -f obc.yml
监控资源创建过程以验证
ObjectBucketClaim
的状态变为Bound
:$ watch -n 30 'oc get -n openshift-storage objectbucketclaim migstorage -o yaml'
这个过程可能需要五到十分钟。
获取并记录以下值,当您将复制存储库添加到 CAM 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 -d
S3 provider secret access key:
$ oc get secret -n openshift-storage migstorage -o go-template='{{ .data.AWS_SECRET_ACCESS_KEY }}' | base64 -d
1.4.3. 将 AWS S3 存储桶配置为复制存储库
您可以将 AWS S3 存储桶配置为复制存储库。
先决条件
- AWS S3 存储桶必须可以被源和目标集群访问。
- 您必须安装了 AWS CLI。
如果您使用快照复制方法:
- 您必须有权访问 EC2 Elastic Block Storage (EBS)。
- 源和目标集群必须位于同一区域。
- 源和目标集群必须具有相同的存储类。
- 存储类必须与快照兼容。
流程
创建 AWS S3 存储桶:
$ aws s3api create-bucket \ --bucket <bucket_name> \ 1 --region <bucket_region> 2
创建 IAM 用户
velero
:$ aws iam create-user --user-name velero
创建 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
为一个或所有 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
"Resource": [ "arn:aws:s3:::*"
将 EC2 EBS 策略附加到
velero
:$ aws iam put-user-policy \ --user-name velero \ --policy-name velero-ebs \ --policy-document file://velero-ec2-snapshot-policy.json
将 AWS S3 策略附加到
velero
:$ aws iam put-user-policy \ --user-name velero \ --policy-name velero-s3 \ --policy-document file://velero-s3-policy.json
为
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.4.4. 将 Google Cloud Provider 存储桶配置为复制存储库
您可以将 Google Cloud Provider (GCP) 存储桶配置为复制存储库。
先决条件
- AWS S3 存储桶必须可以被源和目标集群访问。
-
您必须安装了
gsutil
。 如果您使用快照复制方法:
- 源和目标集群必须位于同一区域。
- 源和目标集群必须具有相同的存储类。
- 存储类必须与快照兼容。
流程
运行
gsutil init
以登录:$ 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)?
设置
BUCKET
变量:$ BUCKET=<bucket_name> 1
- 1
- 指定存储桶名称。
创建存储桶:
$ gsutil mb gs://$BUCKET/
将
PROJECT_ID
变量设置为您的活跃项目:$ PROJECT_ID=$(gcloud config get-value project)
创建
velero
服务帐户:$ gcloud iam service-accounts create velero \ --display-name "Velero Storage"
将
SERVICE_ACCOUNT_EMAIL
变量设置为服务帐户的电子邮件地址:$ SERVICE_ACCOUNT_EMAIL=$(gcloud iam service-accounts list \ --filter="displayName:Velero Storage" \ --format 'value(email)')
向服务帐户授予权限:
$ 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 ) gcloud iam roles create velero.server \ --project $PROJECT_ID \ --title "Velero Server" \ --permissions "$(IFS=","; echo "${ROLE_PERMISSIONS[*]}")" gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$SERVICE_ACCOUNT_EMAIL \ --role projects/$PROJECT_ID/roles/velero.server gsutil iam ch serviceAccount:$SERVICE_ACCOUNT_EMAIL:objectAdmin gs://${BUCKET}
将服务帐户的密钥保存到当前目录中的
credentials-velero
文件中:$ gcloud iam service-accounts keys create credentials-velero \ --iam-account $SERVICE_ACCOUNT_EMAIL
1.4.5. 将 Microsoft Azure Blob 存储容器配置为复制存储库
您可以将 Microsoft Azure Blob 存储容器配置为复制存储库。
先决条件
- 您必须具有 Azure 存储帐户。
- 您必须安装了 Azure CLI。
- Azure Blob 存储容器必须可以被源和目标集群访问。
如果您使用快照复制方法:
- 源和目标集群必须位于同一区域。
- 源和目标集群必须具有相同的存储类。
- 存储类必须与快照兼容。
流程
设置
AZURE_RESOURCE_GROUP
变量:$ AZURE_RESOURCE_GROUP=Velero_Backups
创建 Azure 资源组:
$ az group create -n $AZURE_RESOURCE_GROUP --location <CentralUS> 1
- 1
- 指定位置。
设置
AZURE_STORAGE_ACCOUNT_ID
变量:$ AZURE_STORAGE_ACCOUNT_ID=velerobackups
创建 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
设置
BLOB_CONTAINER
变量:$ BLOB_CONTAINER=velero
创建 Azure Blob 存储容器:
$ az storage container create \ -n $BLOB_CONTAINER \ --public-access off \ --account-name $AZURE_STORAGE_ACCOUNT_ID
为
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`
在
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