12.2. 从 VMware vSphere 源供应商迁移
您可以使用命令行界面(CLI)从 VMware vSphere 源供应商迁移。
防病毒软件可能会导致迁移失败。在开始迁移前,强烈建议从源虚拟机中删除这些软件。
MTV 不支持迁移 VMware Non-Volatile Memory Express (NVMe)磁盘。
要迁移具有共享磁盘的虚拟机(VM),请参阅使用 共享磁盘迁移虚拟机。
流程
为源供应商凭证创建
Secret清单:$ cat << EOF | oc apply -f - apiVersion: v1 kind: Secret metadata: name: <secret> namespace: <namespace> ownerReferences:1 - apiVersion: forklift.konveyor.io/v1beta1 kind: Provider name: <provider_name> uid: <provider_uid> labels: createdForProviderType: vsphere createdForResourceType: providers type: Opaque stringData: user: <user>2 password: <password>3 insecureSkipVerify: <"true"/"false">4 cacert: |5 <ca_certificate> url: <api_end_point>6 EOF- 1
ownerReferences部分是可选的。- 2
- 指定 vCenter 用户或 ESX/ESXi 用户。
- 3
- 指定 vCenter 用户或 ESX/ESXi 用户的密码。
- 4
- 指定
"true"以跳过证书验证,并指定"false"来验证证书。如果没有指定,则默认为 "false"。跳过证书验证会进行不安全的迁移,然后不需要证书。不安全的迁移意味着传输的数据通过安全连接发送,并可能会公开敏感数据。 - 5
- 如果没有设置此字段并禁用 跳过证书验证 时,MTV 会尝试使用系统 CA。
- 6
- 指定 vCenter 的 API 端点 URL 或 ESX/ESXi,例如
https://<vCenter_host>/sdk。
为源供应商创建
Provider清单:$ cat << EOF | oc apply -f - apiVersion: forklift.konveyor.io/v1beta1 kind: Provider metadata: name: <source_provider> namespace: <namespace> spec: type: vsphere url: <api_end_point>1 settings: vddkInitImage: <VDDK_image>2 sdkEndpoint: vcenter3 secret: name: <secret>4 namespace: <namespace> EOF
创建
主机清单:$ cat << EOF | oc apply -f - apiVersion: forklift.konveyor.io/v1beta1 kind: Host metadata: name: <vmware_host> namespace: <namespace> spec: provider: namespace: <namespace> name: <source_provider>1 id: <source_host_mor>2 ipAddress: <source_network_ip>3 EOF- 1
- 指定 VMware vSphere
ProviderCR 的名称。 - 2
- 指定 VMware vSphere 主机的 Managed Object Reference (moRef)。要检索 moRef,请参阅 检索 VMware vSphere moRef。
- 3
- 指定 VMware vSphere 迁移网络的 IP 地址。
创建
NetworkMap清单来映射源和目标网络:$ cat << EOF | oc apply -f - apiVersion: forklift.konveyor.io/v1beta1 kind: NetworkMap metadata: name: <network_map> namespace: <namespace> spec: map: - destination: name: <network_name> type: pod1 source:2 id: <source_network_id> name: <source_network_name> - destination: name: <network_attachment_definition>3 namespace: <network_attachment_definition_namespace>4 type: multus source: id: <source_network_id> name: <source_network_name> provider: source: name: <source_provider> namespace: <namespace> destination: name: <destination_provider> namespace: <namespace> EOF- 1
- 允许的值有
pod、multus,并忽略。使用忽略以避免在此迁移中将虚拟机附加到这个网络。 - 2
- 您可以使用
id或name参数来指定源网络。对于id,指定 VMware vSphere 网络受管对象参考(moRef)。要检索 moRef,请参阅 检索 VMware vSphere moRef。 - 3
- 为每个额外 OpenShift Virtualization 网络指定网络附加定义。
- 4
- 仅在
类型multus时才需要。指定 OpenShift Virtualization 网络附加定义的命名空间。
创建
StorageMap清单来映射源和目标存储:$ cat << EOF | oc apply -f - apiVersion: forklift.konveyor.io/v1beta1 kind: StorageMap metadata: name: <storage_map> namespace: <namespace> spec: map: - destination: storageClass: <storage_class> accessMode: <access_mode>1 source: id: <source_datastore>2 provider: source: name: <source_provider> namespace: <namespace> destination: name: <destination_provider> namespace: <namespace> EOF- 1
- 允许的值有
ReadWriteOnce和ReadWriteMany。 - 2
- 指定 VMware vSphere 数据存储 moRef。例如,
f2737930-b567-451a-9ceb-2887f6207009。要检索 moRef,请参阅 检索 VMware vSphere moRef。
可选:在
PlanCR 中指定的阶段创建一个Hook清单以在虚拟机中运行自定义代码:$ cat << EOF | oc apply -f - apiVersion: forklift.konveyor.io/v1beta1 kind: Hook metadata: name: <hook> namespace: <namespace> spec: image: quay.io/kubev2v/hook-runner serviceAccount:<service account>1 playbook: | LS0tCi0gbm...2 EOF注意您可以使用默认
hook-runner镜像或指定自定义镜像。如果指定自定义镜像,则不需要指定 playbook。
输入以下命令为 MTV 迁移创建传输网络的网络附加定义(NAD)。
您可以使用此定义为接口配置 IP 地址,可以从 Dynamic Host Configuration Protocol (DHCP)或静态方式配置。
配置 IP 地址可让接口访问配置的网关。
$ oc edit NetworkAttachmentDefinitions <name_of_the_NAD_to_edit> apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: name: <name_of_transfer_network> namespace: <namespace> annotations: forklift.konveyor.io/route: <IP_address>为迁移创建
Plan清单:$ cat << EOF | oc apply -f - apiVersion: forklift.konveyor.io/v1beta1 kind: Plan metadata: name: <plan>1 namespace: <namespace> spec: warm: false2 provider: source: name: <source_provider> namespace: <namespace> destination: name: <destination_provider> namespace: <namespace> map:3 network:4 name: <network_map>5 namespace: <namespace> storage:6 name: <storage_map>7 namespace: <namespace> preserveStaticIPs:8 networkNameTemplate: <network_interface_template>9 pvcNameTemplate: <pvc_name_template>10 pvcNameTemplateUseGenerateName: true11 skipGuestConversion: false12 targetNamespace: <target_namespace> useCompatibilityMode: true13 volumeNameTemplate: <volume_name_template>14 vms:15 - id: <source_vm1>16 - name: <source_vm2> networkNameTemplate: <network_interface_template_for_this_vm>17 pvcNameTemplate: <pvc_name_template_for_this_vm>18 volumeNameTemplate: <volume_name_template_for_this_vm>19 targetName: <target_name>20 hooks:21 - hook: namespace: <namespace> name: <hook>22 step: <step>23 EOF- 1
- 指定
PlanCR 的名称。 - 2
- 指定迁移是 warm -
true- 或 cold -false。如果您指定了 warm 迁移,且没有为Migration清单中的cutover参数指定一个值,则只有 precopy 阶段将运行。 - 3
- 每个计划仅指定一个网络映射和一个存储映射。
- 4
- 指定一个网络映射,即使要迁移的虚拟机没有分配给网络。在这种情况下,映射可以为空。
- 5
- 指定
NetworkMapCR 的名称。 - 6
- 指定一个存储映射,即使要迁移的虚拟机没有使用磁盘镜像分配。在这种情况下,映射可以为空。
- 7
- 指定
StorageMapCR 的名称。 - 8
- 默认情况下,虚拟网络接口控制器(vNIC)在迁移过程中会改变。因此,使用链接到客户端虚拟机中接口名称的静态 IP 地址的 vNIC 会丢失其 IP 地址。要避免这种情况,请将
preserveStaticIPs设置为true。MTV 对缺少 vNIC 属性的任何虚拟机发出警告消息。要检索任何缺少的 vNIC 属性,请在 vSphere 中运行这些虚拟机,以便向 MTV 报告 vNIC 属性。 - 9
- 可选。在计划中为虚拟机指定网络接口模板。模板遵循 Go 模板语法,并可访问以下变量:
-
.networkName:如果目标网络是multus,请添加 Multus 网络附加定义的名称。否则,将此变量留空。 -
.networkNamespace:如果目标网络是multus,请添加 Multus 网络附加定义所在的命名空间。 -
.networkType:指定网络类型。选项:multus或pod。 .NetworkIndex:网络接口的序列索引(0-based)。例子
-
"net-{{.NetworkIndex}}" {{if eq .NetworkType "pod"}}pod{{else}}multus-{{.NetworkIndex}}{{end}}"变量名称不能超过 63 个字符。此规则适用于网络名称网络模板、PVC 名称模板、虚拟机名称模板和卷名称模板。
-
- 10
- 可选。为计划指定持久性卷声明(PVC)名称模板。模板遵循 Go 模板语法,并可访问以下变量:
-
.vmname: 虚拟机的名称。 -
.PlanName: 迁移计划的名称。 -
.DiskIndex:磁盘的初始卷索引。 -
.RootDiskIndex:根磁盘索引。 .shared : Options:true,用于非共享卷的共享卷为false。例子
-
"{{.vmname}}-disk-{{.DiskIndex}}" -
"{{if eq .DiskIndex .RootDiskIndex}}root{{else}}data{{end}}-{{.DiskIndex}}" -
"{{if .Shared}}shared-{{end}}{{.VmName}}-{{.DiskIndex}}"
-
- 11
- 可选:
-
当设置为
true时,MTV 会将一个或多个随机生成的字母数字字符添加到 PVC 名称中,以确保所有 PVC 都有唯一的名称。 当设置为
false时,如果您指定了pvcNameTemplate,则 MTV 不会将此类字符添加到 PVC 的名称中。警告如果将
pvcNameTemplateUseGenerateName设置为false,则生成的 PVC 名称可能不是唯一的,并可能导致冲突。
-
当设置为
- 12
- 确定在使用
virt-v2v工具迁移前是否转换虚拟机,从而使虚拟机与 OpenShift Virtualization 兼容。-
当设置为
false时,默认值 MTV 使用virt-v2v迁移虚拟机。 当设置为
true时,MTV 使用原始复制模式迁移虚拟机,该模式可在不首先转换虚拟机的情况下复制它们。原始复制模式可在不使用
virt-v2v转换虚拟机的情况下复制虚拟机。这可以加快转换速度,迁移运行更广泛的操作系统的虚拟机,并支持使用 Linux Unified Key Setup (LUKS)加密的磁盘,而无需密钥。但是,使用原始复制模式迁移的虚拟机在 OpenShift Virtualization 中可能无法正常工作。有关virt-v2v的更多信息,请参阅 MTV 如何使用 virt-v2v 工具。
-
当设置为
- 13
- 确定当
skipGuestConversion为true时,迁移是否使用 VirtIO 设备或兼容性设备(SATA 总线、E1000E NIC),即原始副本模式用于迁移时。当skipGuestConversion为false时,useCompatibilityMode的设置无效,因为virt-v2v转换始终使用 VirtIO 设备。-
当设置为
true时,SPM 使用迁移过程中的兼容性设备(SATA 总线、E1000E NIC),以确保虚拟机在迁移后可以引导。 -
当设置为
false时,MTV 在迁移过程中使用高性能 VirtIO 设备,virt-v2v则确保虚拟机可在迁移后引导。在使用这个选项前,请验证源虚拟机中已安装了 VirtIO 驱动程序。
-
当设置为
- 14
- 可选:在计划中为虚拟机指定卷接口名称模板。模板遵循 Go 模板语法,并可访问以下变量:
-
.PVCName: 使用这个卷挂载到虚拟机的 PVC 名称。 .VolumeIndex:卷接口(0)的 Sequential 索引。例子
-
"disk-{{.VolumeIndex}}" -
"pvc-{{.PVCName}}"
-
- 15
- 您可以使用
id或name参数指定源虚拟机。 - 16
- 指定 VMware vSphere VM moRef。要检索 moRef,请参阅 检索 VMware vSphere moRef。
- 17
- 可选:指定特定虚拟机的网络接口名称。覆盖
spec:networkNameTemplate中设置的值。变量和示例,如调用 9 所示。 - 18
- 可选:指定特定虚拟机的 PVC 名称。覆盖
spec:pvcNameTemplate中设置的值。变量和示例如调用 10 所示。 - 19
- 可选:指定特定虚拟机的卷名称。覆盖
spec:volumeNameTemplate中设置的值。变量和示例,如调用 14 所示。 - 20
- 可选: MTV 会自动为目标虚拟机的名称。您可以使用此参数并输入新名称来覆盖此名称。您输入的名称必须是唯一的,且它必须是有效的 Kubernetes 子域。否则,迁移会自动失败。
- 21
- 可选:为虚拟机指定最多两个 hook。每个 hook 必须在不同的迁移步骤中运行。
- 22
- 指定
HookCR 的名称。 - 23
- 在迁移完成后,允许的值是
PreHook,然后迁移计划启动或PostHook。重要当您将 VMware 7 虚拟机迁移到使用 CentOS 7.9 的 OpenShift 4.13+ 平台时,网络接口的名称会改变,虚拟机的静态 IP 配置无法正常工作。
创建运行
PlanCR 的Migration清单:$ cat << EOF | oc apply -f - apiVersion: forklift.konveyor.io/v1beta1 kind: Migration metadata: name: <name_of_migration_cr> namespace: <namespace> spec: plan: name: <name_of_plan_cr> namespace: <namespace> cutover: <optional_cutover_time> EOF注意如果您指定了一个截止时间,请使用 ISO 8601 格式以及 UTC 时间偏移,例如
2024-04-04T01:23:45.678+09:00。
forklift-controller 存在一个无法协调迁移计划的问题,然后返回一个 HTTP 500 错误。当您只在虚拟机上指定用户权限时,会导致此问题。
在 MTV 中,您需要在数据中心级别添加权限,其中包括虚拟机使用的存储、网络、交换机等。然后您必须将权限传播到子元素。
如果您不想添加这个级别的权限,您必须手动将权限添加到虚拟机主机上的每个对象。
12.2.1. 检索 VMware vSphere moRef 复制链接链接已复制到粘贴板!
当您使用命令行使用 Migration Toolkit for Virtualization (MTV)迁移带有 VMware vSphere 源供应商的虚拟机时,您需要了解 vSphere 中特定实体的受管对象引用(moRef),如数据存储、网络和虚拟机。
您可以从 Inventory 服务检索一个或多个 vSphere 实体的 moRef。然后,您可以使用每个 moRef 作为检索另一个实体的 moRef 的参考。
流程
为项目检索路由:
oc get route -n openshift-mtv检索
Inventory服务路由:$ oc get route <inventory_service> -n openshift-mtv检索访问令牌:
$ TOKEN=$(oc whoami -t)检索 VMware vSphere 供应商的 moRef :
$ curl -H "Authorization: Bearer $TOKEN" https://<inventory_service_route>/providers/vsphere -k检索 VMware vSphere 源供应商的数据存储:
$ curl -H "Authorization: Bearer $TOKEN" https://<inventory_service_route>/providers/vsphere/<provider id>/datastores/ -k输出示例
[ { "id": "datastore-11", "parent": { "kind": "Folder", "id": "group-s5" }, "path": "/Datacenter/datastore/v2v_general_porpuse_ISCSI_DC", "revision": 46, "name": "v2v_general_porpuse_ISCSI_DC", "selfLink": "providers/vsphere/01278af6-e1e4-4799-b01b-d5ccc8dd0201/datastores/datastore-11" }, { "id": "datastore-730", "parent": { "kind": "Folder", "id": "group-s5" }, "path": "/Datacenter/datastore/f01-h27-640-SSD_2", "revision": 46, "name": "f01-h27-640-SSD_2", "selfLink": "providers/vsphere/01278af6-e1e4-4799-b01b-d5ccc8dd0201/datastores/datastore-730" }, ...
在本例中,数据存储 v2v_general_porpuse_ISCSI_DC 的 moRef 是 datastore-11,而数据存储 f01-h27-640-SSD_2 的 moRef 是 datastore-730。
12.2.3. 使用命令行界面取消迁移 复制链接链接已复制到粘贴板!
您可以使用命令行界面(CLI)在迁移过程中取消整个迁移或特定虚拟机的迁移。
12.2.3.1. 使用命令行界面取消整个迁移 复制链接链接已复制到粘贴板!
您可以使用命令行界面(CLI)在迁移过程中取消整个迁移。
流程
删除
MigrationCR:$ oc delete migration <migration> -n <namespace>1 - 1
- 指定
MigrationCR 的名称。
12.2.3.2. 使用命令行界面取消特定虚拟机的迁移 复制链接链接已复制到粘贴板!
您可以使用命令行界面(CLI)在迁移过程中取消特定虚拟机(VM)的迁移。
流程
将特定的虚拟机添加到
Migration清单的spec.cancel块中,如下例所示:$ cat << EOF | oc apply -f - apiVersion: forklift.konveyor.io/v1beta1 kind: Migration metadata: name: <migration> namespace: <namespace> ... spec: cancel: - id: vm-1021 - id: vm-203 name: rhel8-vm EOF- 1
- 您可以使用
id键或name键指定虚拟机。
id键的值是受管对象的引用(VMware VM),或 VM UUID(RHV VM)。检索
Migration自定义资源(CR)以监控剩余的虚拟机的进度,如下例所示:$ oc get migration/<migration> -n <namespace> -o yaml