在IBM Cloud账户之间迁移Block Storage for VPC应用程序和数据
虚拟私有云
在本教程中,您将把一个账户中的Block Storage for VPC应用程序和快照数据从IBM Cloud Kubernetes Service集群迁移到另一个账户中的Red Hat OpenShift on IBM Cloud集群。
先决条件
账户 1
在账户 1 中,您必须具备以下条件。
-
一个IBM Cloud Kubernetes Service集群。
-
使用Block Storage for VPC和应用程序数据快照的应用程序。 有关更多信息,请参阅 使用Block Storage for VPC集群附加组件设置快照。
账户 2
在账户 2(要迁移到的目标账户)中,必须具备以下条件。
- Red Hat OpenShift on IBM Cloud集群。
获取账户 ID
账户 1 账户 2
从账户设置 页面获取每个账户的账户 ID。
设置权限
账户 1
在账户 1 中,从 IAM 授权页面赋予账户访问 VPC 的Block Storage快照的权限。
- 在源账户面板中,选择特定账户,然后输入账户 2 的账户 ID。
- 在服务面板中,选择 VPC 基础设施服务。
- 在资源面板中,选择特定资源,然后选择 VPC 的Block Storage快照。
- 可选您还可以通过添加条件,将授权范围扩大到特定快照或特定资源组。
账户 2
在 "账户 2 "中,从 "IAM 用户 "页面,赋予完成本教程的用户 "快照远程账户恢复器"权限。
- 选择要为其分配快照远程帐户恢复器权限的用户。
- 在“访问”选项卡上,单击“分配访问”。
- 在服务字段中,选择 VPC 基础设施服务。
- 在资源字段中,选择特定资源,然后选择资源类型和 VPC 的Block Storage快照。
- 在角色和操作中,选择快照远程账户恢复器。
- 单击“添加”,然后单击“分配”完成访问权限的分配。
可选:部署应用程序
账户 1
如果还没有要迁移的应用程序,可以部署以下示例应用程序。
-
验证附加组件状态是否为
normal
,状态是否为Ready
。ibmcloud ks cluster addon ls --cluster CLUSTER-ID
Name Version Health State Health Status vpc-block-csi-driver 5.0 normal Addon Ready. For more info: http://ibm.biz/addon-state (H1500)
-
验证驱动程序 pod 是否已部署,状态是否为
Running
。kubectl get pods -n kube-system | grep vpc-block-csi
示例输出
ibm-vpc-block-csi-controller-0 7/7 Running 0 77s ibm-vpc-block-csi-node-56c85 4/4 Running 0 77s ibm-vpc-block-csi-node-87j2t 4/4 Running 0 77s ibm-vpc-block-csi-node-cmh2h 4/4 Running 0 77s
-
创建一个 PVC。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: csi-block-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: ibmc-vpc-block-5iops-tier
kubectl create -f pvc.yaml
-
验证 PVC 是否已创建并处于
Bound
状态。kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE csi-block-pvc Bound pvc-0798b499-0b61-4f57-a184-4caeb7b9298d 10Gi RWO ibmc-vpc-block-5iops-tier 4m22s
-
为部署创建 YAML 配置文件,挂载您创建的 PVC。
apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment labels: app: my-deployment spec: replicas: 1 selector: matchLabels: app: my-deployment template: metadata: labels: app: my-deployment spec: containers: - image: nginx # Your containerized app image name: container-name volumeMounts: - mountPath: /myvolumepath # Mount path for PVC name: my-vol # Volume mount name volumes: - name: my-vol # Volume resource name persistentVolumeClaim: claimName: csi-block-pvc # The name of the PVC you created earlier
kubectl create -f pod.yaml
-
验证 pod 是否在群集中运行。
kubectl get pods
NAME READY STATUS RESTARTS AGE my-deployment-58dd7c89b6-8zdcl 1/1 Running 0 4m50s
-
现在您已经创建了 pod,请登录 pod 并创建一个用于快照的文本文件。
kubectl exec -it POD_NAME /bin/bash
示例输出
root@my-deployment-58dd7c89b6-8zdcl:/# cd myvolumepath/ root@my-deployment-58dd7c89b6-8zdcl:/myvolumepath# echo "hi" > new.txt root@my-deployment-58dd7c89b6-8zdcl:/myvolumepath# exit
创建快照
账户 1
创建部署和 PVC 后,即可创建卷快照资源。
只有当卷连接到 pod 时,才能创建快照。
-
使用启用附加组件时部署的
ibmc-vpcblock-snapshot
快照类,在群集中创建卷快照资源。 将以下VolumeSnapshot配置保存到名为snapvol.yaml
.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: snapshot-csi-block-pvc spec: volumeSnapshotClassName: ibmc-vpcblock-snapshot source: persistentVolumeClaimName: csi-block-pvc
kubectl create -f snapvol.yaml
-
验证快照是否可以使用,并记下
SNAPSHOTCONTENT
。kubectl get volumesnapshots
输出示例,其中
READYTOUSE
为true
。NAME READYTOUSE SOURCEPVC SOURCESNAPSHOTCONTENT RESTORESIZE SNAPSHOTCLASS SNAPSHOTCONTENT CREATIONTIME AGE ibmc-vpcblock-snapshot true csi-block-pvc 1Gi ibmc-vpcblock-snapshot snapcontent-9c374fbf-43a6-48d6-afc5-e76e1ab7c12b 18h 18h
获取快照详情
账户 1
-
Get the details of your
volumesnapshotcontent
by using theSNAPSHOTCONTENT
you found in the previous step.kubectl describe volumesnapshotcontent snapcontent-9c374fbf-43a6-48d6-afc5-e76e1ab7c12b
示例输出
Name: snapcontent-995f295b-6036-4d67-ab03-bba8557a0884 Namespace: Labels: <none> Annotations: <none> API Version: snapshot.storage.k8s.io/v1 Kind: VolumeSnapshotContent Metadata: Creation Timestamp: 2024-09-24T11:08:18Z Finalizers: snapshot.storage.kubernetes.io/volumesnapshotcontent-bound-protection Generation: 1 Managed Fields: API Version: snapshot.storage.k8s.io/v1 Fields Type: FieldsV1 fieldsV1: f:metadata: f:finalizers: .: v:"snapshot.storage.kubernetes.io/volumesnapshotcontent-bound-protection": f:spec: .: f:deletionPolicy: f:driver: f:source: .: f:volumeHandle: f:sourceVolumeMode: f:volumeSnapshotClassName: f:volumeSnapshotRef: Manager: snapshot-controller Operation: Update Time: 2024-09-24T11:08:18Z API Version: snapshot.storage.k8s.io/v1 Fields Type: FieldsV1 fieldsV1: f:status: .: f:creationTime: f:readyToUse: f:restoreSize: f:snapshotHandle: Manager: csi-snapshotter Operation: Update Subresource: status Time: 2024-09-24T11:08:43Z Resource Version: 1501448 UID: ad50aa42-8056-4264-9188-a13da3aaebca Spec: Deletion Policy: Delete Driver: vpc.block.csi.ibm.io Source: Volume Handle: r134-c7e32d5b-3a42-4d3e-b5e9-772b84566eaf Source Volume Mode: Filesystem Volume Snapshot Class Name: ibmc-vpcblock-snapshot-delete Volume Snapshot Ref: API Version: snapshot.storage.k8s.io/v1 Kind: VolumeSnapshot Name: new-snapshot-with-crn Namespace: default Resource Version: 1501308 UID: 995f295b-6036-4d67-ab03-bba8557a0884 Status: Creation Time: 1727176105000000000 Ready To Use: true Restore Size: 10737418240 Snapshot Handle: crn:v1:staging:public:is:us-south:a/1152aa1c1ec54274ac42b8ad8507c90c::snapshot:r134-12f0bdb5-21e6-4e6b-8b5c-ce9a1b378ec5 Events: <none>
-
在输出结果中,记下
Snapshot Handle
。 在本例中,它是crn:v1:staging:public:is:us-south:a/1152aa1c1ec54274ac42b8ad8507c90c::snapshot:r134-12f0bdb5-21e6-4e6b-8b5c-ce9a1b378ec5
。
恢复账户 2 中的快照
账户 2
-
创建 "
VolumeSnapshotContent
资源。 将以下配置保存为名为volsnapcontent.yaml
.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotContent metadata: name: crossaccount-snapshot-cnt spec: volumeSnapshotClassName: ibmc-vpcblock-snapshot-retain deletionPolicy: Retain driver: vpc.block.csi.ibm.io source: snapshotHandle: CRN # Enter the CRN of the snapshot you created earlier. For example crn:v1:public:is:us-south:a/8ee729d7f903db130b00257d91b6977f::snapshot:r134-64c3ad8e-786e-4f54-9b63-388615811ba6 volumeSnapshotRef: name: crossaccount-snapshot namespace: default
-
在群集中创建 "
VolumeSnapshotContent
。kubectl apply -f volsnapcontent.yaml
示例输出
volumesnapshot.snapshot.storage.k8s.io/crossaccount-snapshot created
-
创建一个
VolumeSnapshot
。 将以下配置保存为名为volsnap.yaml
.kind: VolumeSnapshot metadata: name: crossaccount-snapshot namespace: default spec: volumeSnapshotClassName: ibmc-vpcblock-snapshot-retain source: volumeSnapshotContentName: crossaccount-snapshot-cnt # Enter the name of the VolumeSnapshotContent that you created in the previous step.
-
在群集中创建 "
VolumeSnapshot
。kubectl apply -f volsnap.yaml
-
创建一个 PVC。 将以下配置保存为名为
pvc2.yaml
的文件apiVersion: v1 kind: PersistentVolumeClaim metadata: name: restore-cross-pvc spec: storageClassName: ibmc-vpc-block-5iops-tier dataSource: name: crossaccount-snapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 10Gi
-
在集群中创建 PVC。
kubectl apply -f pvc2.yaml
重新部署应用程序
账户 2
-
复制以下部署示例并将其保存到名为
dep2.yaml
.apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment labels: app: my-deployment spec: replicas: 1 selector: matchLabels: app: my-deployment template: metadata: labels: app: my-deployment spec: containers: - image: nginx # Your containerized app image name: container-name volumeMounts: - mountPath: /myvolumepath # Mount path for PVC name: my-vol # Volume mount name volumes: - name: my-vol # Volume resource name persistentVolumeClaim: claimName: restore-cross-pvc # The name of the PVC you created earlier
kubectl create -f dep2.yaml
-
验证 pod 是否在群集中运行。
kubectl get pods
NAME READY STATUS RESTARTS AGE my-deployment-58dd7c89b6-8zdcl 1/1 Running 0 4m50s
继续将快照和应用程序迁移到账户 2
账户 2
对要跨账户迁移的其他快照和应用程序重复本教程。