VM 导入

从 v1.1.0 起可用

从 v1.1.0 开始,用户可以将他们的 VMWare 和 OpenStack 虚拟机导入到 Harvester。

这是通过 vm-import-controller 插件来实现的。

要使用 VM 导入功能,用户需要启用 vm-import-controller 插件。

VM 导入 - 图1

默认情况下,vm-import-controller 使用 /var/lib/kubelet 挂载的临时存储。

在迁移过程中,大型 VM 的节点可能会用尽挂载点上的空间,进而导致后续调度失败。

为避免这种情况,建议用户启用由 PVC 支持的存储并自定义所需的存储量。根据最佳实践,PVC 的大小应该是要迁移的最大 VM 大小的两倍。因为 PVC 用作下载 VM 的临时空间,并将磁盘转换为原始镜像文件,所以此设置是必不可少的。

VM 导入 - 图2

vm-import-controller

目前,支持以下源的 provider:

  • VMWare
  • OpenStack

API

vm-import-controller 引入了两个 CRD。

源(Source)允许用户定义有效的源集群。

例如:

  1. apiVersion: migration.harvesterhci.io/v1beta1
  2. kind: VmwareSource
  3. metadata:
  4. name: vcsim
  5. namespace: default
  6. spec:
  7. endpoint: "https://vscim/sdk"
  8. dc: "DCO"
  9. credentials:
  10. name: vsphere-credentials
  11. namespace: default

该 Secret 包含 vCenter 端点的凭证:

  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4. name: vsphere-credentials
  5. namespace: default
  6. stringData:
  7. "username": "user"
  8. "password": "password"

作为调协过程的一部分,控制器将登录到 vCenter 并验证源的 spec 中指定的 dc 是否有效。

通过此检查后,源将被标记为 Ready,可用于 VM 迁移:

  1. $ kubectl get vmwaresource.migration
  2. NAME STATUS
  3. vcsim clusterReady

对于基于 OpenStack 的源集群,示例定义如下:

  1. apiVersion: migration.harvesterhci.io/v1beta1
  2. kind: OpenstackSource
  3. metadata:
  4. name: devstack
  5. namespace: default
  6. spec:
  7. endpoint: "https://devstack/identity"
  8. region: "RegionOne"
  9. credentials:
  10. name: devstack-credentials
  11. namespace: default

该 Secret 包含 OpenStack 端点的凭证:

  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4. name: devstack-credentials
  5. namespace: default
  6. stringData:
  7. "username": "user"
  8. "password": "password"
  9. "project_name": "admin"
  10. "domain_name": "default"
  11. "ca_cert": "pem-encoded-ca-cert"

OpenStack 源的调协过程会尝试列出项目中的虚拟机并将源标记为 Ready:

  1. $ kubectl get opestacksource.migration
  2. NAME STATUS
  3. devstack clusterReady

VirtualMachineImport

VirtualMachineImport CRD 提供了定义源 VM 并映射到实际源集群以执行 VM 导出/导入的方法。

VirtualMachineImport 示例如下所示:

  1. apiVersion: migration.harvesterhci.io/v1beta1
  2. kind: VirtualMachineImport
  3. metadata:
  4. name: alpine-export-test
  5. namespace: default
  6. spec:
  7. virtualMachineName: "alpine-export-test"
  8. networkMapping:
  9. - sourceNetwork: "dvSwitch 1"
  10. destinationNetwork: "default/vlan1"
  11. - sourceNetwork: "dvSwitch 2"
  12. destinationNetwork: "default/vlan2"
  13. sourceCluster:
  14. name: vcsim
  15. namespace: default
  16. kind: VmwareSource
  17. apiVersion: migration.harvesterhci.io/v1beta1

这将触发控制器导出 VMWare 源集群上名为 “alpine-export-test” 的 VM,从而将 VM 导出、处理并重新创建到 Harvester 集群中。

此过程需要一段时间,具体取决于虚拟机的大小。用户应该可以在定义的虚拟机中看到为每个磁盘创建的 VirtualMachineImages

networkMapping 中的项目列表用于定义源网络接口是如何映射到 Harvester 网络的。

如果未找到匹配项,每个不匹配的网络接口都会附加到默认的 managementNetwork

成功导入虚拟机后,对象将反映以下状态:

  1. $ kubectl get virtualmachineimport.migration
  2. NAME STATUS
  3. alpine-export-test virtualMachineRunning
  4. openstack-cirros-test virtualMachineRunning

同样,用户也可以为 OpenStack 源定义 VirtualMachineImport:

  1. apiVersion: migration.harvesterhci.io/v1beta1
  2. kind: VirtualMachineImport
  3. metadata:
  4. name: openstack-demo
  5. namespace: default
  6. spec:
  7. virtualMachineName: "openstack-demo" #Name or UUID for instance
  8. networkMapping:
  9. - sourceNetwork: "shared"
  10. destinationNetwork: "default/vlan1"
  11. - sourceNetwork: "public"
  12. destinationNetwork: "default/vlan2"
  13. sourceCluster:
  14. name: devstack
  15. namespace: default
  16. kind: OpenstackSource
  17. apiVersion: migration.harvesterhci.io/v1beta1

VM 导入 - 图3备注

OpenStack 允许用户拥有多个同名的实例。在这种情况下,建议用户使用 Instance ID。使用名称时,调协逻辑会尝试执行从名称到 ID 的查询。