8.15. 导入虚拟机


8.15.1. 数据卷导入的 TLS 证书

8.15.1.1. 添加用于身份验证数据卷导入的 TLS 证书

registry 或 HTTPS 端点的 TLS 证书必须添加到配置映射中,才能从这些源导入数据。此配置映射必须存在于目标数据卷的命名空间中。

通过引用 TLS 证书的相对文件路径来创建配置映射。

流程

  1. 确定您处于正确的命名空间中。配置映射只能被数据卷引用(如果位于同一命名空间中)。

    $ oc get ns
  2. 创建配置映射:

    $ oc create configmap <configmap-name> --from-file=</path/to/file/ca.pem>

8.15.1.2. 示例:从 TLS 证书创建的配置映射

以下示例是从 ca.pem TLS 证书创建的配置映射。

apiVersion: v1
kind: ConfigMap
metadata:
  name: tls-certs
data:
  ca.pem: |
    -----BEGIN CERTIFICATE-----
    ... <base64 encoded cert> ...
    -----END CERTIFICATE-----

8.15.2. 使用数据卷导入虚拟机镜像

使用 Containerized Data Importer(CDI)通过使用数据卷将虚拟机镜像导入到持久性卷声明(PVC)中。您可以将数据卷附加到虚拟机以获取持久性存储。

虚拟机镜像可以托管在 HTTP 或 HTTPS 端点上,也可以内嵌在容器磁盘中,并存储在容器镜像仓库中。

重要

当您将磁盘镜像导入到 PVC 中时,磁盘镜像扩展为使用 PVC 中请求的全部存储容量。要使用该空间,可能需要扩展虚拟机中的磁盘分区和文件系统。

调整大小的流程因虚拟机上安装的操作系统而异。详情请查看操作系统文档。

8.15.2.1. 先决条件

8.15.2.2. CDI 支持的操作列表

此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。

内容类型HTTPHTTPSHTTP 基本身份验证Registry上传

KubeVirt (QCOW2)

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2**
✓ GZ*
✓ XZ*

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2*
□ GZ
□ XZ

✓ QCOW2*
✓ GZ*
✓ XZ*

KubeVirt (RAW)

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW*
□ GZ
□ XZ

✓ RAW*
✓ GZ*
✓ XZ*

✓ 支持的操作

□ 不支持的操作

* 需要涂销空间

** 如果需要自定义证书颁发机构,则需要涂销空间

注意

CDI 现在使用 OpenShift Container Platform 集群范围的代理配置

8.15.2.3. 关于数据卷

DataVolume 对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层持久性卷声明(PVC)关联的导入、克隆和上传操作。数据卷与 OpenShift Virtualization 集成,它们可在 PVC 准备好前阻止虚拟机启动。

8.15.2.4. 使用数据卷将虚拟机镜像导入到存储中

您可以使用数据卷将虚拟机镜像导入到存储中。

虚拟机镜像可以托管在 HTTP 或 HTTPS 端点上,或者镜像可以构建到容器磁盘中,并存储在容器镜像仓库中。

您可以在 VirtualMachine 配置文件中为镜像指定数据源。创建虚拟机时,包含虚拟机镜像的数据卷将导入到存储中。

先决条件

  • 要导入虚拟机镜像,必须有以下内容:

    • RAW、ISO 或 QCOW2 格式的虚拟机磁盘镜像,可选择使用 xzgz 进行压缩。
    • 托管镜像的 HTTP 或 HTTPS 端点,以及访问数据源所需的任何身份验证凭证。
  • 要导入容器磁盘,您必须将虚拟机镜像构建到容器磁盘中,并存储在容器镜像仓库中,以及访问数据源所需的任何身份验证凭证。
  • 如果虚拟机必须与未由系统 CA 捆绑包签名的证书的服务器通信,则必须在与数据卷相同的命名空间中创建一个配置映射。

流程

  1. 如果您的数据源需要身份验证,请创建一个 Secret 清单,指定数据源凭证,并将其保存为 endpoint-secret.yaml

    apiVersion: v1
    kind: Secret
    metadata:
      name: endpoint-secret 1
      labels:
        app: containerized-data-importer
    type: Opaque
    data:
      accessKeyId: "" 2
      secretKey:   "" 3
    1
    指定 Secret 的名称。
    2
    指定以 Base64 编码的密钥 ID 或用户名。
    3
    指定以 Base64 编码的 secret 密钥或密码。
  2. 应用 Secret 清单:

    $ oc apply -f endpoint-secret.yaml
  3. 编辑 VirtualMachine 清单,为要导入的虚拟机镜像指定数据源,并将其保存为 vm-fedora-datavolume.yaml

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      creationTimestamp: null
      labels:
        kubevirt.io/vm: vm-fedora-datavolume
      name: vm-fedora-datavolume 1
    spec:
      dataVolumeTemplates:
      - metadata:
          creationTimestamp: null
          name: fedora-dv 2
        spec:
          storage:
            resources:
              requests:
                storage: 10Gi
            storageClassName: local
          source:
            http: 3
              url: "https://mirror.arizona.edu/fedora/linux/releases/35/Cloud/x86_64/images/Fedora-Cloud-Base-35-1.2.x86_64.qcow2" 4
              secretRef: endpoint-secret 5
              certConfigMap: "" 6
        status: {}
      running: true
      template:
        metadata:
          creationTimestamp: null
          labels:
            kubevirt.io/vm: vm-fedora-datavolume
        spec:
          domain:
            devices:
              disks:
              - disk:
                  bus: virtio
                name: datavolumedisk1
            machine:
              type: ""
            resources:
              requests:
                memory: 1.5Gi
          terminationGracePeriodSeconds: 60
          volumes:
          - dataVolume:
              name: fedora-dv
            name: datavolumedisk1
    status: {}
    1
    指定虚拟机的名称。
    2
    指定数据卷的名称。
    3
    为 HTTP 或 HTTPS 端点指定 http。为从 registry 导入的容器磁盘镜像指定 registry。
    4
    要导入的虚拟机镜像的源。本例引用了 HTTPS 端点上的虚拟机镜像。容器镜像仓库端点示例为 url: "docker://kubevirt/fedora-cloud-container-disk-demo:latest"
    5
    如果您为数据源创建 Secret,则需要此项。
    6
    可选:指定一个 CA 证书配置映射。
  4. 创建虚拟机:

    $ oc create -f vm-fedora-datavolume.yaml
    注意

    oc create 命令创建数据卷和虚拟机。CDI 控制器创建一个带有正确注解和导入过程的底层 PVC。导入完成后,数据卷状态变为 Succeeded。您可以启动虚拟机。

    数据卷置备在后台进行,因此无需监控进程。

验证

  1. importer pod 从指定的 URL 下载虚拟机镜像或容器磁盘,并将其存储在置备的 PV 上。运行以下命令,查看 importer pod 的状态:

    $ oc get pods
  2. 运行以下命令监控数据卷,直到其状态为 Succeeded

    $ oc describe dv fedora-dv 1
    1
    指定您在 VirtualMachine 清单中定义的数据卷名称。
  3. 通过访问其串行控制台来验证置备是否已完成,并且虚拟机是否已启动:

    $ virtctl console vm-fedora-datavolume

8.15.2.5. 其他资源

8.15.3. 使用数据卷将虚拟机镜像导入到块存储中

您可将现有虚拟机镜像导入到您的 OpenShift Container Platform 集群中。OpenShift Virtualization 使用数据卷自动导入数据并创建底层持久性卷声明(PVC)。

重要

当您将磁盘镜像导入到 PVC 中时,磁盘镜像扩展为使用 PVC 中请求的全部存储容量。要使用该空间,可能需要扩展虚拟机中的磁盘分区和文件系统。

调整大小的流程因虚拟机上安装的操作系统而异。详情请查看操作系统文档。

8.15.3.1. 先决条件

8.15.3.2. 关于数据卷

DataVolume 对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层持久性卷声明(PVC)关联的导入、克隆和上传操作。数据卷与 OpenShift Virtualization 集成,它们可在 PVC 准备好前阻止虚拟机启动。

8.15.3.3. 关于块持久性卷

块持久性卷(PV)是一个受原始块设备支持的 PV。这些卷没有文件系统,可以通过降低开销来为虚拟机提供性能优势。

原始块卷可以通过在 PV 和持久性卷声明(PVC)规格中指定 volumeMode: Block 来置备。

8.15.3.4. 创建本地块持久性卷

通过填充文件并将其挂载为循环设备,在节点上创建本地块持久性卷(PV)。然后,您可以在 PV 清单中将该循环设备作为 Block(块)卷引用,并将其用作虚拟机镜像的块设备。

流程

  1. root 身份登录节点,在其上创建本地 PV。本流程以 node01 为例。
  2. 创建一个文件并用空字符填充,以便可将其用作块设备。以下示例创建 loop10 文件,大小为 2Gb(20,100 Mb 块):

    $ dd if=/dev/zero of=<loop10> bs=100M count=20
  3. loop10 文件挂载为 loop 设备。

    $ losetup </dev/loop10>d3 <loop10> 1 2
    1
    挂载 loop 设备的文件路径。
    2
    上一步中创建的文件,挂载为 loop 设备。
  4. 创建引用所挂载 loop 设备的 PersistentVolume 清单。

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: <local-block-pv10>
      annotations:
    spec:
      local:
        path: </dev/loop10> 1
      capacity:
        storage: <2Gi>
      volumeMode: Block 2
      storageClassName: local 3
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Delete
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - <node01> 4
    1
    节点上的 loop 设备路径。
    2
    将其指定为块 PV。
    3
    可选:为 PV 设置存储类。如果省略此项,将使用默认集群。
    4
    挂载块设备的节点。
  5. 创建块 PV。

    # oc create -f <local-block-pv10.yaml>1
    1
    上一步中创建的持久性卷的文件名。

8.15.3.5. 使用数据卷将虚拟机镜像导入到块存储中

您可以使用数据卷将虚拟机镜像导入到块存储中。在创建虚拟机前,您要在 VirtualMachine 清单中引用数据卷。

先决条件

  • RAW、ISO 或 QCOW2 格式的虚拟机磁盘镜像,可选择使用 xzgz 进行压缩。
  • 托管镜像的 HTTP 或 HTTPS 端点,以及访问数据源所需的任何身份验证凭证。

流程

  1. 如果您的数据源需要身份验证,请创建一个 Secret 清单,指定数据源凭证,并将其保存为 endpoint-secret.yaml

    apiVersion: v1
    kind: Secret
    metadata:
      name: endpoint-secret 1
      labels:
        app: containerized-data-importer
    type: Opaque
    data:
      accessKeyId: "" 2
      secretKey:   "" 3
    1
    指定 Secret 的名称。
    2
    指定以 Base64 编码的密钥 ID 或用户名。
    3
    指定以 Base64 编码的 secret 密钥或密码。
  2. 应用 Secret 清单:

    $ oc apply -f endpoint-secret.yaml
  3. 创建 DataVolume 清单,为虚拟机镜像指定数据源,并为 storage.volumeMode 指定 Block

    apiVersion: cdi.kubevirt.io/v1beta1
    kind: DataVolume
    metadata:
      name: import-pv-datavolume 1
    spec:
      storageClassName: local 2
        source:
          http:
            url: "https://mirror.arizona.edu/fedora/linux/releases/35/Cloud/x86_64/images/Fedora-Cloud-Base-35-1.2.x86_64.qcow2" 3
            secretRef: endpoint-secret 4
      storage:
        volumeMode: Block 5
        resources:
          requests:
            storage: 10Gi
    1
    指定数据卷的名称。
    2
    可选:设置存储类,或忽略此项,接受集群默认值。
    3
    指定要导入的镜像的 HTTP 或 HTTPS URL。
    4
    如果您为数据源创建 Secret,则需要此项。
    5
    对于已知的存储置备程序,会自动检测到卷模式和访问模式。否则,指定 Block
  4. 创建数据卷来导入虚拟机镜像:

    $ oc create -f import-pv-datavolume.yaml

在创建虚拟机前,您可以在 VirtualMachine 清单中引用此数据卷。

8.15.3.6. CDI 支持的操作列表

此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。

内容类型HTTPHTTPSHTTP 基本身份验证Registry上传

KubeVirt (QCOW2)

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2**
✓ GZ*
✓ XZ*

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2*
□ GZ
□ XZ

✓ QCOW2*
✓ GZ*
✓ XZ*

KubeVirt (RAW)

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW*
□ GZ
□ XZ

✓ RAW*
✓ GZ*
✓ XZ*

✓ 支持的操作

□ 不支持的操作

* 需要涂销空间

** 如果需要自定义证书颁发机构,则需要涂销空间

注意

CDI 现在使用 OpenShift Container Platform 集群范围的代理配置

8.15.3.7. 其他资源

8.15.4. 导入单个 Red Hat Virtualization 虚拟机

您可以使用 VM Import 向导或 CLI 将单个 Red Hat Virtualization(RHV)虚拟机导入到 OpenShift Virtualization。

重要

导入 RHV VM 是一个已弃用的功能。弃用的功能仍然包含在 OpenShift Virtualization 中,并且仍然被支持。但是,这个功能会在以后的发行版本中被删除,且不建议在新的部署中使用。

有关 OpenShift Virtualization 中已弃用或删除的主要功能的最新列表,请参阅 OpenShift Virtualization 发行注记中已弃用和删除的功能部分。

这个功能将被虚拟化的 Migration Toolkit 替代。

8.15.4.1. OpenShift Virtualization 存储功能列表

下表描述了支持导入虚拟机的 OpenShift Virtualization 存储类型。

表 8.4. OpenShift Virtualization 存储功能列表
 RHV 虚拟机导入

OpenShift Container Storage: RBD 块模式卷

OpenShift Virtualization hostpath 置备程序

不是

其他多节点可写入存储

[1]

其他单节点可写入存储

[2]

  1. PVC 必须请求 ReadWriteMany 访问模式。
  2. PVC 必须请求 ReadWriteOnce 访问模式。

8.15.4.2. 导入虚拟机的先决条件

将 Red Hat Virtualization 虚拟机导入到 OpenShift Virtualization 需要以下先决条件:

  • 具有 admin 用户权限。
  • 存储:

    • OpenShift Virtualization 本地和共享的持久性存储类必须支持虚拟机导入。
    • 如果您使用 Ceph RBD 块模式卷,且可用的存储空间对于虚拟磁盘太小,则导入过程会在完成 75% 的时候停止 20 分钟以上,且迁移也不会成功。web 控制台中没有显示错误消息。BZ#1910019
  • 网络:

    • RHV 和 OpenShift Virtualization 网络必须具有相同的名称或被相互映射。
    • RHV VM 网络接口必须是 e1000rtl8139virtio
  • VM 磁盘:

    • 磁盘接口必须是 satavirtio_scsi 或者 virtio
    • 不可将该磁盘配置为直接 LUN。
    • 磁盘状态不得是 illegallocked
    • 存储类型必须是 image
    • 必须禁用 SCSI 保留功能。
    • ScsiGenericIO 必需被禁用。
  • VM 配置:

    • 如果 VM 使用 GPU 资源,则必须配置提供 GPU 的节点。
    • 不能为 vGPU 资源配置 VM。
    • 虚拟机不能具有处于 illegal 状态的磁盘的快照。
    • 虚拟机一定不能使用 OpenShift Container Platform 创建,并随后添加到 RHV。
    • 虚拟机不能为 USB 设备配置。
    • watchdog 不能是 diag288

8.15.4.3. 使用 VM 导入向导(Import wizard)导入虚拟机

您可以使用 VM 导入向导导入单个虚拟机。

流程

  1. 在 web 控制台中,点 Workloads Virtual Machines
  2. 点击 Create Virtual Machine 并选择 Import with Wizard
  3. Provider 列表中选择 Red Hat Virtualization (RHV)
  4. 选择 Connect to New Instance,或一个保存的 RHV 实例。

    • 如果选择 Connect to New Instance,请填写以下字段:

      • API URL:例如 https://<RHV_Manager_FQDN>/ovirt-engine/api
      • CA certificate:点 Browse 上传 RHV Manager CA 证书或将 CA 证书粘贴到字段。

        您可以运行以下命令来查看 CA 证书:

        $ openssl s_client -connect <RHV_Manager_FQDN>:443 -showcerts < /dev/null

        CA 证书是输出中的第二个证书。

      • Username:RHV Manager 的用户名,例如 ocpadmin@internal
      • Password: RHV Manager 密码
    • 如果您选择了一个保存的 RHV 实例,向导将使用保存的凭证连接到 RHV 实例。
  5. 点击 Check and Save,然后等待连接完成。

    注意

    连接详情存储在 secret 中。如果您提供的供应商带有不正确的 URL、用户名或密码,点 Workloads Secrets 并删除供应商 secret。

  6. 选择一个集群和一个虚拟机。
  7. Next
  8. Review 屏幕中,查看您的设置。
  9. 可选:您可以选择 Start virtual machine on creation
  10. Edit 以更新以下设置:

    • General Name:虚拟机名称限制为 63 个字符。
    • General Description: 虚拟机的描述信息(可选)。

      • Storage Class:选择 NFSocs-storagecluster-ceph-rbd

        如果选择 ocs-storagecluster-ceph-rbd,您必须将磁盘的 Volume Mode 设置为 Block

      • advanced Volume Mode: 选择 Block
    • advanced Volume Mode: 选择 Block
    • networking Network:您可以从可用网络附加定义对象列表中选择网络。
  11. 如果您编辑了导入设置,点 ImportReview and Import

    此时会显示 Successfully created virtual machine 消息以及为虚拟机创建的资源列表。虚拟机会出现在 Workloads Virtual Machines 中。

虚拟机向导字段
名称参数描述

名称

 

名称可包含小写字母 (a-z)、数字 (0-9) 和连字符 (-),最多 253 个字符。第一个和最后一个字符必须为字母数字。名称不得包含大写字母、空格、句点 (.) 或特殊字符。

描述

 

可选的描述字段。

操作系统

 

模板中为虚拟机选择的操作系统。从模板创建虚拟机时,您无法编辑此字段。

引导源

通过 URL 导入(创建 PVC)

从 HTTP 或 HTTPS 端点提供的镜像导入内容。示例:包含操作系统镜像的网页中的 URL 链接。

克隆现有的 PVC(创建 PVC)

选择集群中可用的现有持久性卷声明并克隆它。

通过 Registry 导入(创建 PVC)

从可通过集群访问的注册表中的可启动操作系统容器置备虚拟机。示例:kubevirt/cirros-registry-disk-demo

PXE(网络引导 - 添加网络接口)

从网络的服务器引导操作系统。需要一个 PXE 可引导网络附加定义。

持久性卷声明项目

 

用于克隆 PVC 的项目名称。

持久性卷声明名称

 

如果您要克隆现有的 PVC,则应用于此虚拟机模板的 PVC 名称。

将它作为光盘引导源挂载

 

CD-ROM 需要额外的磁盘来安装操作系统。选择添加磁盘的选择框并稍后进行自定义。

Flavor

tiny、small、Medium、Large、Custom

根据与该模板关联的操作系统,在虚拟机模板中预设具有预定义值的 CPU 和内存量。

如果选择了默认模板,您可以使用自定义值覆盖模板中的 cpusmemsize 的值,以创建自定义模板。另外,您可以通过修改 Workloads Virtualization 页面上的 Details 选项卡中的 cpusmemsize 值来创建自定义模板。

工作负载类型

注意

如果您选择了不正确的 Workload Type,则可能会出现性能或资源利用率问题(如缓慢的 UI)。

Desktop

用于桌面的虚拟机配置。适用于小型工作环境。建议与 Web 控制台搭配使用。

Server

在性能和广泛的服务器工作负载兼容性方面具有最佳平衡。

高性能

针对高性能负载进行了优化的虚拟机配置。

创建后启动此虚拟机。

 

默认选择这个复选框并在创建后启动虚拟机。如果您不希望虚拟机在创建时启动,请清除该复选框。

网络字段
名称描述

名称

网络接口控制器的名称。

model

指明网络接口控制器的型号。支持的值有 e1000evirtio

网络

可用网络附加定义的列表。

类型

可用绑定方法列表。对于默认的 pod 网络,masquerade 是唯一推荐的绑定方法。对于辅助网络,请使用 bridge 绑定方法。非默认网络不支持 masquerade 绑定方法。如果您配置了一个 SR-IOV 网络设备并在命名空间中定义那个网络,请选择 SR-IOV。

MAC 地址

网络接口控制器的 MAC 地址。如果没有指定 MAC 地址,则会自动分配一个。

存储字段
名称选择描述

Source

空白(创建 PVC)

创建一个空磁盘。

通过 URL 导入(创建 PVC)

通过 URL(HTTP 或 HTTPS 端点)导入内容。

使用现有的 PVC

使用集群中已可用的 PVC。

克隆现有的 PVC(创建 PVC)

选择集群中可用的现有 PVC 并克隆它。

通过 Registry 导入(创建 PVC)

通过容器 registry 导入内容。

容器(临时)

从集群可以访问的 registry 中的容器上传内容。容器磁盘应只用于只读文件系统,如 CD-ROM 或临时虚拟机。

名称

 

磁盘的名称。名称可包含小写字母 (a-z)、数字 (0-9)、连字符 (-) 和句点 (.),最多 253 个字符。第一个和最后一个字符必须为字母数字。名称不得包含大写字母、空格或特殊字符。

Size

 

GiB 中磁盘的大小。

类型

 

磁盘类型。示例:磁盘或光盘

Interface

 

磁盘设备的类型。支持的接口包括 virtIOSATASCSI

Storage class

 

用于创建磁盘的存储类。

Advanced Volume Mode

 

定义持久性卷是否使用格式化的文件系统或原始块状态。默认为 Filesystem

高级存储设置
名称参数描述

卷模式

Filesystem

在基于文件系统的卷中保存虚拟磁盘。

Block

直接将虚拟磁盘存储在块卷中。只有底层存储支持时才使用 Block

访问模式 [1]

Single User (RWO)

这个卷可以被一个单一的节点以 read/write 的形式挂载。

Shared Access (RWX)

卷可以被多个节点以读写模式挂载。

Read Only (ROX)

卷可以被多个节点以只读形式挂载。

  1. 您可以使用命令行界面更改访问模式。

8.15.4.4. 使用 CLI 导入虚拟机

您可以通过 CLI 创建 SecretVirtualMachineImport 自定义资源(CR)来导入虚拟机。Secret CR 存储 RHV Manager 凭证和 CA 证书。VirtualMachineImport CR 定义 VM 导入过程的参数。

可选:您可以创建一个与 VirtualMachineImport CR 分开的 ResourceMapping CR。ResourceMapping CR 提供了更大的灵活性,例如导入额外的 RHV VM。

重要

默认目标存储类必须是 NFS。Cinder 不支持 RHV VM 导入。

流程

  1. 运行以下命令来创建 Secret CR:

    $ cat <<EOF | oc create -f -
    apiVersion: v1
    kind: Secret
    metadata:
      name: rhv-credentials
      namespace: default 1
    type: Opaque
    stringData:
      ovirt: |
        apiUrl: <api_endpoint> 2
        username: ocpadmin@internal
        password: 3
        caCert: |
          -----BEGIN CERTIFICATE-----
          4
          -----END CERTIFICATE-----
    EOF
    1
    可选。您可以在所有 CR 中指定不同的命名空间。
    2
    指定 RHV Manager 的 API 端点,如 \"https://www.example.com:8443/ovirt-engine/api"
    3
    指定 ocpadmin@internal 的密码。
    4
    指定 RHV Manager CA 证书。您可以运行以下命令来获取 CA 证书:
    $ openssl s_client -connect :443 -showcerts < /dev/null
  2. 可选:运行以下命令,创建 ResourceMapping CR,以将资源映射与 VirtualMachineImport CR 分开:

    $ cat <<EOF | kubectl create -f -
    apiVersion: v2v.kubevirt.io/v1alpha1
    kind: ResourceMapping
    metadata:
      name: resourcemapping_example
      namespace: default
    spec:
      ovirt:
        networkMappings:
          - source:
              name: <rhv_logical_network>/<vnic_profile> 1
            target:
              name: <target_network> 2
            type: pod
        storageMappings: 3
          - source:
              name: <rhv_storage_domain> 4
            target:
              name: <target_storage_class> 5
            volumeMode: <volume_mode> 6
    EOF
    1
    指定 RHV 逻辑网络和 vNIC 配置集。
    2
    指定 OpenShift Virtualization 网络。
    3
    如果在 ResourceMappingVirtualMachineImport CR 中都指定了存储映射,则 VirtualMachineImport CR 将具有优先权。
    4
    指定 RHV 存储域。
    5
    指定 nfsocs-storagecluster-ceph-rbd
    6
    如果指定了 ocs-storagecluster-ceph-rbd 存储类,则必须将 Block 指定为卷模式。
  3. 运行以下命令来创建 VirtualMachineImport CR:

    $ cat <<EOF | oc create -f -
    apiVersion: v2v.kubevirt.io/v1beta1
    kind: VirtualMachineImport
    metadata:
      name: vm-import
      namespace: default
    spec:
      providerCredentialsSecret:
        name: rhv-credentials
        namespace: default
    # resourceMapping: 1
    #   name: resourcemapping-example
    #   namespace: default
      targetVmName: vm_example 2
      startVm: true
      source:
        ovirt:
          vm:
            id: <source_vm_id> 3
            name: <source_vm_name> 4
          cluster:
            name: <source_cluster_name> 5
          mappings: 6
            networkMappings:
              - source:
                  name: <source_logical_network>/<vnic_profile> 7
                target:
                  name: <target_network> 8
                type: pod
            storageMappings: 9
              - source:
                  name: <source_storage_domain> 10
                target:
                  name: <target_storage_class> 11
                accessMode: <volume_access_mode> 12
            diskMappings:
              - source:
                  id: <source_vm_disk_id> 13
                target:
                  name: <target_storage_class> 14
    EOF
    1
    如果创建一个 ResourceMapping CR,取消 resourceMapping 部分的注释。
    2
    指定目标虚拟机名称。
    3
    指定源虚拟机 ID,例如 80554327-0569-496b-bdeb-fcbbf52b827b。您可以通过在 Manager 机器的网页浏览器中输入 https://www.example.com/ovirt-engine/api/vms/ 来列出所有虚拟机来获取虚拟机 ID。找到您要导入的虚拟机及其对应的虚拟机 ID。您不需要指定虚拟机名称或集群名称。
    4
    如果指定源虚拟机名称,还必须同时指定源集群。不要指定源虚拟机 ID。
    5
    如果指定源集群,还必须指定源虚拟机名称。不要指定源虚拟机 ID。
    6
    如果创建一个 ResourceMapping CR,注释掉 mappings 部分。
    7
    指定源虚拟机的逻辑网络和 vNIC 配置集。
    8
    指定 OpenShift Virtualization 网络。
    9
    如果在 ResourceMappingVirtualMachineImport CR 中都指定了存储映射,则 VirtualMachineImport CR 将具有优先权。
    10
    指定源存储域。
    11
    指定目标存储类。
    12
    指定 ReadWriteOnceReadWriteManyReadOnlyMany。如果没有指定访问模式,{virt} 会根据 RHV VM 的 Host Migration 模式 或虚拟磁盘访问模式决定正确的卷访问模式:
    • 如果 RHV VM 迁移模式是 Allow manual and automatic migration,则默认访问模式为 ReadWriteMany
    • 如果 RHV 虚拟磁盘访问模式是 ReadOnly,则默认访问模式为 ReadOnlyMany
    • 对于所有其他设置,默认的访问模式为 ReadWriteOnce
    13
    指定源虚拟机磁盘 ID,例如 8181ecc1-5db8-4193-9c92-3ddab3be7b05。您可以通过在 Manager 机器的网页浏览器中输入 https://www.example.com/ovirt-engine/api/vms/vm23 并查看虚拟机详情来获取磁盘 ID。
    14
    指定目标存储类。
  4. 按照虚拟机导入的过程,以验证导入是否成功:

    $ oc get vmimports vm-import -n default

    显示成功导入的输出结果类似如下:

    输出示例

    ...
    status:
      conditions:
      - lastHeartbeatTime: "2020-07-22T08:58:52Z"
        lastTransitionTime: "2020-07-22T08:58:52Z"
        message: Validation completed successfully
        reason: ValidationCompleted
        status: "True"
        type: Valid
      - lastHeartbeatTime: "2020-07-22T08:58:52Z"
        lastTransitionTime: "2020-07-22T08:58:52Z"
        message: 'VM specifies IO Threads: 1, VM has NUMA tune mode specified: interleave'
        reason: MappingRulesVerificationReportedWarnings
        status: "True"
        type: MappingRulesVerified
      - lastHeartbeatTime: "2020-07-22T08:58:56Z"
        lastTransitionTime: "2020-07-22T08:58:52Z"
        message: Copying virtual machine disks
        reason: CopyingDisks
        status: "True"
        type: Processing
      dataVolumes:
      - name: fedora32-b870c429-11e0-4630-b3df-21da551a48c0
      targetVmName: fedora32

8.15.4.4.1. 创建用于导入虚拟机的配置映射

如果要覆盖默认的 vm-import-controller 映射或添加额外的映射,您可以创建一个配置映射来将 Red Hat Virtualization(RHV)虚拟机操作系统映射到 OpenShift Virtualization 模板。

默认 vm-import-controller 配置映射包含以下 RHV 操作系统,及其对应的通用 OpenShift Virtualization 模板。

表 8.5. 操作系统和模板映射
RHV 虚拟机操作系统OpenShift Virtualization 模板

rhel_6_10_plus_ppc64

rhel6.10

rhel_6_ppc64

rhel6.10

rhel_6

rhel6.10

rhel_6x64

rhel6.10

rhel_6_9_plus_ppc64

rhel6.9

rhel_7_ppc64

rhel7.7

rhel_7_s390x

rhel7.7

rhel_7x64

rhel7.7

rhel_8x64

rhel8.1

sles_11_ppc64

opensuse15.0

sles_11

opensuse15.0

sles_12_s390x

opensuse15.0

ubuntu_12_04

ubuntu18.04

ubuntu_12_10

ubuntu18.04

ubuntu_13_04

ubuntu18.04

ubuntu_13_10

ubuntu18.04

ubuntu_14_04_ppc64

ubuntu18.04

ubuntu_14_04

ubuntu18.04

ubuntu_16_04_s390x

ubuntu18.04

windows_10

win10

windows_10x64

win10

windows_2003

win10

windows_2003x64

win10

windows_2008R2x64

win2k8

windows_2008

win2k8

windows_2008x64

win2k8

windows_2012R2x64

win2k12r2

windows_2012x64

win2k12r2

windows_2016x64

win2k16

windows_2019x64

win2k19

windows_7

win10

windows_7x64

win10

windows_8

win10

windows_8x64

win10

windows_xp

win10

流程

  1. 在网页浏览器中,进入 http://<RHV_Manager_FQDN>/ovirt-engine/api/vms/<VM_ID> 找到RHV 虚拟机操作系统的 REST API 名称。操作系统名称会出现在 XML 输出的 <os> 部分,如下例所示:

    ...
    <os>
    ...
    <type>rhel_8x64</type>
    </os>
  2. 查看可用 OpenShift Virtualization 模板列表:

    $ oc get templates -n openshift --show-labels | tr ',' '\n' | grep os.template.kubevirt.io | sed -r 's#os.template.kubevirt.io/(.*)=.*#\1#g' | sort -u

    输出示例

    fedora31
    fedora32
    ...
    rhel8.1
    rhel8.2
    ...

  3. 如果与 RHV 虚拟机操作系统匹配的 OpenShift Virtualization 模板没有出现在可用的模板列表中,使用 OpenShift Virtualization Web 控制台创建一个模板。
  4. 创建配置映射将 RHV VM 操作系统映射到 OpenShift Virtualization 模板:

    $ cat <<EOF | oc create -f -
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: os-configmap
      namespace: default 1
    data:
      guestos2common: |
        "Red Hat Enterprise Linux Server": "rhel"
        "CentOS Linux": "centos"
        "Fedora": "fedora"
        "Ubuntu": "ubuntu"
        "openSUSE": "opensuse"
      osinfo2common: |
        "<rhv-operating-system>": "<vm-template>" 2
    EOF
    1
    可选: 您可以更改 namespace 参数的值。
    2
    指定 RHV 操作系统的 REST API 名称及其对应的虚拟机模板,如下例所示。

    配置映射示例

    $ cat <<EOF | oc apply -f -
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: os-configmap
      namespace: default
    data:
      osinfo2common: |
        "other_linux": "fedora31"
    EOF

  5. 验证是否已创建自定义配置映射:

    $ oc get cm -n default os-configmap -o yaml
  6. vm-import-controller-config 配置映射进行补丁以应用新的配置映射:

    $ oc patch configmap vm-import-controller-config -n openshift-cnv --patch '{
        "data": {
            "osConfigMap.name": "os-configmap",
            "osConfigMap.namespace": "default" 1
        }
    }'
    1
    如果在配置映射中更改了命名空间,请更新它。
  7. 验证模板是否出现在 OpenShift Virtualization web 控制台中:

    1. 从侧边菜单中点 Workloads Virtualization
    2. Virtual Machine Templates 标签页,在列表中找到模板。

8.15.4.5. 导入虚拟机的故障排除

8.15.4.5.1. 日志

您可以检查 VM Import Controller pod 日志中的错误。

流程

  1. 运行以下命令,查看 VM Import Controller pod 的名称:

    $ oc get pods -n <namespace> | grep import 1
    1
    指定导入虚拟机的命名空间。

    输出示例

    vm-import-controller-f66f7d-zqkz7            1/1     Running     0          4h49m

  2. 运行以下命令查看 VM Import Controller pod 日志:

    $ oc logs <vm-import-controller-f66f7d-zqkz7> -f -n <namespace> 1
    1
    指定 VM Import Controller pod 名称和命名空间。
8.15.4.5.2. é”™è¯¯ä¿¡æ�¯

可能会出现以下出错信息:

  • 如果 OpenShift Virtualization 存储 PV 不合适,VM Import Controller pod 日志中会显示以下错误消息,进度条会在 10% 的位置停止:

    Failed to bind volumes: provisioning failed for PVC

    您必须使用兼容的存储类。不支持 Cinder 存储类。

8.15.4.5.3. 已知问题
  • 如果您使用 Ceph RBD 块模式卷,且可用的存储空间对于虚拟磁盘太小,则导入过程会在完成 75% 的时候停止 20 分钟以上,且迁移也不会成功。web 控制台中没有显示错误消息。BZ#1910019

8.15.5. 导入一个单一的 VMware 虚拟机或模板

您可以使用 VM I导入向导将 VMware vSphere 6.5、6.7 或 7.0 VM 或 VM 模板导入到 OpenShift Virtualization 中。如果您导入一个虚拟机模板,OpenShift Virtualization 会根据模板创建一个虚拟机。

重要

导入 VMware VM 是一个已弃用的功能。弃用的功能仍然包含在 OpenShift Virtualization 中,并且仍然被支持。但是,这个功能会在以后的发行版本中被删除,且不建议在新的部署中使用。

有关 OpenShift Virtualization 中已弃用或删除的主要功能的最新列表,请参阅 OpenShift Virtualization 发行注记中已弃用和删除的功能部分。

这个功能将被虚拟化的 Migration Toolkit 替代。

8.15.5.1. OpenShift Virtualization 存储功能列表

下表描述了支持导入虚拟机的 OpenShift Virtualization 存储类型。

表 8.6. OpenShift Virtualization 存储功能列表
 VMware VM 导入

OpenShift Container Storage: RBD 块模式卷

OpenShift Virtualization hostpath 置备程序

其他多节点可写入存储

[1]

其他单节点可写入存储

[2]

  1. PVC 必须请求 ReadWriteMany 访问模式。
  2. PVC 必须请求 ReadWriteOnce 访问模式。

8.15.5.2. 准备 VDDK 镜像

导入过程使用 VMware Virtual Disk Development Kit(VDDK)来复制 VMware 虚拟磁盘。

您可以下载 VDDK SDK,创建 VDDK 镜像,将镜像上传到镜像 registry,并将其添加到 HyperConverged 自定义资源(CR)的 spec.vddkInitImage 字段中。

您可以配置内部 OpenShift Container Platform 镜像 registry 或 VDDK 镜像的安全外部镜像 registry。该 registry 需要可以被 OpenShift Virtualization 环境访问。

注意

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

8.15.5.2.1. 配置内部镜像 registry

您可以通过更新 Image Registry Operator 配置在裸机上配置内部 OpenShift Container Platform 镜像 registry。

您可以通过一个路由公开 registry,直接从 OpenShift Container Platform 集群内部或外部访问 registry。

更改镜像 registry 的管理状态

要启动镜像 registry,您必须将 Image Registry Operator 配置的 managementStateRemoved 改为 Managed

流程

  • managementState Image Registry Operator 配置从 Removed 改为 Managed。例如:

    $ oc patch configs.imageregistry.operator.openshift.io cluster --type merge --patch '{"spec":{"managementState":"Managed"}}'
为裸机和其他手动安装配置 registry 存储

作为集群管理员,在安装后需要配置 registry 来使用存储。

先决条件

  • 您可以使用具有 cluster-admin 角色的用户访问集群。
  • 您有一个使用手动置备的 Red Hat Enterprise Linux CoreOS(RHCOS)节点(如裸机)的集群。
  • 已为集群置备了持久性存储,如 Red Hat OpenShift Container Storage。

    重要

    当您只有一个副本时,OpenShift Container Platform 支持对镜像 registry 存储的 ReadWriteOnce 访问。ReadWriteOnce 访问还要求 registry 使用 Recreate rollout 策略。要部署支持高可用性的镜像 registry,需要两个或多个副本,ReadWriteMany 访问。

  • 必须具有 100Gi 容量。

流程

  1. 要将 registry 配置为使用存储,修改 configs.imageregistry/cluster 资源中的 spec.storage.pvc

    注意

    使用共享存储时,请查看您的安全设置以防止外部访问。

  2. 验证您没有 registry pod:

    $ oc get pod -n openshift-image-registry -l docker-registry=default

    输出示例

    No resourses found in openshift-image-registry namespace

    注意

    如果您的输出中有一个 registry pod,则不需要继续这个过程。

  3. 检查 registry 配置:

    $ oc edit configs.imageregistry.operator.openshift.io

    输出示例

    storage:
      pvc:
        claim:

    claim 字段留空以允许自动创建 image-registry-storage PVC。

  4. 检查 clusteroperator 状态:

    $ oc get clusteroperator image-registry

    输出示例

    NAME             VERSION                              AVAILABLE   PROGRESSING   DEGRADED   SINCE   MESSAGE
    image-registry   4.7                                  True        False         False      6h50m

  5. 确保 registry 设置为 managed,以启用镜像的构建和推送。

    • 运行:

      $ oc edit configs.imageregistry/cluster

      然后,更改行

      managementState: Removed

      to

      managementState: Managed
直接从集群访问registry

您可以从集群内部访问registry。

流程

通过使用内部路由从集群访问registry:

  1. 通过获取节点的名称来访问节点:

    $ oc get nodes
    $ oc debug nodes/<node_name>
  2. 要在节点上启用对 ocpodman 等工具的访问,请将您的根目录改为 /host

    sh-4.2# chroot /host
  3. 使用您的访问令牌登录到容器镜像registry:

    sh-4.2# oc login -u kubeadmin -p <password_from_install_log> https://api-int.<cluster_name>.<base_domain>:6443
    sh-4.2# podman login -u kubeadmin -p $(oc whoami -t) image-registry.openshift-image-registry.svc:5000

    您应该看到一条确认登录的消息,例如:

    Login Succeeded!
    注意

    用户名可以是任何值,令牌包含了所有必要的信息。如果用户名包含冒号,则会导致登录失败。

    因为 Image Registry Operator 创建了路由,所以它将与 default-route-openshift-image-registry.<cluster_name> 类似。

  4. 针对您的registry执行podman pullpodman push操作:

    重要

    您可以抓取任意镜像,但是如果已添加了system:registry角色,则只能将镜像推送到您自己的registry中。

    在以下示例中,使用:

    组件

    <registry_ip>

    172.30.124.220

    <port>

    5000

    <project>

    openshift

    <image>

    image

    <tag>

    忽略 (默认为 latest)

    1. 抓取任意镜像:

      sh-4.2# podman pull name.io/image
    2. 使用 <registry_ip>:<port>/<project>/<image> 格式标记(tag)新镜像。项目名称必须出现在这个 pull 规范中,以供OpenShift Container Platform 把这个镜像正确放置在 registry 中,并在以后正确访问 registry 中的这个镜像:

      sh-4.2# podman tag name.io/image image-registry.openshift-image-registry.svc:5000/openshift/image
      注意

      您必须具有指定项目的system:image-builder角色,该角色允许用户写或推送镜像。否则,下一步中的podman push将失败。为了进行测试,您可以创建一个新项目来推送镜像。

    3. 将新标记的镜像推送到 registry:

      sh-4.2# podman push image-registry.openshift-image-registry.svc:5000/openshift/image
手动公开受保护的registry

通过使用路由可以开放从外部访问OpenShift Container Platform registry的通道,用户不再需要从集群内部登录到OpenShift Container Platform registry。这样,您可以使用路由地址从集群外部登录 registry,并使用路由主机标记并推送到现有项目。

先决条件

  • 以下的先决条件会被自动执行:

    • 部署 Registry Operator。
    • 部署 Ingress Operator。

流程

您可以使用configs.imageregistry.operator.openshift.io资源中的DefaultRoute参数或使用自定义路由来公开路由。

使用DefaultRoute公开registry:

  1. DefaultRoute设置为True

    $ oc patch configs.imageregistry.operator.openshift.io/cluster --patch '{"spec":{"defaultRoute":true}}' --type=merge
  2. 使用 podman 登录:

    $ HOST=$(oc get route default-route -n openshift-image-registry --template='{{ .spec.host }}')
    $ podman login -u kubeadmin -p $(oc whoami -t) --tls-verify=false $HOST 1
    1
    如果集群的默认路由证书不受信任,则需要--tls-verify=false 。您可以将一个自定义的可信证书设置为 Ingress Operator 的默认证书。

使用自定义路由公开registry:

  1. 使用路由的 TLS 密钥创建一个 secret:

    $ oc create secret tls public-route-tls \
        -n openshift-image-registry \
        --cert=</path/to/tls.crt> \
        --key=</path/to/tls.key>

    此步骤是可选的。如果不创建一个secret,则路由将使用Ingress Operator的默认TLS配置。

  2. 在 Registry Operator 中:

    spec:
      routes:
        - name: public-routes
          hostname: myregistry.mycorp.organization
          secretName: public-route-tls
    ...
    注意

    如果为registry的路由提供了一个自定义的 TLS 配置,则仅需设置secretName

8.15.5.2.2. 配置外部镜像 registry

如果将外部镜像 registry 用于 VDDK 镜像,您可以将外部镜像 registry 的证书颁发机构添加到 OpenShift Container Platform 集群。

另外,您可以从 Docker 凭证中创建一个 pull secret,并将其添加到您的服务帐户中。

在集群中添加证书颁发机构

您可以按照以下流程将证书颁发机构 (CA) 添加到集群,以便在推送和拉取镜像时使用。

先决条件

  • 您必须具有集群管理员特权。
  • 您必须有权访问 registry 的公共证书,通常是位于 /etc/docker/certs.d/ 目录中的 hostname/ca.crt 文件。

流程

  1. openshift-config 命名空间中创建一个 ConfigMap,其中包含使用自签名证书的 registry 的可信证书。对于每个 CA 文件,确保 ConfigMap 中的键是 hostname[..port] 格式的容器镜像仓库的主机名:

    $ oc create configmap registry-cas -n openshift-config \
    --from-file=myregistry.corp.com..5000=/etc/docker/certs.d/myregistry.corp.com:5000/ca.crt \
    --from-file=otherregistry.com=/etc/docker/certs.d/otherregistry.com/ca.crt
  2. 更新集群镜像配置:

    $ oc patch image.config.openshift.io/cluster --patch '{"spec":{"additionalTrustedCA":{"name":"registry-cas"}}}' --type=merge
允许 Pod 引用其他安全 registry 中的镜像

Docker 客户端的 .dockercfg $HOME/.docker/config.json 文件是一个 Docker 凭证文件,如果您之前已登录安全或不安全的 registry,则该文件会保存您的身份验证信息。

要拉取(pull)并非来自 OpenShift Container Platform 内部 registry 的安全容器镜像,您必须从 Docker 凭证创建一个 pull secret,并将其添加到您的服务帐户。

流程

  • 如果您已有该安全 registry 的 .dockercfg 文件,则可运行以下命令从该文件中创建一个 secret:

    $ oc create secret generic <pull_secret_name> \
        --from-file=.dockercfg=<path/to/.dockercfg> \
        --type=kubernetes.io/dockercfg
  • 或者,如果您已有 $HOME/.docker/config.json 文件,则可运行以下命令:

    $ oc create secret generic <pull_secret_name> \
        --from-file=.dockerconfigjson=<path/to/.docker/config.json> \
        --type=kubernetes.io/dockerconfigjson
  • 如果您还没有安全 registry 的 Docker 凭证文件,则可运行以下命令创建一个 secret:

    $ oc create secret docker-registry <pull_secret_name> \
        --docker-server=<registry_server> \
        --docker-username=<user_name> \
        --docker-password=<password> \
        --docker-email=<email>
  • 要使用 secret 为 Pod 拉取镜像,您必须将 secret 添加到您的服务帐户中。本例中服务帐户的名称应与 Pod 使用的服务帐户的名称匹配。默认服务帐户是 default

    $ oc secrets link default <pull_secret_name> --for=pull
8.15.5.2.3. 创建并使用 VDDK 镜像

您可以下载 VMware Virtual Disk Development Kit(VDDK),构建 VDDK 镜像,并将 VDDK 镜像推送到您的镜像 registry。然后,您将 VDDK 镜像添加到 HyperConverged 自定义资源(CR)的 spec.vddkInitImage 字段中。

先决条件

  • 您必须有权访问 OpenShift Container Platform 内部镜像 registry 或安全的外部 registry。

流程

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

    $ mkdir /tmp/<dir_name> && cd /tmp/<dir_name>
  2. 在一个浏览器中,进入 VMware code 并点 SDKs
  3. Compute Virtualization 下,点 Virtual Disk Development Kit(VDDK)
  4. 选择与 VMware vSphere 版本对应的 VDDK 版本,例如 vSphere 7.0 的 VDDK 7.0,点 Download,然后在临时目录中保存 VDDK 归档。
  5. 提取 VDDK 归档:

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

    $ cat > Dockerfile <<EOF
    FROM busybox:latest
    COPY vmware-vix-disklib-distrib /vmware-vix-disklib-distrib
    RUN mkdir -p /opt
    ENTRYPOINT ["cp", "-r", "/vmware-vix-disklib-distrib", "/opt"]
    EOF
  7. 构建镜像:

    $ podman build . -t <registry_route_or_server_path>/vddk:<tag> 1
    1
    指定您的镜像 registry:
    • 对于内部 OpenShift Container Platform registry,请使用内部 registry 路由,如 image-registry.openshift-image-registry.svc:5000/openshift/vddk:<tag>
    • 对于外部 registry,指定服务器名称、路径和标签。例如 server.example.com:5000/vddk:<tag>
  8. 将镜像推送至 registry:

    $ podman push <registry_route_or_server_path>/vddk:<tag>
  9. 确保镜像可以被 OpenShift Virtualization 环境访问。
  10. 编辑 openshift-cnv 项目中的 HyperConverged CR:

    $ oc edit hco -n openshift-cnv kubevirt-hyperconverged
  11. vddkInitImage 参数添加到 spec 小节中:

    apiVersion: hco.kubevirt.io/v1beta1
    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
      namespace: openshift-cnv
    spec:
      vddkInitImage: <registry_route_or_server_path>/vddk:<tag>

8.15.5.3. 使用 VM 导入向导(Import wizard)导入虚拟机

您可以使用 VM 导入向导导入单个虚拟机。

您还可以导入虚拟机模板。如果您导入一个虚拟机模板,OpenShift Virtualization 会根据模板创建一个虚拟机。

先决条件

  • 具有 admin 用户权限。
  • VMware Virtual Disk Development Kit(VDDK)镜像必须位于 OpenShift Virtualization 环境可访问的镜像 registry 中。
  • VDDK 镜像必须添加到 HyperConverged 自定义资源(CR)的 spec.vddkInitImage 字段中。
  • 虚拟机必须关机。
  • 虚拟磁盘必须连接到 IDE 或者 SCSI 控制器。如果虚拟磁盘连接到一个 SATA 控制器,您可以将其改为 IDE 控制器,然后迁移虚拟机。
  • OpenShift Virtualization 本地和共享的持久性存储类必须支持虚拟机导入。
  • OpenShift Virtualization 存储必须足够大来保存虚拟磁盘。

    警告

    如果使用 Ceph RBD 块模式卷,则存储必须有足够的空间来存储虚拟磁盘。如果可用存储的大小无法满足磁盘要求,导入过程会失败,且用于复制虚拟磁盘的 PV 也不会被释放。因为没有足够的资源来删除对象,您将无法导入另一个虚拟机或清除存储。要解决这种情况,您必须在存储后端中添加更多对象存储设备。

  • OpenShift Virtualization 出口网络策略必须允许以下流量:

    目的地协议端口

    VMware ESXi 主机

    TCP

    443

    VMware ESXi 主机

    TCP

    902

    VMware vCenter

    TCP

    5840

流程

  1. 在 web 控制台中,点 Workloads Virtual Machines
  2. 点击 Create Virtual Machine 并选择 Import with Wizard
  3. Provider 列表中选择 VMware
  4. 选择 Connect to New Instance 或一个保存的 vCenter 示例。

    • 如果您选择 Connect to New Instance,输入 vCenter hostnameUsernamePassword
    • 如果您选择了一个保存的 vCenter 实例,向导将使用保存的凭证连接到 vCenter 实例。
  5. 点击 Check and Save,然后等待连接完成。

    注意

    连接详情存储在 secret 中。如果您添加的供应商带有不正确的主机名、用户名或密码,点 Workloads Secrets 并删除供应商 secret。

  6. 选择一个虚拟机或一个模板。
  7. Next
  8. Review 屏幕中,查看您的设置。
  9. Edit 以更新以下设置:

    • General:

      • 描述
      • 操作系统
      • Flavor
      • 内存
      • CPU
      • Workload Profile
    • Networking:

      • 名称
      • Model
      • 网络
      • 类型
      • MAC 地址
    • Storage:点击 VM 磁盘 kebab 的 Options 菜单,然后选择 Edit 来更新以下字段:

      • 名称
      • Source:例如 Import Disk
      • Size
      • Interface
      • Storage Class:选择 NFSocs-storagecluster-ceph-rbd(ceph-rbd)

        如果选择 ocs-storagecluster-ceph-rbd,您必须将磁盘的 Volume Mode 设置为 Block

        其他存储类可能会正常工作,但不被正式支持。

      • advanced Volume Mode: 选择 Block
      • Advanced Access Mode
    • Advanced Cloud-init:

      • Form: 输入 HostnameAuthenticated SSH Keys.
      • Custom script: 在文本字段中输入 cloud-init 脚本。
    • Advanced Virtual Hardware:您可以将虚拟 CD-ROM 附加到导入的虚拟机。
  10. 如果您编辑了导入设置,点 ImportReview and Import

    此时会显示 Successfully created virtual machine 消息以及为虚拟机创建的资源列表。虚拟机会出现在 Workloads Virtual Machines 中。

虚拟机向导字段
名称参数描述

名称

 

名称可包含小写字母 (a-z)、数字 (0-9) 和连字符 (-),最多 253 个字符。第一个和最后一个字符必须为字母数字。名称不得包含大写字母、空格、句点 (.) 或特殊字符。

描述

 

可选的描述字段。

操作系统

 

模板中为虚拟机选择的操作系统。从模板创建虚拟机时,您无法编辑此字段。

引导源

通过 URL 导入(创建 PVC)

从 HTTP 或 HTTPS 端点提供的镜像导入内容。示例:包含操作系统镜像的网页中的 URL 链接。

克隆现有的 PVC(创建 PVC)

选择集群中可用的现有持久性卷声明并克隆它。

通过 Registry 导入(创建 PVC)

从可通过集群访问的注册表中的可启动操作系统容器置备虚拟机。示例:kubevirt/cirros-registry-disk-demo

PXE(网络引导 - 添加网络接口)

从网络的服务器引导操作系统。需要一个 PXE 可引导网络附加定义。

持久性卷声明项目

 

用于克隆 PVC 的项目名称。

持久性卷声明名称

 

如果您要克隆现有的 PVC,则应用于此虚拟机模板的 PVC 名称。

将它作为光盘引导源挂载

 

CD-ROM 需要额外的磁盘来安装操作系统。选择添加磁盘的选择框并稍后进行自定义。

Flavor

tiny、small、Medium、Large、Custom

根据与该模板关联的操作系统,在虚拟机模板中预设具有预定义值的 CPU 和内存量。

如果选择了默认模板,您可以使用自定义值覆盖模板中的 cpusmemsize 的值,以创建自定义模板。另外,您可以通过修改 Workloads Virtualization 页面上的 Details 选项卡中的 cpusmemsize 值来创建自定义模板。

工作负载类型

注意

如果您选择了不正确的 Workload Type,则可能会出现性能或资源利用率问题(如缓慢的 UI)。

Desktop

用于桌面的虚拟机配置。适用于小型工作环境。建议与 Web 控制台搭配使用。

Server

在性能和广泛的服务器工作负载兼容性方面具有最佳平衡。

高性能

针对高性能负载进行了优化的虚拟机配置。

创建后启动此虚拟机。

 

默认选择这个复选框并在创建后启动虚拟机。如果您不希望虚拟机在创建时启动,请清除该复选框。

Cloud-init 字段
名称描述

Hostname

为虚拟机设置特定主机名。

授权 SSH 密钥

复制到虚拟机上 ~/.ssh/authorized_keys 的用户公钥。

自定义脚本

将其他选项替换为您粘贴自定义 cloud-init 脚本的字段。

网络字段
名称描述

名称

网络接口控制器的名称。

model

指明网络接口控制器的型号。支持的值有 e1000evirtio

网络

可用网络附加定义的列表。

类型

可用绑定方法列表。对于默认的 pod 网络,masquerade 是唯一推荐的绑定方法。对于辅助网络,请使用 bridge 绑定方法。非默认网络不支持 masquerade 绑定方法。如果您配置了一个 SR-IOV 网络设备并在命名空间中定义那个网络,请选择 SR-IOV。

MAC 地址

网络接口控制器的 MAC 地址。如果没有指定 MAC 地址,则会自动分配一个。

存储字段
名称选择描述

Source

空白(创建 PVC)

创建一个空磁盘。

通过 URL 导入(创建 PVC)

通过 URL(HTTP 或 HTTPS 端点)导入内容。

使用现有的 PVC

使用集群中已可用的 PVC。

克隆现有的 PVC(创建 PVC)

选择集群中可用的现有 PVC 并克隆它。

通过 Registry 导入(创建 PVC)

通过容器 registry 导入内容。

容器(临时)

从集群可以访问的 registry 中的容器上传内容。容器磁盘应只用于只读文件系统,如 CD-ROM 或临时虚拟机。

名称

 

磁盘的名称。名称可包含小写字母 (a-z)、数字 (0-9)、连字符 (-) 和句点 (.),最多 253 个字符。第一个和最后一个字符必须为字母数字。名称不得包含大写字母、空格或特殊字符。

Size

 

GiB 中磁盘的大小。

类型

 

磁盘类型。示例:磁盘或光盘

Interface

 

磁盘设备的类型。支持的接口包括 virtIOSATASCSI

Storage class

 

用于创建磁盘的存储类。

Advanced Volume Mode

 

定义持久性卷是否使用格式化的文件系统或原始块状态。默认为 Filesystem

Advanced Access Mode

 

持久性卷访问模式。支持的访问模式有 Single User(RWO)Shared Access(RWX)Read Only(ROX)

高级存储设置

以下高级存储设置可用于 空白从 URL 导入克隆现有的 PVC 磁盘。所有参数都是可选的。如果没有指定这些参数,系统将使用 kubevirt-storage-class-defaults 配置映射中的默认值。

名称参数描述

卷模式

Filesystem

在基于文件系统的卷中保存虚拟磁盘。

Block

直接将虚拟磁盘存储在块卷中。只有底层存储支持时才使用 Block

访问模式

Single User (RWO)

这个卷可以被一个单一的节点以 read/write 的形式挂载。

Shared Access (RWX)

卷可以被多个节点以读写模式挂载。

注意

对于一些功能(如虚拟机在节点间实时迁移)需要这个权限。

Read Only (ROX)

卷可以被多个节点以只读形式挂载。

8.15.5.3.1. 更新导入虚拟机的 NIC 名称

您必须更新从 VMware 导入的虚拟机的 NIC 名称,以符合 OpenShift Virtualization 命名约定。

流程

  1. 登录虚拟机。
  2. 进入 /etc/sysconfig/network-scripts 目录。
  3. 重新命名网络配置文件:

    $ mv vmnic0 ifcfg-eth0 1
    1
    第一个网络配置文件的名称为 ifcfg-eth0。额外网络配置文件按顺序编号,例如:ifcfg-eth1ifcfg-eth2
  4. 更新网络配置文件中的 NAMEDEVICE 参数:

    NAME=eth0
    DEVICE=eth0
  5. 重启网络:

    $ systemctl restart network

8.15.5.4. 导入虚拟机的故障排除

8.15.5.4.1. 日志

您可以检查 V2V Conversion pod 日志中的错误。

流程

  1. 运行以下命令来查看 V2V Conversion pod 名称:

    $ oc get pods -n <namespace> | grep v2v 1
    1
    指定导入虚拟机的命名空间。

    输出示例

    kubevirt-v2v-conversion-f66f7d-zqkz7            1/1     Running     0          4h49m

  2. 运行以下命令来查看 V2V Conversion pod 日志:

    $ oc logs <kubevirt-v2v-conversion-f66f7d-zqkz7> -f -n <namespace> 1
    1
    指定 VM Conversion pod 名称和命名空间。
8.15.5.4.2. é”™è¯¯ä¿¡æ�¯

此时会出现以下出错信息:

  • 如果导入前 VMware VM 没有关闭,导入的虚拟机会显示错误消息,在 OpenShift Container Platform 控制台中显示Readiness probe failed,V2V Conversion pod 日志会显示以下错误消息:

    INFO - have error: ('virt-v2v error: internal error: invalid argument: libvirt domain ‘v2v_migration_vm_1’ is running or paused. It must be shut down in order to perform virt-v2v conversion',)"
  • 如果非 admin 用户尝试导入虚拟机,则 OpenShift Container Platform 控制台中会显示以下错误消息:

    Could not load config map vmware-to-kubevirt-os in kube-public namespace
    Restricted Access: configmaps "vmware-to-kubevirt-os" is forbidden: User cannot get resource "configmaps" in API group "" in the namespace "kube-public"

    只有 admin 用户可以导入虚拟机。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.