安装并使用 Migration Toolkit for Virtualization

Migration Toolkit for Virtualization 2.2

从 VMware vSphere 或 Red Hat Virtualization 迁移到 Red Hat OpenShift Virtualization

摘要

Migration Toolkit for Virtualization(MTV)可让您将虚拟机从 VMware vSphere 或 Red Hat Virtualization 迁移到在 OpenShift Container Platform 上运行的 OpenShift Virtualization。

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息

第 1 章 关于 Migration Toolkit for Virtualization

您可以使用 Migration Toolkit for Virtualization(MTV)将虚拟机从 VMware vSphere 或 Red Hat Virtualization 迁移到 OpenShift Virtualization。

1.1. 关于冷和热迁移

MTV 支持从 Red Hat Virtualization 进行冷迁移,以及 VMware vSphere 的后续迁移。

1.1.1. 冷迁移

冷迁移是默认的迁移类型。源虚拟机在复制数据时关闭。

1.1.2. 热迁移

在源虚拟机(VM)正在运行时,大多数数据都会在 precopy 阶段复制。

然后,虚拟机将关闭,并在 剪切 阶段复制剩余的数据。

Precopy stage

在 precopy 阶段不会关闭虚拟机。

VM 磁盘使用 更改的块跟踪(CBT) 快照逐步复制。快照默认以一小时的间隔创建。您可以通过更新 forklift-controller 部署来更改快照间隔。

重要

您必须为每个源虚拟机和每个虚拟机磁盘启用 CBT。

虚拟机可以最多支持 28 CBT 快照。如果源虚拟机有太多 CBT 快照,且 Migration Controller 服务无法创建新快照,则 warm 迁移可能会失败。当不再需要快照时,Migration Controller 服务会删除每个快照。

precopy 阶段会运行,直到手动启动或计划启动 cutover 阶段为止。

cutover 阶段

虚拟机在 cutover 阶段关闭,剩余的数据被迁移。存储在 RAM 中的数据不会迁移。

您可以使用 MTV 控制台手动启动 cutover 阶段,或者在 Migration 清单中调度剪切时间。

第 2 章 先决条件

查看以下先决条件,以确保您的环境为迁移准备。

2.1. 软件要求

您必须安装 兼容版本的 OpenShift Container Platform 和 OpenShift Virtualization。

2.2. 存储支持和默认模式

MTV 对支持的存储使用以下默认卷和访问模式。

注意

如果 OpenShift Virtualization 存储不支持 动态置备,MTV 应用默认设置:

  • 文件系统 卷模式

    文件系统 卷模式比 Block 卷模式慢。

  • ReadWriteOnce 访问模式

    ReadWriteOnce 访问模式不支持实时迁移。

表 2.1. 默认卷和访问模式

provisioner卷模式访问模式

kubernetes.io/aws-ebs

Block

ReadWriteOnce

kubernetes.io/azure-disk

Block

ReadWriteOnce

kubernetes.io/azure-file

Filesystem

ReadWriteMany

kubernetes.io/cinder

Block

ReadWriteOnce

kubernetes.io/gce-pd

Block

ReadWriteOnce

kubernetes.io/hostpath-provisioner

Filesystem

ReadWriteOnce

manila.csi.openstack.org

Filesystem

ReadWriteMany

openshift-storage.cephfs.csi.ceph.com

Filesystem

ReadWriteMany

openshift-storage.rbd.csi.ceph.com

Block

ReadWriteOnce

kubernetes.io/rbd

Block

ReadWriteOnce

kubernetes.io/vsphere-volume

Block

ReadWriteOnce

2.3. 网络先决条件

以下先决条件适用于所有迁移:

  • 迁移之前或之后不得更改 IP 地址、VLAN 和其他网络配置设置。在迁移过程中保留虚拟机的 MAC 地址。
  • 源环境、OpenShift Virtualization 集群和复制存储库之间的网络连接必须可靠且不间断。
  • 如果要映射多个源和目的地网络,您必须为每个额外目标网络创建一个 网络附加定义

2.3.1. 端口

防火墙必须启用以下端口的流量:

表 2.2. 从 VMware vSphere 迁移所需的网络端口

端口协议目的地用途

443

TCP

OpenShift nodes

VMware vCenter

VMware 供应商清单

磁盘传输身份验证

443

TCP

OpenShift nodes

VMware ESXi 主机

磁盘传输身份验证

902

TCP

OpenShift nodes

VMware ESXi 主机

磁盘传输数据复制

表 2.3. 从 Red Hat Virtualization 迁移所需的网络端口

端口协议目的地用途

443

TCP

OpenShift nodes

RHV Engine

RHV 供应商清单

磁盘传输身份验证

443

TCP

OpenShift nodes

RHV 主机

磁盘传输身份验证

54322

TCP

OpenShift nodes

RHV 主机

磁盘传输数据复制

2.4. 源虚拟机先决条件

以下先决条件适用于所有迁移:

  • 必须卸载 ISO/CDROM 磁盘。
  • 每个 NIC 必须包含一个 IPv4 和/或一个 IPv6 地址。
  • 虚拟机名称必须仅包含小写字母(a-z)、数字(0-9)或连字符(-),最多 253 个字符。第一个和最后一个字符必须为字母数字。名称不得包含大写字母、空格、句点 (.) 或特殊字符。
  • 虚拟机名称不得在 OpenShift Virtualization 环境中复制虚拟机的名称。
  • 虚拟机操作系统必须经过认证并可作为 带 OpenShift Virtualization 的客户机操作系统,并使用 virt-v2v转换为 KVM

2.5. Red Hat Virtualization 的先决条件

以下先决条件适用于 Red Hat Virtualization 迁移:

  • 您必须使用 Red Hat Virtualization 的 兼容版本
  • 您必须具有 Manager 的 CA 证书。

    您可以在浏览器中导航到 https://<engine_host>/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA 来获取 CA 证书。

2.6. VMware 的先决条件

以下先决条件适用于 VMware 迁移:

  • 您必须使用 兼容 VMware vSphere 版本
  • 您必须在所有源虚拟机(VM)上安装 VMware Tools
  • 如果您正运行 warm 迁移,则必须在虚拟机和 VM 磁盘中启用 已更改的块跟踪(CBT)
  • 您必须创建一个 VMware Virtual Disk Development Kit(VDDK)镜像。
  • 您必须获取 vCenter 主机的 SHA-1 指纹。
  • 如果您要从同一迁移计划中的 ESXi 主机迁移超过 10 个虚拟机,您必须增加主机的 NFC 服务内存。

2.6.1. 创建 VDDK 镜像

Migration Toolkit for Virtualization(MTV)使用 VMware Virtual Disk Development Kit(VDDK)SDK 从 VMware vSphere 传输虚拟磁盘。

您必须下载 VMware Virtual Disk Development Kit(VDDK),构建 VDDK 镜像,并将 VDDK 镜像推送到您的镜像 registry。之后,您要将 VDDK 镜像添加到 HyperConverged 自定义资源(CR)。

注意

在公共 registry 中存储 VDDK 镜像可能会违反 VMware 许可证条款。

先决条件

流程

  1. 创建并导航到临时目录:

    $ mkdir /tmp/<dir_name> && cd /tmp/<dir_name>
  2. 在浏览器中,导航到 VMware VDDK 下载页面
  3. 选择最新的 VDDK 版本并点 Download
  4. 将 VDDK 归档文件保存到临时目录中。
  5. 提取 VDDK 归档:

    $ tar -xzf VMware-vix-disklib-<version>.x86_64.tar.gz
  6. 创建 Dockerfile

    $ cat > Dockerfile <<EOF
    FROM registry.access.redhat.com/ubi8/ubi-minimal
    COPY vmware-vix-disklib-distrib /vmware-vix-disklib-distrib
    RUN mkdir -p /opt
    ENTRYPOINT ["cp", "-r", "/vmware-vix-disklib-distrib", "/opt"]
    EOF
  7. 构建 VDDK 镜像:

    $ podman build . -t <registry_route_or_server_path>/vddk:<tag>
  8. 将 VDDK 镜像推送到 registry:

    $ podman push <registry_route_or_server_path>/vddk:<tag>
  9. 确保镜像可以被 OpenShift Virtualization 环境访问。

2.6.2. 获取 vCenter 主机的 SHA-1 指纹

您必须获取 vCenter 主机的 SHA-1 指纹,才能创建 Secret CR。

流程

  • 运行以下命令:

    $ openssl s_client \
        -connect <vcenter_host>:443 \ 1
        < /dev/null 2>/dev/null \
        | openssl x509 -fingerprint -noout -in /dev/stdin \
        | cut -d '=' -f 2
    1
    指定 vCenter 主机的 IP 地址或 FQDN。

    输出示例

    01:23:45:67:89:AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45:67

2.6.3. 增加 ESXi 主机的 NFC 服务内存

如果您要从同一迁移计划中的 ESXi 主机迁移超过 10 个虚拟机,您必须增加主机的 NFC 服务内存。否则,迁移将失败,因为 NFC 服务内存限制为 10 个并行连接。

流程

  1. 以 root 用户身份登录 ESXi 主机。
  2. /etc/vmware/hostd/config.xml 中将 maxMemory 改为 1000000000:

    ...
          <nfcsvc>
             <path>libnfcsvc.so</path>
             <enabled>true</enabled>
             <maxMemory>1000000000</maxMemory>
             <maxStreamMemory>10485760</maxStreamMemory>
          </nfcsvc>
    ...
  3. 重启 hostd

    # /etc/init.d/hostd restart

    您不需要重启主机。

2.7. 软件兼容性指南

您必须安装兼容软件版本。

表 2.4. 兼容软件版本

Migration Toolkit for VirtualizationOpenShift Container PlatformOpenShift VirtualizationVMware vSphereRed Hat Virtualization

2.2

4.9

4.9.1

6.5 或更高版本

4.3 或更高版本

第 3 章 安装 MTV Operator

您可以使用 OpenShift Container Platform Web 控制台或命令行界面(CLI)安装 MTV Operator。

3.1. 使用 OpenShift Container Platform Web 控制台安装 MTV Operator

您可以使用 OpenShift Container Platform Web 控制台安装 MTV Operator。

先决条件

  • 安装了 OpenShift Container Platform 4.9。
  • 安装了 OpenShift Virtualization Operator。
  • 您必须以具有 cluster-admin 权限的用户身份登录。

流程

  1. 在 OpenShift Container Platform Web 控制台中,点击 OperatorsOperatorHub
  2. 使用 Filter by keyword 字段搜索 mtv-operator
  3. Virtualization Operator 的 Migration Tookit,然后点 Install
  4. Install Operator 页面中,点 Install
  5. OperatorsInstalled Operators 来验证 openshift-mtv 项目中是否出现在 openshift-mtv 项目中,状态为 Succeeded
  6. Virtualization Operator 的 Migration Tookit
  7. Provided APIs 下,找到 ForkliftController,再单击 Create Instance
  8. Create
  9. WorkloadsPods 来验证 MTV pod 是否正在运行。

获取 MTV Web 控制台 URL

您可以使用 OpenShift Container Platform Web 控制台获取 MTV Web 控制台 URL。

先决条件

  • 已安装 OpenShift Virtualization Operator。
  • 已安装 MTV Operator。
  • 您必须以具有 cluster-admin 权限的用户身份登录。

流程

  1. 登陆到 OpenShift Container Platform Web 控制台。
  2. NetworkingRoutes
  3. 选择 Project: 列表中的 openshift-mtv 项目。
  4. 单击 forklift-ui 服务的 URL,以打开 MTV Web 控制台的登录页面。

3.2. 使用命令行界面安装 MTV Operator

您可以使用命令行界面(CLI)安装 MTV Operator。

先决条件

  • 安装了 OpenShift Container Platform 4.9。
  • 安装了 OpenShift Virtualization Operator。
  • 您必须以具有 cluster-admin 权限的用户身份登录。

流程

  1. 创建 openshift-mtv 项目:

    $ cat << EOF | oc apply -f -
    apiVersion: project.openshift.io/v1
    kind: Project
    metadata:
      name: openshift-mtv
    EOF
  2. 创建名为 migrationOperatorGroup CR:

    $ cat << EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: migration
      namespace: openshift-mtv
    spec:
      targetNamespaces:
        - openshift-mtv
    EOF
  3. 为 Operator 创建 Subscription CR:

    $ cat << EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: mtv-operator
      namespace: openshift-mtv
    spec:
      channel: release-v2.2.0
      installPlanApproval: Automatic
      name: mtv-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
      startingCSV: "mtv-operator.2.2.0"
    EOF
  4. 创建一个 ForkliftController CR:

    $ cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: ForkliftController
    metadata:
      name: forklift-controller
      namespace: openshift-mtv
    spec:
      olm_managed: true
    EOF
  5. 验证 MTV pod 是否正在运行:

    $ oc get pods -n openshift-mtv

    输出示例

    NAME                                  READY  STATUS   RESTARTS  AGE
    forklift-controller-788bdb4c69-mw268  2/2    Running  0         2m
    forklift-operator-6bf45b8d8-qps9v     1/1    Running  0         5m
    forklift-ui-7cdf96d8f6-xnw5n          1/1    Running  0         2m

获取 MTV Web 控制台 URL

您可以从命令行获取 MTV web 控制台 URL。

先决条件

  • 已安装 OpenShift Virtualization Operator。
  • 已安装 MTV Operator。
  • 您必须以具有 cluster-admin 权限的用户身份登录。

流程

  1. 获取 MTV Web 控制台 URL:

    $ oc get route virt -n openshift-mtv \
      -o custom-columns=:.spec.host

    输出示例

    https://virt-openshift-mtv.apps.cluster.openshift.com.

  2. 启动浏览器并导航到 MTV Web 控制台。

第 4 章 使用 MTV web 控制台迁移虚拟机

您可以使用 MTV web 控制台将虚拟机迁移到 OpenShift Virtualization。

重要

您必须确保满足所有 先决条件

4.1. 添加供应商

您可以使用 MTV web 控制台添加供应商。

4.1.1. 添加 VMware 源供应商

您可以使用 MTV web 控制台添加 VMware 源供应商。

先决条件

  • 您必须具有 VMware admin 权限。
  • vCenter SHA-1 指纹.
  • 在所有集群可以访问的安全 registry 中的 VMware Virtual Disk Development Kit(VDDK)镜像。

流程

  1. 将 VDDK 镜像添加到 HyperConverged CR:

    $ cat << EOF | oc apply -f -
    apiVersion: hco.kubevirt.io/v1beta1
    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
      namespace: openshift-cnv
    spec:
      vddkInitImage: <registry_route_or_server_path>/vddk:<tag> 1
    EOF
    1
    指定您创建的 VDDK 镜像。
  2. 在 MTV web 控制台中,单击 Providers
  3. Add provider
  4. Type 列表中选择 VMware
  5. 填写以下字段:

    • 名称 :要在供应商列表中显示的名称
    • 主机名或 IP 地址 : vCenter 主机名或 IP 地址
    • 用户名 : vCenter admin 用户,例如 administrator@vsphere.local
    • 密码 : vCenter admin 密码
    • SHA-1 指纹 : vCenter SHA-1 指纹
  6. Add 添加并保存该提供程序。

    源供应商会出现在提供程序列表中。

4.1.1.1. 为 VMware 源供应商选择迁移网络

您可以在 MTV web 控制台中为 VMware 源供应商选择迁移网络,以降低源环境的风险并提高性能。

将默认网络用于迁移可能会导致性能降低,因为网络可能没有足够的带宽。这种情形可以对源平台产生负面影响,因为磁盘传输操作可能会使网络饱和。

先决条件

  • 迁移网络必须具有足够的吞吐量,最小 10 Gbps 的速度用于磁盘传输。
  • OpenShift Virtualization 节点必须可通过默认网关访问迁移网络。

    注意

    源虚拟磁盘由连接到目标命名空间的 pod 网络的 pod 复制。

  • 迁移网络必须启用巨型帧。

流程

  1. 在 MTV web 控制台中点 Providers
  2. VMware 标签页。
  3. 单击提供程序旁边的 Hosts 列中的主机编号,以查看主机列表。
  4. 选择一个或多个主机并点击 Select migration network
  5. 选择 网络

    您可以选择默认网络来清除选择。

  6. 如果您的源供应商是 VMware,请完成以下字段:

    • ESXi 主机 admin 用户名 :指定 ESXi 主机 admin 用户,例如 root
    • ESXi 主机管理员密码 :指定 ESXi 主机管理员密码。
  7. 如果您的源供应商是 Red Hat Virtualization,请完成以下字段:

    • 用户名 :指定 Manager 用户。
    • Password :指定 Manager 密码。
  8. 点击 Save
  9. 验证每个主机的状态是否为 Ready

    如果主机状态为 Ready,则在迁移网络上可能无法访问主机,或者凭证可能不正确。您可以修改主机配置并保存更改。

4.1.2. 添加 Red Hat Virtualization 源供应商

您可以使用 MTV web 控制台添加 Red Hat Virtualization 源供应商。

先决条件

  • Manager 的 CA 证书。

流程

  1. 在 MTV web 控制台中,单击 Providers
  2. Add provider
  3. Type 列表中选择 Red Hat Virtualization
  4. 填写以下字段:

    • 名称 :要在供应商列表中显示的名称
    • 主机名或 IP 地址 :管理器主机名或 IP 地址
    • 用户名 : Manager 用户
    • 密码 : Manager 密码
    • CA 证书 : Manager 的 CA 证书
  5. Add 添加并保存该提供程序。

    源供应商会出现在提供程序列表中。

4.1.3. 添加 OpenShift Virtualization 供应商

除了默认的 OpenShift Virtualization 供应商(这是安装 MTV)的供应商,您还可以在 MTV web 控制台中添加 OpenShift Virtualization 供应商。

先决条件

  • 您必须具有具有 cluster-admin 权限的 OpenShift Virtualization 服务帐户令牌

流程

  1. 在 MTV web 控制台中,单击 Providers
  2. Add provider
  3. Type 列表中选择 OpenShift Virtualization
  4. 完成以下字段:

    • Cluster name :指定要在目标供应商列表中显示的集群名称。
    • URL :指定集群的 API 端点。
    • Service account token :指定 cluster-admin 服务帐户令牌。
  5. Check connection 来验证凭证。
  6. 点击 Add

    供应商会出现在提供程序列表中。

4.1.3.1. 为 OpenShift Virtualization 供应商选择迁移网络

您可以在 MTV web 控制台中为 OpenShift Virtualization 供应商选择默认迁移网络,以提高性能。默认迁移网络用于将磁盘传输到其配置的命名空间。

如果您没有选择迁移网络,则默认迁移网络为 pod 网络,这可能不是磁盘传输的最佳选择。

注意

您可以在创建迁移计划时选择不同的网络来覆盖供应商的默认迁移网络。

流程

  1. 在 MTV web 控制台中,单击 Providers
  2. OpenShift Virtualization 选项卡。
  3. 选择供应商并点 Select migration network
  4. 从可用网络列表中选择网络,然后单击 Select
  5. 点供应商旁边的 网络栏中的网络 号码,验证所选网络是否为默认迁移网络。

4.2. 创建网络映射

您可以使用 MTV Web 控制台将源网络映射到 OpenShift Virtualization 网络来创建一个或多个网络映射。

先决条件

  • 添加到 web 控制台的源和目标供应商。
  • 如果映射多个源和目标网络,则每个额外 OpenShift Virtualization 网络都需要其自身的 网络附加定义

流程

  1. Mappings
  2. 单击 Network 选项卡,然后单击 Create mapping
  3. 完成以下字段:

    • 名称 :输入要在网络映射列表中显示的名称。
    • Source provider :选择源供应商。
    • 目标供应商 :选择一个目标供应商。
    • 源网络 :选择源网络。
    • 目标命名空间/网络 :选择一个目标网络。
  4. 可选:点击 Add 来创建额外网络映射,或将多个源网络映射到一个目标网络。
  5. 如果您创建额外网络映射,请选择网络附加定义作为目标网络。
  6. Create

    网络映射显示在 网络映射 屏幕上。

4.3. 创建存储映射

您可以使用 MTV Web 控制台将源数据存储映射到 OpenShift Virtualization 存储类来创建存储映射。

先决条件

  • 添加到 web 控制台的源和目标供应商。
  • 支持虚拟机迁移的本地和共享的持久性存储。

流程

  1. Mappings
  2. 单击 Storage 选项卡,然后单击 Create mapping
  3. 输入存储映射的 Name
  4. 选择 Source providerTarget provider
  5. 如果您的源供应商是 VMware,请选择 Source 数据存储和目标存储类
  6. 如果您的源供应商是 Red Hat Virtualization,请选择 Source 存储域目标存储类
  7. 可选:点击 Add 来创建额外的存储映射,或者将多个源数据存储或存储域映射到单个存储类。
  8. Create

    映射显示在 Storage mappings 页面中。

4.4. 创建迁移计划

您可以使用 MTV web 控制台创建迁移计划。

迁移计划允许您将虚拟机分组在一起或具有相同迁移参数,例如,一个集群成员或完整应用程序的百分比。

您可以配置 hook 在迁移计划的指定阶段运行 Ansible playbook 或自定义容器镜像。

先决条件

  • 如果目标集群上没有安装 MTV,您必须在 web 控制台的 Providers 页面中添加目标供应商。

流程

  1. 在 web 控制台中,点 Migration Plan,然后点 Create migration plan
  2. 完成以下字段:

    • 计划名称 :输入要在迁移计划列表中显示的迁移计划名称。
    • 计划描述: Optional: brief description of the plan.
    • Source provider :选择源供应商。
    • 目标供应商 :选择一个目标供应商。
    • 目标命名空间 : 您可以键入 来搜索现有目标命名空间或创建新命名空间。
    • 您可以点击 Select a different network、从列表中选择网络并点 Select 来更改此计划的迁移转让网络。

      如果您为 OpenShift Virtualization 供应商定义了迁移传输网络,并且网络位于目标命名空间中,则网络是所有迁移计划的默认网络。否则会使用 pod 网络。

  3. 点击 Next
  4. 选择选项来过滤源虚拟机列表,然后点 Next
  5. 选择要迁移的虚拟机,然后点 Next
  6. 选择现有网络映射或创建新网络映射。

    要创建新网络映射:

    • 为每个源网络选择一个目标网络。
    • 可选: 选择 保存映射以再次使用 并输入网络映射名称。
  7. 点击 Next
  8. 选择现有存储映射或创建新存储映射。

    要创建新存储映射:

    • 为每个 VMware 数据存储或 Red Hat Virtualization 存储域选择一个目标存储类。
    • 可选: 选择 保存映射来再次使用 并输入存储映射名称。
  9. 点击 Next
  10. 选择迁移类型并点 Next

    • 冷迁移:源虚拟机在复制数据时停止。
    • warm 迁移:源虚拟机在以递增方式复制时运行。之后,您将运行 cutover,这将停止虚拟机并复制剩余的虚拟机数据和元数据。Red Hat Virtualization 不支持 warm 迁移。
  11. 可选:您可以创建一个迁移 hook 在迁移前或之后运行 Ansible playbook:

    1. Add hook
    2. 选择 hook 将运行时的步骤。
    3. 选择 hook 定义:

      • Ansible playbook :浏览 Ansible playbook 或将其粘贴到字段中。
      • 自定义容器镜像:如果您不想使用默认的 hook-runner 镜像,请输入镜像路径 : <registry_path>/<image_name>:<tag>.

        注意

        registry 必须可以被 OpenShift Container Platform 集群访问。

  12. 点击 Next
  13. 检查您的迁移计划并点击 完成

    迁移计划保存在迁移计划列表中。

  14. 点击迁移计划 kebab 的 Options 菜单并选择 View details 来验证迁移计划详情。

4.5. 运行迁移计划

您可以运行迁移计划,并在 MTV web 控制台中查看其进度。

先决条件

  • 有效的迁移计划。

流程

  1. Migration Plan

    Migration Plan 列表显示源和目标供应商、正在迁移的虚拟机数量以及计划的状态。

  2. 点迁移计划旁边的 Start be started migration。

    仅限 warm 迁移:

    • precopy 阶段会启动。
    • Cutover 完成迁移。
  3. 扩展迁移计划来查看迁移计划。

    迁移详情屏幕会显示迁移启动和结束时间、复制数据的数量以及迁移的每个虚拟机的进度管道。

  4. 扩展虚拟机以查看迁移步骤、每个步骤所经过的时间及其状态。

4.6. 迁移计划选项

在 MTV web 控制台的 Migration Plan 页面中,点迁移计划 kebab 旁边的 Options 菜单并选择以下选项:

  • 编辑 :编辑迁移计划的详情。您无法在迁移计划正在运行或成功完成后编辑迁移计划。
  • 副本 :创建一个与现有计划相同的虚拟机(VM)、参数、映射和 hook 的新迁移计划。您可以将此功能用于以下任务:

    • 将虚拟机迁移到不同的命名空间。
    • 编辑归档的迁移计划。
    • 编辑具有不同状态的迁移计划,如 failed、canceled、running、critical 或 ready。
  • 归档 :删除迁移计划的日志、历史记录和元数据。计划不能编辑或重启。只能查看它。

    注意

    Archive 选项不可逆。但是,您可以复制归档的计划。

  • 删除 :永久删除迁移计划。您不能删除正在运行的迁移计划。

    注意

    Delete 选项不可逆。

    删除迁移计划不会删除临时资源,如 导入程序 Pod、转换 pod、配置映射、secret、失败的虚拟机和数据卷。(BZ#2018974)您必须在删除迁移计划前归档迁移计划,才能清理临时资源。

  • 查看详情 :显示迁移计划的详细信息。
  • 重启 :重启失败或取消的迁移计划。
  • 取消计划的 cutover :取消计划的过渡计划。

4.7. 取消迁移

在使用 MTV web 控制台,当迁移计划正在进行时,您可以取消一些或所有虚拟机(VM)。

流程

  1. Migration Plans
  2. 点正在运行的迁移计划的名称查看迁移详情。
  3. 选择一个或多个虚拟机,点 Cancel
  4. 单击 Yes,取消 确认取消。

    VM 列表的 Migration 详情 中,取消的虚拟机的状态将变为 Canceled。未迁移且迁移的虚拟机不受影响。

您可以通过点 Migration Plan 页的迁移计划旁的 Restart 重启迁移。

第 5 章 从命令行迁移虚拟机

您可以使用命令行将虚拟机迁移到 OpenShift Virtualization。

重要

您必须确保满足所有 先决条件

5.1. 迁移虚拟机

您可以通过创建 MTV 自定义资源(CR)从命令行(CLI)迁移虚拟机。

重要

您必须为集群范围的 CR 指定一个名称。

您必须为命名空间范围 CR 指定名称和命名空间。

先决条件

  • 您必须以具有 cluster-admin 权限的用户身份登录。
  • 仅 VMware:在所有集群可以访问的安全 registry 中必须有 VMware Virtual Disk Development Kit(VDDK)镜像。

流程

  1. 仅 VMware:将 VDDK 镜像添加到 HyperConverged CR:

    $ cat << EOF | oc apply -f -
    apiVersion: hco.kubevirt.io/v1beta1
    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
      namespace: openshift-cnv
    spec:
      vddkInitImage: <registry_route_or_server_path>/vddk:<tag> 1
    EOF
    1
    指定您创建的 VDDK 镜像。
  2. 为源供应商凭证创建 Secret 清单:

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Secret
    metadata:
      name: <secret>
      namespace: openshift-mtv
    type: Opaque
    stringData:
      user: <user> 1
      password: <password> 2
      cacert: <engine_ca_certificate> 3
      thumbprint: <vcenter_fingerprint> 4
    EOF
    1
    指定 base64 编码的 vCenter admin 用户或 RHV Manager 用户。
    2
    指定 base64 编码的密码。
    3
    仅 RHV:指定 Manager 的 base64 编码的 CA 证书。您可以在 https://<engine_host>/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA 中检索它。
    4
    仅 VMware:指定 vCenter SHA-1 指纹。
  3. 为源供应商创建 Provider 清单:

    $ cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: Provider
    metadata:
      name: <provider>
      namespace: openshift-mtv
    spec:
      type: <provider_type> 1
      url: <api_end_point> 2
      secret:
        name: <secret> 3
        namespace: openshift-mtv
    EOF
    1
    允许的值是 ovirtvsphere
    2
    指定 API 端点 URL,例如: https://<vCenter_host>/sdk for vSphere 或 https://<engine_host>/ovirt-engine/api/ for RHV。
    3
    指定供应商 Secret CR 的名称。
  4. 仅 VMware:创建一个 主机清单

    $ cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: Host
    metadata:
      name: <vmware_host>
      namespace: openshift-mtv
    spec:
      provider:
        namespace: openshift-mtv
        name: <source_provider> 1
      id: <source_host_mor> 2
      ipAddress: <source_network_ip> 3
    EOF
    1
    指定 VMware Provider CR 的名称。
    2
    指定 VMware 主机的受管对象引用(MOR)。
    3
    指定 VMware 迁移网络的 IP 地址。
  5. 创建 NetworkMap 清单来映射源和目标网络:

    $  cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: NetworkMap
    metadata:
      name: <network_map>
      namespace: openshift-mtv
    spec:
      map:
        - destination:
            name: <pod>
            namespace: openshift-mtv
            type: pod 1
          source: 2
            id: <source_network_id> 3
            name: <source_network_name>
        - destination:
            name: <network_attachment_definition> 4
            namespace: <network_attachment_definition_namespace> 5
            type: multus
          source:
            id: <source_network_id>
            name: <source_network_name>
      provider:
        source:
          name: <source_provider>
          namespace: openshift-mtv
        destination:
          name: <destination_cluster>
          namespace: openshift-mtv
    EOF
    1
    允许的值是 podmultus
    2
    您可以使用 id name 参数来指定源网络。
    3
    指定 VMware 网络 MOR 或 RHV 网络 UUID。
    4
    为每个额外 OpenShift Virtualization 网络指定网络附加定义。
    5
    指定 OpenShift Virtualization 网络附加定义的命名空间。
  6. 创建 StorageMap 清单来映射源和目标存储:

    $ cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: StorageMap
    metadata:
      name: <storage_map>
      namespace: openshift-mtv
    spec:
      map:
        - destination:
            storageClass: <storage_class>
            accessMode: <access_mode> 1
          source:
            id: <source_datastore> 2
        - destination:
            storageClass: <storage_class>
            accessMode: <access_mode>
          source:
            id: <source_datastore>
      provider:
        source:
          name: <source_provider>
          namespace: openshift-mtv
        destination:
          name: <destination_cluster>
          namespace: openshift-mtv
    EOF
    1
    允许的值有 ReadWriteOnceReadWriteMany
    2
    指定 VMware 数据存储 MOR 或 RHV 存储域 UUID,例如 f2737930-b567-451a-9ceb-2887f6207009
  7. 可选:在 Plan CR 中指定的阶段创建一个 Hook 清单以在虚拟机中运行自定义代码:

    $  cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: Hook
    metadata:
      name: <hook>
      namespace: openshift-mtv
    spec:
      image: quay.io/konveyor/hook-runner 1
      playbook: | 2
        LS0tCi0gbmFtZTogTWFpbgogIGhvc3RzOiBsb2NhbGhvc3QKICB0YXNrczoKICAtIG5hbWU6IExv
        YWQgUGxhbgogICAgaW5jbHVkZV92YXJzOgogICAgICBmaWxlOiAiL3RtcC9ob29rL3BsYW4ueW1s
        IgogICAgICBuYW1lOiBwbGFuCiAgLSBuYW1lOiBMb2FkIFdvcmtsb2FkCiAgICBpbmNsdWRlX3Zh
        cnM6CiAgICAgIGZpbGU6ICIvdG1wL2hvb2svd29ya2xvYWQueW1sIgogICAgICBuYW1lOiB3b3Jr
        bG9hZAoK
    EOF
    1
    您可以使用默认 hook-runner 镜像或指定自定义镜像。如果指定自定义镜像,则不需要指定 playbook。
    2
    可选: Base64 编码的 Ansible playbook。如果指定 playbook,镜像 必须是 hook-runner
  8. 为迁移创建 Plan 清单:

    $ cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: Plan
    metadata:
      name: <plan> 1
      namespace: openshift-mtv
    spec:
      warm: true 2
      provider:
        source:
          name: <source_provider>
          namespace: openshift-mtv
        destination:
          name: <destination_cluster>
          namespace: openshift-mtv
      map:
        network: 3
          name: <network_map> 4
          namespace: openshift-mtv
        storage:
          name: <storage_map> 5
          namespace: openshift-mtv
      targetNamespace: openshift-mtv
      vms: 6
        - id: <source_vm> 7
        - name: <source_vm>
          hooks: 8
            - hook:
                namespace: openshift-mtv
                name: <hook> 9
              step: <step> 10
    EOF
    1
    指定 Plan CR 的名称。
    2
    仅 VMware:指定迁移是 warm 还是冷。如果您指定了 warm 迁移,且没有为 Migration 清单中的 cutover 参数指定一个值,则只有 precopy 阶段将运行。RHV 不支持 warm 迁移。
    3
    您可以添加多个网络映射。
    4
    指定 NetworkMap CR 的名称。
    5
    指定 StorageMap CR 的名称。
    6
    您可以使用 id name 参数来指定源虚拟机。
    7
    指定 VMware VM MOR 或 RHV VM UUID。
    8
    可选:为虚拟机指定最多两个 hook。每个 hook 必须在不同的迁移步骤中运行。
    9
    指定 Hook CR 的名称。
    10
    在迁移完成后,允许的值为 PreHook (migation 计划启动或 PostHook )。
  9. 创建运行 Plan CR 的 Migration 清单:

    $ cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: Migration
    metadata:
      name: <migration> 1
      namespace: openshift-mtv
    spec:
      plan:
        name: <plan> 2
        namespace: openshift-mtv
      cutover: <cutover_time> 3
    EOF
    1
    指定 Migration CR 的名称。
    2
    指定正在运行的 Plan CR 的名称。Migration CR 为每个迁移的虚拟机创建一个 VirtualMachine CR。
    3
    可选:指定 ISO 8601 格式的大约带有 UTC 时间偏移的时间,例如 2021-04-04T01:23:45.678+09:00

    您可以将多个 Migration CR 与一个 Plan CR 关联。如果迁移没有完成,您可以在不更改 Plan CR 的情况下创建新的 Migration CR,以迁移剩余的虚拟机。

  10. 检索 Migration CR 以监控迁移的进度:

    $ oc get migration/<migration> -n openshift-mtv -o yaml

5.2. 取消迁移

在从命令行界面(CLI)进行迁移时,您可以取消整个迁移或单独的虚拟机。

取消整个迁移

  • 删除 Migration CR:

    $ oc delete migration <migration> -n openshift-mtv 1
    1
    指定 Migration CR 的名称。

取消单个虚拟机的迁移

  1. 将独立虚拟机添加到 Migration 清单的 spec.cancel 块中:

    $ cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: Migration
    metadata:
      name: <migration>
      namespace: openshift-mtv
    ...
    spec:
      cancel:
      - id: vm-102 1
      - id: vm-203
      - name: rhel8-vm
    EOF
    1
    您可以使用 id 键或 name 键指定虚拟机。

    id 键的值是 VMware 虚拟机的 受管对象引用,或 RHV 虚拟机的虚拟机 UUID

  2. 检索 Migration CR 以监控剩余的虚拟机的进度:

    $ oc get migration/<migration> -n openshift-mtv -o yaml

第 6 章 高级迁移选项

6.1. 为 warm 迁移更改预复制间隔

您可以通过修补 ForkliftController 自定义资源(CR)来更改快照间隔。

流程

  • ForkliftController CR 进行补丁:

    $ oc patch forkliftcontroller/<forklift-controller> -n openshift-mtv -p '{"spec": {"controller_precopy_interval": <60>}}' --type=merge 1
    1
    以分钟为单位指定 precopy 间隔。默认值为 60

    您不需要重启 forklift-controller pod。

6.2. 为 Validation 服务创建自定义规则

Validation 服务使用 Open Policy Agent(OPA)策略规则来检查要迁移的每个虚拟机(VM)的适用性。Validation 服务为每个虚拟机生成 问题 列表,它们作为虚拟机属性存储在 Provider Inventory 服务中。Web 控制台显示供应商清单中的每个虚拟机的顾虑。

您可以创建自定义规则来扩展 Validation 服务的默认规则集。例如,您可以创建一个规则来检查虚拟机是否有多个磁盘。

6.2.1. 关于 Rego 文件

验证规则使用 Rego 编写,即 Open Policy Agent(OPA)原生查询语言。规则作为 .rego 文件存储在 Validation pod 的 /usr/share/opa/policies/io/konveyor/forklift/<provider > 目录中。

每个验证规则都在单独的 .rego 文件中定义,以及对特定条件的测试。如果条件评估为 true,则该规则会将 {"category", "label", "assessment"} hash 添加到 问题 中。关注 内容将添加到虚拟机清单记录中的 concerns 键中。Web 控制台显示供应商清单中每个虚拟机的 concerns 键的内容。

以下 .rego 文件示例检查在 VMware 虚拟机的集群中启用了分布式资源调度:

drs_enabled.rego example

package io.konveyor.forklift.vmware 1

has_drs_enabled {
    input.host.cluster.drsEnabled 2
}

concerns[flag] {
    has_drs_enabled
    flag := {
        "category": "Information",
        "label": "VM running in a DRS-enabled cluster",
        "assessment": "Distributed resource scheduling is not currently supported by OpenShift Virtualization. The VM can be migrated but it will not have this feature in the target environment."
    }
}

1
每个验证规则都在软件包中定义。软件包命名空间是 io.konveyor.forklift.vmware for VMware 和 io.konveyor.forklift.ovirt for Red Hat Virtualization。
2
查询参数基于 Validation 服务 JSON 的输入 密钥。

6.2.2. 检查默认验证规则

在创建自定义规则前,您必须检查 Validation 服务的默认规则,以确保您不会创建重新定义现有默认值的规则。

示例:如果默认规则包含默认 默认值 valid_input = false,并且您创建一个包含 默认值 valid_input = true 的自定义规则,则 Validation 服务将不会启动。

流程

  1. 连接到 Validation pod 的终端:

    $ oc rsh <validation_pod>
  2. 进入您的供应商的 OPA 策略目录:

    $ cd /usr/share/opa/policies/io/konveyor/forklift/<provider> 1
    1
    指定 vmwareovirt
  3. 搜索默认策略:

    $ grep -R "default" *

6.2.3. 检索库存服务 JSON

您可以通过将 库存服务 查询发送到虚拟机(VM)来检索库存服务 JSON。输出中包含一个 "input" 键,其中包含由 Validation 服务规则查询的清单属性。

您可以根据 "input" 键中的任何属性(如 input.snapshot.kind )创建验证规则。

流程

  1. 检索 Inventory 服务路由:

    $ oc get route <inventory_service> -n openshift-mtv
  2. 检索供应商的 UUID

    $ GET https://<inventory_service_route>/providers/<provider> 1
    1
    供应商允许的值有 vsphereovirt
  3. 检索供应商的虚拟机:

    $ GET https://<inventory_service_route>/providers/<provider>/<UUID>/vms
  4. 检索虚拟机的详情:

    $ GET https://<inventory_service_route>/providers/<provider>/<UUID>/workloads/<vm>

    输出示例

    {
        "input": {
            "selfLink": "providers/vsphere/c872d364-d62b-46f0-bd42-16799f40324e/workloads/vm-431",
            "id": "vm-431",
            "parent": {
                "kind": "Folder",
                "id": "group-v22"
            },
            "revision": 1,
            "name": "iscsi-target",
            "revisionValidated": 1,
            "isTemplate": false,
            "networks": [
                {
                    "kind": "Network",
                    "id": "network-31"
                },
                {
                    "kind": "Network",
                    "id": "network-33"
                }
            ],
            "disks": [
                {
                    "key": 2000,
                    "file": "[iSCSI_Datastore] iscsi-target/iscsi-target-000001.vmdk",
                    "datastore": {
                        "kind": "Datastore",
                        "id": "datastore-63"
                    },
                    "capacity": 17179869184,
                    "shared": false,
                    "rdm": false
                },
                {
                    "key": 2001,
                    "file": "[iSCSI_Datastore] iscsi-target/iscsi-target_1-000001.vmdk",
                    "datastore": {
                        "kind": "Datastore",
                        "id": "datastore-63"
                    },
                    "capacity": 10737418240,
                    "shared": false,
                    "rdm": false
                }
            ],
            "concerns": [],
            "policyVersion": 5,
            "uuid": "42256329-8c3a-2a82-54fd-01d845a8bf49",
            "firmware": "bios",
            "powerState": "poweredOn",
            "connectionState": "connected",
            "snapshot": {
                "kind": "VirtualMachineSnapshot",
                "id": "snapshot-3034"
            },
            "changeTrackingEnabled": false,
            "cpuAffinity": [
                0,
                2
            ],
            "cpuHotAddEnabled": true,
            "cpuHotRemoveEnabled": false,
            "memoryHotAddEnabled": false,
            "faultToleranceEnabled": false,
            "cpuCount": 2,
            "coresPerSocket": 1,
            "memoryMB": 2048,
            "guestName": "Red Hat Enterprise Linux 7 (64-bit)",
            "balloonedMemory": 0,
            "ipAddress": "10.19.2.96",
            "storageUsed": 30436770129,
            "numaNodeAffinity": [
                "0",
                "1"
            ],
            "devices": [
                {
                    "kind": "RealUSBController"
                }
            ],
            "host": {
                "id": "host-29",
                "parent": {
                    "kind": "Cluster",
                    "id": "domain-c26"
                },
                "revision": 1,
                "name": "IP address or host name of the vCenter host or RHV Engine host",
                "selfLink": "providers/vsphere/c872d364-d62b-46f0-bd42-16799f40324e/hosts/host-29",
                "status": "green",
                "inMaintenance": false,
                "managementServerIp": "10.19.2.96",
                "thumbprint": <thumbprint>,
                "timezone": "UTC",
                "cpuSockets": 2,
                "cpuCores": 16,
                "productName": "VMware ESXi",
                "productVersion": "6.5.0",
                "networking": {
                    "pNICs": [
                        {
                            "key": "key-vim.host.PhysicalNic-vmnic0",
                            "linkSpeed": 10000
                        },
                        {
                            "key": "key-vim.host.PhysicalNic-vmnic1",
                            "linkSpeed": 10000
                        },
                        {
                            "key": "key-vim.host.PhysicalNic-vmnic2",
                            "linkSpeed": 10000
                        },
                        {
                            "key": "key-vim.host.PhysicalNic-vmnic3",
                            "linkSpeed": 10000
                        }
                    ],
                    "vNICs": [
                        {
                            "key": "key-vim.host.VirtualNic-vmk2",
                            "portGroup": "VM_Migration",
                            "dPortGroup": "",
                            "ipAddress": "192.168.79.13",
                            "subnetMask": "255.255.255.0",
                            "mtu": 9000
                        },
                        {
                            "key": "key-vim.host.VirtualNic-vmk0",
                            "portGroup": "Management Network",
                            "dPortGroup": "",
                            "ipAddress": "10.19.2.13",
                            "subnetMask": "255.255.255.128",
                            "mtu": 1500
                        },
                        {
                            "key": "key-vim.host.VirtualNic-vmk1",
                            "portGroup": "Storage Network",
                            "dPortGroup": "",
                            "ipAddress": "172.31.2.13",
                            "subnetMask": "255.255.0.0",
                            "mtu": 1500
                        },
                        {
                            "key": "key-vim.host.VirtualNic-vmk3",
                            "portGroup": "",
                            "dPortGroup": "dvportgroup-48",
                            "ipAddress": "192.168.61.13",
                            "subnetMask": "255.255.255.0",
                            "mtu": 1500
                        },
                        {
                            "key": "key-vim.host.VirtualNic-vmk4",
                            "portGroup": "VM_DHCP_Network",
                            "dPortGroup": "",
                            "ipAddress": "10.19.2.231",
                            "subnetMask": "255.255.255.128",
                            "mtu": 1500
                        }
                    ],
                    "portGroups": [
                        {
                            "key": "key-vim.host.PortGroup-VM Network",
                            "name": "VM Network",
                            "vSwitch": "key-vim.host.VirtualSwitch-vSwitch0"
                        },
                        {
                            "key": "key-vim.host.PortGroup-Management Network",
                            "name": "Management Network",
                            "vSwitch": "key-vim.host.VirtualSwitch-vSwitch0"
                        },
                        {
                            "key": "key-vim.host.PortGroup-VM_10G_Network",
                            "name": "VM_10G_Network",
                            "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
                        },
                        {
                            "key": "key-vim.host.PortGroup-VM_Storage",
                            "name": "VM_Storage",
                            "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
                        },
                        {
                            "key": "key-vim.host.PortGroup-VM_DHCP_Network",
                            "name": "VM_DHCP_Network",
                            "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
                        },
                        {
                            "key": "key-vim.host.PortGroup-Storage Network",
                            "name": "Storage Network",
                            "vSwitch": "key-vim.host.VirtualSwitch-vSwitch1"
                        },
                        {
                            "key": "key-vim.host.PortGroup-VM_Isolated_67",
                            "name": "VM_Isolated_67",
                            "vSwitch": "key-vim.host.VirtualSwitch-vSwitch2"
                        },
                        {
                            "key": "key-vim.host.PortGroup-VM_Migration",
                            "name": "VM_Migration",
                            "vSwitch": "key-vim.host.VirtualSwitch-vSwitch2"
                        }
                    ],
                    "switches": [
                        {
                            "key": "key-vim.host.VirtualSwitch-vSwitch0",
                            "name": "vSwitch0",
                            "portGroups": [
                                "key-vim.host.PortGroup-VM Network",
                                "key-vim.host.PortGroup-Management Network"
                            ],
                            "pNICs": [
                                "key-vim.host.PhysicalNic-vmnic4"
                            ]
                        },
                        {
                            "key": "key-vim.host.VirtualSwitch-vSwitch1",
                            "name": "vSwitch1",
                            "portGroups": [
                                "key-vim.host.PortGroup-VM_10G_Network",
                                "key-vim.host.PortGroup-VM_Storage",
                                "key-vim.host.PortGroup-VM_DHCP_Network",
                                "key-vim.host.PortGroup-Storage Network"
                            ],
                            "pNICs": [
                                "key-vim.host.PhysicalNic-vmnic2",
                                "key-vim.host.PhysicalNic-vmnic0"
                            ]
                        },
                        {
                            "key": "key-vim.host.VirtualSwitch-vSwitch2",
                            "name": "vSwitch2",
                            "portGroups": [
                                "key-vim.host.PortGroup-VM_Isolated_67",
                                "key-vim.host.PortGroup-VM_Migration"
                            ],
                            "pNICs": [
                                "key-vim.host.PhysicalNic-vmnic3",
                                "key-vim.host.PhysicalNic-vmnic1"
                            ]
                        }
                    ]
                },
                "networks": [
                    {
                        "kind": "Network",
                        "id": "network-31"
                    },
                    {
                        "kind": "Network",
                        "id": "network-34"
                    },
                    {
                        "kind": "Network",
                        "id": "network-57"
                    },
                    {
                        "kind": "Network",
                        "id": "network-33"
                    },
                    {
                        "kind": "Network",
                        "id": "dvportgroup-47"
                    }
                ],
                "datastores": [
                    {
                        "kind": "Datastore",
                        "id": "datastore-35"
                    },
                    {
                        "kind": "Datastore",
                        "id": "datastore-63"
                    }
                ],
                "vms": null,
                "networkAdapters": [],
                "cluster": {
                    "id": "domain-c26",
                    "parent": {
                        "kind": "Folder",
                        "id": "group-h23"
                    },
                    "revision": 1,
                    "name": "mycluster",
                    "selfLink": "providers/vsphere/c872d364-d62b-46f0-bd42-16799f40324e/clusters/domain-c26",
                    "folder": "group-h23",
                    "networks": [
                        {
                            "kind": "Network",
                            "id": "network-31"
                        },
                        {
                            "kind": "Network",
                            "id": "network-34"
                        },
                        {
                            "kind": "Network",
                            "id": "network-57"
                        },
                        {
                            "kind": "Network",
                            "id": "network-33"
                        },
                        {
                            "kind": "Network",
                            "id": "dvportgroup-47"
                        }
                    ],
                    "datastores": [
                        {
                            "kind": "Datastore",
                            "id": "datastore-35"
                        },
                        {
                            "kind": "Datastore",
                            "id": "datastore-63"
                        }
                    ],
                    "hosts": [
                        {
                            "kind": "Host",
                            "id": "host-44"
                        },
                        {
                            "kind": "Host",
                            "id": "host-29"
                        }
                    ],
                    "dasEnabled": false,
                    "dasVms": [],
                    "drsEnabled": true,
                    "drsBehavior": "fullyAutomated",
                    "drsVms": [],
                    "datacenter": null
                }
            }
        }
    }

6.2.4. 创建验证规则

您可以通过将包含规则的配置映射自定义资源(CR)应用到 Validation 服务来创建验证规则。

重要
  • 如果您创建与现有规则 相同的规则,验证服务 将使用 规则执行 OR 操作。
  • 如果您创建使用默认规则迭代的规则,则 Validation 服务将不会启动。

验证规则示例

验证规则基于由 Provider Inventory 服务收集的虚拟机(VM)属性。

例如,VMware API 使用此路径来检查 VMware 虚拟机是否配置了 NUMA 节点关联性: MOR:VirtualMachine.config.extraConfig["numa.nodeAffinity"]

Provider Inventory 服务使用列表值简化了此配置并返回 testable 属性:

"numaNodeAffinity": [
    "0",
    "1"
],

您可以根据此属性创建一个 Rego 查询,并将其添加到 forklift-validation-config 配置映射中:

`count(input.numaNodeAffinity) != 0`

流程

  1. 根据以下示例创建配置映射 CR:

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: <forklift-validation-config>
      namespace: openshift-mtv
    data:
      vmware_multiple_disks.rego: |-
        package <provider_package> 1
    
        has_multiple_disks { 2
          count(input.disks) > 1
        }
    
        concerns[flag] {
          has_multiple_disks 3
            flag := {
              "category": "<Information>", 4
              "label": "Multiple disks detected",
              "assessment": "Multiple disks detected on this VM."
            }
        }
    EOF
    1
    指定供应商软件包名称。允许的值是 VMware 的 io.konveyor.forklift.vmwareio.konveyor.forklift.ovirt
    2
    指定 问题 名称和 Rego 查询。
    3
    指定 concerns 名称和 标志 参数值。
    4
    允许的值是 Critical警告 和信息
  2. 通过将 forklift-controller 部署扩展到 0 来停止 Validation pod:

    $ oc scale -n openshift-mtv --replicas=0 deployment/forklift-controller
  3. 通过将 forklift-controller 部署扩展到 1:

    $ oc scale -n openshift-mtv --replicas=1 deployment/forklift-controller
  4. 检查 Validation pod 日志,以验证 pod 是否已启动:

    $ oc logs -f <validation_pod>

    如果自定义规则与默认规则冲突,则 Validation pod 将不会启动。

  5. 删除源供应商:

    $ oc delete provider <provider> -n openshift-mtv
  6. 添加源供应商以应用新规则:

    $ cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: Provider
    metadata:
      name: <provider>
      namespace: openshift-mtv
    spec:
      type: <provider_type> 1
      url: <api_end_point> 2
      secret:
        name: <secret> 3
        namespace: openshift-mtv
    EOF
    1
    允许的值是 ovirtvsphere
    2
    指定 API 端点 URL,例如: https://<vCenter_host>/sdk for vSphere 或 https://<engine_host>/ovirt-engine/api/ for RHV。
    3
    指定供应商 Secret CR 的名称。

您必须在创建自定义规则后更新规则版本,以便 Inventory 服务检测到更改并验证虚拟机。

6.2.5. 更新清单规则版本

每次更新规则时,您必须更新 inventory 规则版本,以便 Provider Inventory 服务检测到更改并触发 Validation 服务。

规则版本记录在每个供应商的 rules_version.rego 文件中。

流程

  1. 检索当前的规则版本:

    $ GET https://forklift-validation/v1/data/io/konveyor/forklift/<provider>/rules_version 1

    输出示例

    {
       "result": {
           "rules_version": 5
       }
    }

  2. 连接到 Validation pod 的终端:

    $ oc rsh <validation_pod>
  3. 更新 /usr/share/opa/policies/io/konveyor/forklift/<provider>/rules_version.rego 文件中的规则 版本。
  4. Validation pod 终端注销。
  5. 验证更新的规则版本:

    $ GET https://forklift-validation/v1/data/io/konveyor/forklift/<provider>/rules_version 1

    输出示例

    {
       "result": {
           "rules_version": 6
       }
    }

第 7 章 升级虚拟化的 Migration Toolkit

您可以使用 OpenShift Container Platform Web 控制台安装新版本,以此升级 MTV Operator。

注意

您必须在不跳过发行版本的情况下升级到下一个版本,例如从 2.0 升级到 2.1 或从 2.1 升级到 2.2。

流程

  1. 在 OCP web 控制台中,点击 OperatorsInstalled OperatorsMigration Tookit for Virtualization OperatorSubscription
  2. 将更新频道更改为 release-v2.2.0

    请参阅 OpenShift Container Platform 文档中的更改更新频道。

  3. 确认 Upgrade statusUp to date 变为 Upgrade available。如果没有,重启 CatalogSource pod:

    1. 记录目录源,如 redhat-operators
    2. 在命令行中检索目录源 pod:

      $ oc get pod -n openshift-marketplace | grep <catalog_source> 1
      1 1 1
      指定目录源,如 redhat-operators
    3. 删除 Pod。

      $ oc delete pod -n openshift-marketplace <catalog_source_pod>

      将状态从 Up to date 变为 Upgrade available

      如果您在 Subscriptions 选项卡上将 Update approval 设置为 Automatic,则升级会自动启动。

  4. 如果您在 Subscriptions 标签页中将 Update approval 设置为 Manual,请批准升级。

    请参阅 OpenShift Container Platform 文档中的 手动批准待处理的升级

  5. 登录 web 控制台前,验证 forklift-ui pod 是否处于 Ready 状态:

    $ oc get pods -n openshift-mtv

    输出示例

    NAME                                  READY  STATUS   RESTARTS  AGE
    forklift-controller-788bdb4c69-mw268  2/2    Running  0         2m
    forklift-operator-6bf45b8d8-qps9v     1/1    Running  0         5m
    forklift-ui-7cdf96d8f6-xnw5n          1/1    Running  0         2m

第 8 章 卸载 Migration Toolkit for Virtualization

您可以使用 OpenShift Container Platform Web 控制台或命令行界面(CLI)卸载 Virtualization(MTV)。

8.1. 使用 OpenShift Container Platform Web 控制台卸载 MTV

您可以使用 OpenShift Container Platform Web 控制台删除 openshift-mtv 项目及自定义资源定义(CRD)来卸载 Virtualization(MTV)。

先决条件

  • 您必须以具有 cluster-admin 权限的用户身份登录。

流程

  1. HomeProjects
  2. 找到 openshift-mtv 项目。
  3. 在项目右侧,从 Options 菜单 kebab 选择 Delete Project
  4. Delete Project 窗格中,输入项目名称,再单击 Delete
  5. AdministrationCustomResourceDefinitions
  6. Search 字段中输入 forklift. konveyor.io 组中。
  7. 在每个 CRD 右侧,从 Options 菜单 kebab 中选择 Delete CustomResourceDefinition

8.2. 使用命令行界面卸载 MTV

您可以通过删除 openshift-mtv 项目和 forklift.konveyor.io 自定义资源定义(CRD)从命令行界面(CLI)卸载 Migration Toolkit for Virtualization(MTV)。

先决条件

  • 您必须以具有 cluster-admin 权限的用户身份登录。

流程

  1. 删除项目:

    $ oc delete project openshift-mtv
  2. 删除 CRD:

    $ oc get crd -o name | grep 'forklift' | xargs oc delete
  3. 删除 OAuthClient:

    $ oc delete oauthclient/forklift-ui

第 9 章 故障排除

本节提供有关对常见迁移问题进行故障排除的信息。

9.1. 架构

本节论述了 MTV 自定义资源、服务和工作流。

9.1.1. MTV 自定义资源和服务

Migration Toolkit for Virtualization(MTV)作为 OpenShift Container Platform Operator 提供。它将创建和管理以下自定义资源(CR)和服务。

MTV 自定义资源

  • provider CR 存储启用 MTV 连接到并与源和目标供应商交互的属性。
  • NetworkMapping CR 映射源供应商的网络。
  • StorageMapping CR 会映射源和目标供应商的存储。
  • provisioner CR 存储存储存储置备程序的配置,如支持的卷和访问模式。
  • 计划 CR 包含具有相同迁移参数和相关网络和存储映射的虚拟机列表。
  • 迁移 CR 运行一个迁移计划。

    每个迁移计划只能有一个 Migration CR 可以在指定时间运行。您可以为单个 Plan CR 创建多个 Migration CR。

MTV 服务

  • Inventory 服务执行以下操作:

    • 连接到源和目标供应商。
    • 维护本地清单以进行映射和计划。
    • 存储虚拟机配置。
    • 如果检测到虚拟机配置更改,则运行 Validation 服务。
  • Validation 服务通过应用规则检查虚拟机是否适合迁移。
  • 用户界面 服务执行以下操作:

    • 可让您创建和配置 MTV CR。
    • 显示 CR 的状态和迁移的进度。
  • Migration Controller 服务编配迁移。

    当您创建迁移计划时,Migration Controller 服务会验证计划并添加状态标签。如果计划无法验证,计划状态为 Not ready,则计划无法用于执行迁移。如果计划通过验证,计划状态为 Ready,它可用于执行迁移。迁移成功后,Migration Controller 服务会将计划状态更改为 Completed

  • Kubevirt ControllerContainerized Data Import(CDI)Controller 服务处理大多数技术操作。

9.1.2. 高级别迁移工作流

高级别工作流显示用户视图的迁移过程:

  1. 您可以创建一个源供应商、目标供应商、网络映射和存储映射。
  2. 您可以创建一个包含以下资源的 Plan 自定义资源(CR):

    • 源供应商
    • 目标供应商,如果目标集群上没有安装 MTV
    • 网络映射
    • 存储映射
    • 一个或多个虚拟机(VM)
  3. 您可以通过创建一个引用 Plan CR 的 Migration CR 来运行迁移计划。

    如果出于某种原因无法迁移所有虚拟机,则可以为同一 Plan CR 创建多个 Migration CR,直到虚拟机迁移为止。

  4. 对于 Plan CR 中的每个虚拟机,Migration Controller 服务会创建一个 VirtualMachine CR,并在 Migration CR 中记录虚拟机迁移进度。

    当迁移所有虚拟机时,Migration Controller 服务会将 Plan CR 的状态更新为 Completed。每个源虚拟机的电源状态在迁移后会被维护。

9.1.3. 详细的迁移工作流

您可以使用详细的迁移工作流来排除迁移失败的问题。

工作流描述了以下步骤:

  1. 当您创建一个 Migration 自定义资源(CR)来运行迁移计划时,Migration Controller 服务为每个源虚拟机(VM)和 DataVolume CR 创建一个 VirtualMachine CR。

    对于每个 VM 磁盘:

  2. Containerized Data Importer(CDI) 控制器服务根据 DataVolume CR 中指定的参数创建一个持久性卷声明(PVC)。
  3. 如果 StorageClass 有一个动态置备程序,则持久性卷(PV)由 StorageClass 置备程序动态置备。
  4. CDI Controller 服务创建一个 导入程序 pod。
  5. importer pod 将虚拟机磁盘流传输到 PV。

    虚拟机磁盘传输后:

  6. Migration Controller 服务创建一个 转换 pod,并附加了 PVC。

    转换 pod 运行 virt-v2v,它会在目标虚拟机的 PVC 中安装和配置设备驱动程序。

  7. 当目标虚拟机开机时,KubeVirt Controller 服务会创建一个 virt-launcher pod 和 VirtualMachineInstance CR。

    virt-launcher pod 运行 QEMU-KVM,并附加了作为 VM 磁盘的 PVC。

9.2. 日志和自定义资源

您可以下载日志和自定义资源(CR)信息以进行故障排除。如需更多信息,请参阅 详细的迁移工作流

9.2.1. 收集日志和自定义资源信息

您可以使用 MTV web 控制台或命令行界面(CLI)为以下目标下载日志和自定义资源(CR) yaml 文件:

  • 迁移计划:Web 控制台或 CLI。
  • 虚拟机:Web 控制台或 CLI.
  • namespace:仅限 CLI。

must-gather 工具会在存档文件中收集以下日志和 CR 文件:

  • CR:

    • DataVolume CR:代表在迁移的虚拟机中挂载的磁盘。
    • VirtualMachine CR:代表一个迁移的虚拟机。
    • 计划 CR:定义 VM 和存储和网络映射。
  • 日志:

    • Importer pod: Disk-to-data-volume 转换日志。importer pod 命名规则是 importer-<migration_plan>-<vm_id><5_char_id >,例如 importer-mig-plan-pig-plan-90dfc6-9a17-4a8btnfh,其中 ed90dfc6-9a17-4a8 是经过截断的 RHV VM ID,bt nfh 是 5 个字符生成的 ID。
    • 转换 pod:虚拟机转换日志.转换 pod 运行 virt-v2v,它会在虚拟机的 PVC 中安装和配置设备驱动程序。转换 pod 命名约定是 < migration_plan>-<vm_id><5_char_id>
    • virt-launcher pod:VM launcher 日志.当迁移的虚拟机被开启后,virt-launcher Pod 运行 QEMU-KVM,并附加了作为虚拟机磁盘的 PVC。
    • forklift-controller pod:针对 must-gather 命令指定的迁移计划、虚拟机或命名空间过滤日志。
    • forklift-must-gather-api pod:日志针对 must-gather 命令指定的迁移计划、虚拟机或命名空间过滤。

      注意

      must-gather 归档文件中不包含空的或排除的日志文件。

VMware 迁移计划的 must-gather 归档结构示例

must-gather
└── namespaces
    ├── target-vm-ns
    │   ├── crs
    │   │   ├── datavolume
    │   │   │   ├── mig-plan-vm-7595-tkhdz.yaml
    │   │   │   ├── mig-plan-vm-7595-5qvqp.yaml
    │   │   │   └── mig-plan-vm-8325-xccfw.yaml
    │   │   └── virtualmachine
    │   │       ├── test-test-rhel8-2disks2nics.yaml
    │   │       └── test-x2019.yaml
    │   └── logs
    │       ├── importer-mig-plan-vm-7595-tkhdz
    │       │   └── current.log
    │       ├── importer-mig-plan-vm-7595-5qvqp
    │       │   └── current.log
    │       ├── importer-mig-plan-vm-8325-xccfw
    │       │   └── current.log
    │       ├── mig-plan-vm-7595-4glzd
    │       │   └── current.log
    │       └── mig-plan-vm-8325-4zw49
    │           └── current.log
    └── openshift-mtv
        ├── crs
        │   └── plan
        │       └── mig-plan-cold.yaml
        └── logs
            ├── forklift-controller-67656d574-w74md
            │   └── current.log
            └── forklift-must-gather-api-89fc7f4b6-hlwb6
                └── current.log

9.2.2. 从 web 控制台下载日志和自定义资源信息

您可以使用 MTV web 控制台下载有关已完成的、失败或取消迁移计划的自定义资源(VM)的日志和信息。

流程

  1. 在 web 控制台中点 Migration Plan
  2. 点迁移计划名称旁的 Get logs
  3. Get logs 窗口中点击 Get logs

    日志会被收集。此时会显示 Log collection complete 信息。

  4. Download logs 下载存档文件。
  5. 要下载迁移的虚拟机的日志,请点击迁移计划名称,然后点击 VM 的 Get 日志

9.2.3. 使用命令行界面访问日志和自定义资源信息

您可以使用 must-gather 工具从命令行界面访问自定义资源(CR)的日志和信息。您必须将 must-gather 数据文件附加到所有客户问题单。

您可以使用过滤选项收集特定命名空间、完成、失败或取消迁移的虚拟机(VM)的数据。

注意

如果您在过滤的 must-gather 命令中指定不存在的资源,则不会创建存档文件。

先决条件

流程

  1. 进入要存储 must-gather 数据的目录。
  2. 运行 oc adm must-gather 命令:

    $ oc adm must-gather --image=registry.redhat.io/migration-toolkit-virtualization/mtv-must-gather-rhel8:2.2.0

    数据被保存为 /must-gather/must-gather.tar.gz。您可以将此文件上传到红帽客户门户网站中的支持问题单中。

  3. 可选:使用以下选项运行 oc adm must-gather 命令来收集过滤的数据:

    • Namespace:

      $ oc adm must-gather --image=registry.redhat.io/migration-toolkit-virtualization/mtv-must-gather-rhel8:2.2.0 \
        -- NS=<namespace> /usr/bin/targeted
    • 迁移计划:

      $ oc adm must-gather --image=registry.redhat.io/migration-toolkit-virtualization/mtv-must-gather-rhel8:2.2.0 \
        -- PLAN=<migration_plan> /usr/bin/targeted
    • 虚拟机:

      $ oc adm must-gather --image=registry.redhat.io/migration-toolkit-virtualization/mtv-must-gather-rhel8:2.2.0 \
        -- VM=<vm_name> NS=<namespace> /usr/bin/targeted 1
      1
      您必须指定 虚拟机名称,而不是虚拟机 ID,因为它出现在 Plan CR 中。