搜索

虚拟化

download PDF
OpenShift Container Platform 4.10

OpenShift Virtualization 安装、使用和发行注记

Red Hat OpenShift Documentation Team

摘要

本文档提供有关如何在 OpenShift Container Platform 中使用 OpenShift Virtualization 的信息。

第 1 章 关于 OpenShift virtualization

OpenShift Virtualization 的功能与支持范围。

1.1. OpenShift Virtualization 的作用

OpenShift 虚拟化(OpenShift virtualization)是 OpenShift Container Platform 的一个附加组件,可用于运行和管理虚拟机工作负载以及容器工作负载。

OpenShift Virtualization 通过 Kubernetes 自定义资源添加新对象至 OpenShift Container Platform 集群中,以启用虚拟化任务。这些任务包括:

  • 创建和管理 Linux 和 Windows 虚拟机
  • 通过各种控制台和 CLI 工具连接至虚拟机
  • 导入和克隆现有虚拟机
  • 管理虚拟机上附加的网络接口控制器和存储磁盘
  • 在节点间实时迁移虚拟机

增强版 web 控制台提供了一个图形化的门户界面 来管理虚拟化资源以及 OpenShift Container Platform 集群容器和基础架构。

OpenShift Virtualization 的设计和测试,可与 Red Hat OpenShift Data Foundation 功能配合工作。

重要

使用 OpenShift Data Foundation 部署 OpenShift Virtualization 时,您必须为 Windows 虚拟机磁盘创建一个专用存储类。详情请参阅为 Windows 虚拟机优化 ODF PersistentVolume

您可以将 OpenShift Virtualization 与 OVN-KubernetesOpenShiftSDN认证的 OpenShift CNI 插件中列出的其他默认 Container Network Interface (CNI) 网络供应商一起使用。

1.1.1. OpenShift Virtualization 支持的集群版本

OpenShift Virtualization 4.10 支持在 OpenShift Container Platform 4.10 集群中使用。要使用 OpenShift Virtualization 的最新 z-stream 版本,您必须首先升级到 OpenShift Container Platform 的最新版本。

第 2 章 OpenShift Virtualization 入门

您可以安装和配置基本的 OpenShift Virtualization 环境,以探索其特性和功能。

注意

集群配置过程需要 cluster-admin 权限。

2.1. 开始前

2.2. 开始使用

创建虚拟机
连接到虚拟机
管理虚拟机
  • 从 web 控制台停止、启动、暂停和重启虚拟机。
  • 使用 virtctl 从命令行管理虚拟机,公开端口,连接到虚拟机的串行控制台。

2.3. 后续步骤

将虚拟机连接到二级网络
监控 OpenShift Virtualization 环境
自动您的部署

2.4. 其他资源

第 3 章 OpenShift Virtualization 发行注记

3.1. 关于 Red Hat OpenShift Virtualization

Red Hat OpenShift Virtualization 可让您将传统虚拟机(VM)放入 OpenShift Container Platform 中,与容器一同运行,并作为原生 Kubernetes 对象进行管理。

OpenShift Virtualization 由 OpenShift Virtualization 图标表示。

OpenShift Virtualization 可以与 OVN-KubernetesOpenShiftSDN 默认 Container Network Interface(CNI)网络供应商一起使用。

了解更多有关 OpenShift Virtualization 的作用

3.1.1. OpenShift Virtualization 支持的集群版本

OpenShift Virtualization 4.10 支持在 OpenShift Container Platform 4.10 集群中使用。要使用 OpenShift Virtualization 的最新 z-stream 版本,您必须首先升级到 OpenShift Container Platform 的最新版本。

3.1.2. 支持的客户端操作系统

要查看 OpenShift Virtualization 支持的客户机操作系统,请参阅 Red Hat OpenStack Platform、Red Hat Virtualization 和 OpenShift Virtualization 中认证的客户机操作系统

3.2. 使开源包含更多

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

3.3. 新增和改变的功能

  • OpenShift Virtualization 已在 Microsoft 的 Windows Server Virtualization Validation Program (SVVP) 中认证来运行 Windows Server 的工作负载。

    SVVP 认证适用于:

    • Red Hat Enterprise Linux CoreOS worker。在 Microsoft SVVP Catalog 中,它们名为 Red Hat OpenShift Container Platform 4 on RHEL CoreOS 8
    • Intel 和 AMD CPU。
  • OpenShift Virtualization 现在与 OpenShift Service Mesh 集成。您可以将虚拟机连接到服务网格, 以使用 IPv4 监控、视觉化和控制在默认 pod 网络上运行虚拟机工作负载的 pod 间的流量。

3.3.1. 快速启动

  • 有几个 OpenShift Virtualization 功能提供快速入门导览。要查看导览,请点击 OpenShift Virtualization 控制台标题菜单栏中的 Help 图标 ?,然后选择 Quick Starts。您可以通过在 Filter 字段中输入 virtual machine 关键字来过滤可用的导览。

3.3.2. 安装

  • 现在,如果 OpenShift Virtualization 工作负载支持实时迁移,它们会自动更新,如 virt-launcher Pod。您可以通过编辑 HyperConverged 自定义资源 来配置工作负载更新策略 或选择不使用将来的自动更新。
  • 现在,您可以将 OpenShift Virtualization 与单一节点集群一起使用,也称为单一节点 OpenShift(SNO)。

    注意

    单节点集群没有针对高可用性操作配置,这会导致 OpenShift Virtualization 行为有显著变化。

  • 现在,为所有 OpenShift Virtualization control plane 组件定义了资源请求和优先级类。

3.3.3. 网络

  • 现在,附加到 SR-IOV 网络接口的虚拟机不默认支持实时迁移

3.3.4. 存储

  • 具有热插虚拟磁盘的虚拟机支持 在线快照。但是,没有在虚拟机规格中的热插磁盘不会包含在快照中。
  • 您可以使用带有 hostpath 置备程序 (HPP)的 Kubernetes Container Storage Interface(CSI )驱动程序来配置虚拟机的本地存储。使用 CSI 驱动程序可在配置本地存储时最小化现有 OpenShift Container Platform 节点和集群的中断。

3.3.5. Web 控制台

3.4. 弃用和删除的功能

3.4.1. 已弃用的功能

弃用的功能包括在当前发行版本中并被支持。但是,它们将在以后的发行版本中删除,且不建议用于新部署。

  • 在以后的发行版本中,对旧的 HPP 自定义资源的支持以及关联的存储类将被弃用。从 OpenShift Virtualization 4.10 开始,HPP Operator 使用 Kubernetes Container Storage Interface(CSI)驱动程序来配置本地存储。Operator 继续支持 HPP 自定义资源及关联的存储类的现有(传统)格式。如果使用 HPP Operator,请计划作为迁移策略的一部分为 CSI 驱动程序创建存储类

3.4.2. 删除的功能

当前版本不支持删除的功能。

  • VM Import Operator 已从 OpenShift Virtualization 中删除。它被 Migration Toolkit for Virtualization 替代。
  • 此发行版本删除了 CentOS Linux 8 的模板,它在 2021 年 12 月 31 日达到 生命周期(EOL)结束。但是,OpenShift Container Platform 现在包含 CentOS Stream 8 和 CentOS Stream 9 的模板。

    注意

    所有 CentOS 发行版都支持社区支持。

3.5. 技术预览功能

这个版本中的一些功能当前还处于技术预览状态。它们并不适用于在生产环境中使用。红帽客户门户网站(Red Hat Customer Portal)为以下功能提供了技术预览功能支持范围

3.6. 程序错误修复

  • 如果您在克隆源可用前启动克隆操作,克隆操作现在可以成功完成,而无需使用临时解决方案。(BZ#1855182)
  • 如果虚拟机在版本 4.8 之前引用 OpenShift Virtualization 提供的已删除模板,则编辑虚拟机会失败。在 OpenShift Virtualization 4.8 及更新的版本中,OpenShift Virtualization Operator 会自动重新创建已删除的 OpenShift Virtualization 提供的模板。(BZ#1929165)
  • 现在,在使用带有 VNC 控制台的虚拟机时,可以成功使用 Send KeysDisconnect 按钮。(BZ#1964789)
  • 当您创建虚拟机时,它唯一的完全限定域名(FQDN)现在包含集群域名。(BZ#1998300)
  • 如果您热插虚拟磁盘,然后强制删除 virt-launcher pod,那么您不再丢失数据。(BZ#2007397)
  • 如果您尝试在其它关键组件共享文件系统的路径上安装 hostpath 置备程序(HPP)时,OpenShift Virtualization 现在发出 HPPSharingPoolPathWithOS 警报。

    要使用 HPP 为虚拟机磁盘提供存储,请使用与节点根文件系统分开的专用存储进行配置。否则,节点可能会耗尽存储,并无法正常工作。(BZ#2038985)

  • 如果您置备虚拟机磁盘,OpenShift Virtualization 现在分配一个足够大的持久性卷声明(PVC)来容纳请求的磁盘大小,而不是为每个虚拟机磁盘 PVC 发出 KubePersistentVolumeFillingUp 警报。您可以从虚拟机本身监控磁盘使用情况。(BZ#2039489)
  • 现在,您可以使用热插磁盘为虚拟机创建虚拟机快照。(BZ#2042908)
  • 现在,在使用集群范围代理配置时,可以成功导入虚拟机镜像。(BZ#2046271)

3.7. 已知问题

  • 您无法在单堆栈 IPv6 集群上运行 OpenShift Virtualization。(BZ#2193267)
  • 当您使用具有不同 SELinux 上下文的两个 pod 时,带有 ocs-storagecluster-cephfs 存储类的虚拟机无法迁移,虚拟机状态变为 Paused。这是因为两个 pod 会尝试同时访问共享 ReadWriteMany CephFS 卷。(BZ#2092271)

    • 作为临时解决方案,使用 ocs-storagecluster-ceph-rbd 存储类在使用 Red Hat Ceph Storage 的集群上实时迁移虚拟机。
  • 更新至 OpenShift Virtualization 4.10.5 会导致一些虚拟机(VM)处于实时迁移循环中。如果虚拟机清单中的 spec.volumes.containerDisk.path 字段设置为相对路径,会出现这种情况。

    • 作为临时解决方案,删除并重新创建 VM 清单,将 spec.volumes.containerDisk.path 字段的值设置为绝对路径。然后您可以更新 OpenShift Virtualization。
  • 如果单个节点包含超过 50 个镜像,pod 调度可能会在节点间进行平衡。这是因为节点上的镜像列表默认简写为 50。(BZ#1984442)

    • 作为临时解决方案,您可以通过编辑 KubeletConfig 对象,将 nodeStatusMaxImages 的值设置为 -1 来禁用镜像限值。
  • 如果您在一个集群中 hostpath 置备程序,而这个集群包括了其完全限定域名(FQDN)的长度超过 42 个字符的节点,则置备程序无法绑定 PVC。(BZ#2057157)

    错误信息示例

    E0222 17:52:54.088950       1 reflector.go:138] k8s.io/client-go/informers/factory.go:134: Failed to watch *v1beta1.CSIStorageCapacity: failed to list *v1beta1.CSIStorageCapacity: unable to parse requirement: values[0][csi.storage.k8s.io/managed-by]: Invalid value: "external-provisioner-<node_FQDN>": must be no more than 63 characters 1

    1
    虽然错误消息引用了最多 63 个字符,但它包括前缀为节点的 FQDN 的 external-provisioner- 字符串。
    • 作为临时解决方案,请运行以下命令在 hostpath 置备程序 CSI 驱动程序中禁用 storageCapacity 选项:

      $ oc patch csidriver kubevirt.io.hostpath-provisioner --type merge --patch '{"spec": {"storageCapacity": false}}'
  • 如果您的 OpenShift Container Platform 集群使用 OVN-Kubernetes 作为默认 Container Network Interface(CNI)供应商,则无法将 Linux 网桥或绑定设备附加到主机的默认接口,因为 OVN-Kubernetes 的主机网络拓扑发生了变化。(BZ#1885605)

    • 作为临时解决方案,您可以使用连接到主机的二级网络接口,或切换到 OpenShift SDN 默认 CNI 供应商。
  • 运行无法实时迁移的虚拟机可能会阻止 OpenShift Container Platform 集群升级。这包括使用 hostpath-provisioner 存储或 SR-IOV 网络接口的虚拟机。

    • 作为临时解决方案,您可以重新配置虚拟机以便在集群升级过程中关闭它们。在虚拟机配置文件的 spec 部分中:

      1. 修改 evictionStrategyrunStrategy 字段。

        1. 删除 evictionStrategy: LiveMigrate 字段。有关如何配置驱除策略的更多信息,请参阅配置虚拟机驱除策略
        2. runStrategy 字段设置为 Always
      2. 运行以下命令来设置默认 CPU 型号:

        注意

        您必须在启动支持实时迁移的虚拟机前进行此更改。

        $ oc annotate --overwrite -n openshift-cnv hyperconverged kubevirt-hyperconverged kubevirt.kubevirt.io/jsonpatch='[
          {
              "op": "add",
              "path": "/spec/configuration/cpuModel",
              "value": "<cpu_model>" 1
          }
        ]'
        1
        <cpu_model> 替换为实际 CPU 型号值。要确定此值,您可以为所有节点运行 oc describe node <node> 并查看 cpu-model-<name> 标签。选择所有节点上出现的 CPU 型号。
  • 如果您使用 Red Hat Ceph Storage 或 Red Hat OpenShift Data Foundation Storage,则一次克隆超过 100 个虚拟机可能会失败。(BZ#1989527)

    • 作为临时解决方案,您可以通过在存储配置集清单中设置 spec.cloneStrategy: copy 来执行主机辅助副本。例如:

      apiVersion: cdi.kubevirt.io/v1beta1
      kind: StorageProfile
      metadata:
        name: <provisioner_class>
      #   ...
      spec:
        claimPropertySets:
        - accessModes:
          - ReadWriteOnce
          volumeMode: Filesystem
        cloneStrategy: copy 1
      status:
        provisioner: <provisioner>
        storageClass: <provisioner_class>
      1
      默认克隆方法设置为 copy(复制)
  • 在某些情况下,多个虚拟机可以以读写模式挂载相同的 PVC,这可能会导致数据崩溃。(BZ#1992753)

    • 作为临时解决方案,请避免在使用多个虚拟机的读写模式中使用单个 PVC。
  • Pod Disruption Budget(PDB)可防止 pod 意外中断。如果 PDB 检测到 pod 中断,则 openshift-monitoring 会每 60 分钟发送 PodDisruptionBudgetAtLimit 警报,以使用 LiveMigrate 驱除策略。(BZ#2026733)

  • 在大型集群中,OpenShift Virtualization MAC 池管理器可能需要很长时间才能引导,OpenShift Virtualization 可能未就绪。(BZ#2035344)

    • 作为临时解决方案,如果您不需要 MAC 池功能,请运行以下命令来禁用这个子组件:

      $ oc annotate --overwrite -n openshift-cnv hco kubevirt-hyperconverged 'networkaddonsconfigs.kubevirt.io/jsonpatch=[
        {
          "op": "replace"
          "path": "/spec/kubeMacPool"
          "value": null
        }
       ]'
  • OpenShift Virtualization 将 pod 使用的服务帐户令牌链接到该特定 pod。OpenShift Virtualization 通过创建包含令牌的磁盘镜像来实施服务帐户卷。如果您迁移虚拟机,则服务帐户卷无效。(BZ#2037611)

    • 作为临时解决方案,使用用户帐户而不是服务帐户,因为用户帐户令牌没有绑定到特定 pod。
  • 如果虚拟机在关闭过程中崩溃或挂起,新的关闭请求不会停止虚拟机。(BZ#2040766)
  • 如果您将 HyperConverged 自定义资源(CR)配置为在安装驱动程序前启用介质设备,则不会启用介质设备。更新可能会触发此问题。例如,如果在 daemonset 之前更新 virt-handler,它安装 NVIDIA 驱动程序,则节点无法提供虚拟机 GPU。(BZ#2046298)

    • 作为临时解决方案:

      1. HyperConverged CR 中删除 mediatedDevicesConfigurationpermittedHostDevices
      2. 使用您要使用的配置更新 mediatedDevicesConfigurationpermittedHostDevices 小节。
  • VM 向导中的 YAML 示例被硬编码,并不总是包含最新的上游更改。(BZ#2055492)
  • 如果您使用 csi-clone 克隆策略克隆超过 100 个虚拟机,则 Ceph CSI 可能无法清除克隆。手动删除克隆也会失败。(BZ#2055595)

    • 作为临时解决方案,您可以重启 ceph-mgr 来清除虚拟机克隆。
  • 未授权用户无法在虚拟机网络接口选项卡上使用添加网络接口按钮。(BZ#2056420)

    • 作为临时解决方案,未授权用户可以在创建虚拟机时使用 VM 向导时添加额外的网络接口。
  • 非特权用户因为 RBAC 规则而无法向虚拟机添加磁盘。(BZ#2056421)

    • 作为临时解决方案,请手动添加 RBAC 规则来允许特定用户添加磁盘。
  • web 控制台不显示部署到自定义命名空间的虚拟机模板。仅部署到 default 命名空间的模板才会显示在 web 控制台中。(BZ#2054650)

    • 作为临时解决方案,请避免将模板部署到自定义命名空间中。
  • 在单节点 OpenShift(SNO)集群中,如果 VMI 的 spec.evictionStrategy 字段设置为 LiveMigrate,则更新集群会失败。要使实时迁移成功,集群必须有多个 worker 节点。(BZ#2073880)

    • 有两个临时解决方案:

      • 从 VM 声明中删除 spec.evictionStrategy 字段。
      • 在更新 OpenShift Container Platform 前手动停止虚拟机。

第 4 章 安装

4.1. 为 OpenShift Virtualization 准备集群

在安装 OpenShift Virtualization 前,参阅这个部分以确保集群满足要求。

重要

您可以使用任何安装方法(包括用户置备的、安装程序置备或辅助安装程序)来部署 OpenShift Container Platform。但是,安装方法和集群拓扑可能会影响 OpenShift Virtualization 功能,如快照或实时迁移。

单节点 Openshift 的不同

您可以在单节点集群中安装 OpenShift Virtualization。如需更多信息,请参阅关于单节点 OpenShift。单节点 OpenShift 不支持高可用性,这会产生以下区别:

FIPS 模式

如果使用 FIPS 模式安装集群,则 OpenShift Virtualization 不需要额外的设置。

IPv6

您无法在单堆栈 IPv6 集群上运行 OpenShift Virtualization。(BZ#2193267)

4.1.1. 硬件和操作系统要求

查看 OpenShift Virtualization 的以下硬件和操作系统要求。

支持的平台

重要

在 AWS 裸机实例或 IBM Cloud Bare Metal 服务器上安装 OpenShift Virtualization 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

  • 不支持由其他云供应商提供的裸机实例或服务器。

CPU 要求

  • Red Hat Enterprise Linux(RHEL)8 支持
  • 支持 Intel 64 或 AMD64 CPU 扩展
  • 启用 Intel VT 或 AMD-V 硬件虚拟化扩展
  • 启用 NX(无执行)标记

存储要求

  • OpenShift Container Platform 支持
警告

如果使用 Red Hat OpenShift Data Foundation 部署 OpenShift Virtualization,您必须为 Windows 虚拟机磁盘创建一个专用存储类。详情请参阅为 Windows 虚拟机优化 ODF PersistentVolume

操作系统要求

  • 在 worker 节点上安装的 Red Hat Enterprise Linux CoreOS(RHCOS)

    注意

    不支持 RHEL worker 节点。

  • 如果您的集群使用具有不同 CPU 的 worker 节点,则可能会出现实时迁移失败,因为不同的 CPU 具有不同的容量。为了避免这种故障,请为每个节点使用适当的容量,并在虚拟机上设置节点关联性以确保迁移成功。如需更多信息,请参阅配置所需的节点关联性规则

其他资源

4.1.2. 物理资源开销要求

OpenShift Virtualization 是 OpenShift Container Platform 的一个附加组件,它会带来额外的开销。除了 OpenShift Container Platform 要求外,每个集群机器都必须满足以下开销要求。覆盖集群中的物理资源可能会影响性能。

重要

本文档中给出的数字基于红帽的测试方法和设置。这些数字会根据您自己的设置和环境而有所不同。

4.1.2.1. 内存开销

使用以下因素计算 OpenShift Virtualization 的内存开销值。

集群内存开销

Memory overhead per infrastructure node ≈ 150 MiB

Memory overhead per worker node ≈ 360 MiB

另外,OpenShift Virtualization 环境资源需要总计 2179 MiB 的内存,分布到所有基础架构节点。

虚拟机内存开销

Memory overhead per virtual machine ≈ (1.002 * requested memory) + 146 MiB  \
                + 8 MiB * (number of vCPUs) \ 1
             + 16 MiB * (number of graphics devices) 2

1
虚拟机请求的虚拟 CPU 数量
2
虚拟机请求的虚拟图形卡数

如果您的环境包含单一根 I/O 虚拟化(SR-IOV)网络设备或图形处理单元(GPU),请为每个设备分配 1 GiB 额外的内存开销。

4.1.2.2. CPU 开销

使用以下内容计算 OpenShift Virtualization 的集群处理器开销要求。每个虚拟机的 CPU 开销取决于您的单独设置。

集群 CPU 开销

CPU overhead for infrastructure nodes ≈ 4 cores

OpenShift Virtualization 增加集群级别服务的整体使用,如日志记录、路由和监控。要考虑这个工作负载,请确保托管基础架构组件的节点分配了用于不同节点的 4 个额外内核(4000 毫秒)的容量。

CPU overhead for worker nodes ≈ 2 cores + CPU overhead per virtual machine

除了虚拟机工作负载所需的 CPU 外,每个托管虚拟机的 worker 节点都必须有 2 个额外内核(2000 毫秒)用于 OpenShift Virtualization 管理工作负载。

虚拟机 CPU 开销

如果请求专用 CPU,则会对集群 CPU 开销要求有 1:1 影响。否则,没有有关虚拟机所需 CPU 数量的具体规则。

4.1.2.3. 存储开销

使用以下指南来估算 OpenShift Virtualization 环境的存储开销要求。

集群存储开销

Aggregated storage overhead per node ≈ 10 GiB

10 GiB 在安装 OpenShift Virtualization 时,集群中每个节点的磁盘存储影响估计值。

虚拟机存储开销

每个虚拟机的存储开销取决于虚拟机内的具体资源分配请求。该请求可能用于集群中其他位置托管的节点或存储资源的临时存储。OpenShift Virtualization 目前不会为正在运行的容器本身分配任何额外的临时存储。

4.1.2.4. 示例

作为集群管理员,如果您计划托管集群中的 10 个虚拟机,每个虚拟机都有 1 GiB RAM 和 2 个 vCPU,集群中的内存影响为 11.68 GiB。集群中每个节点的磁盘存储影响估算为 10 GiB,托管虚拟机工作负载的 worker 节点的 CPU 影响最小 2 个内核。

4.1.3. 对象最大值

在规划集群时,您必须考虑以下测试的对象最大值:

4.1.4. 受限网络环境

如果在没有互联网连接的受限环境中安装 OpenShift Virtualization,您必须为受限网络配置 Operator Lifecycle Manager

如果您拥有有限的互联网连接,您可以在 Operator Lifecycle Manager 中配置代理支持 以访问红帽提供的 OperatorHub。

4.1.5. 实时迁移

实时迁移有以下要求:

  • 使用 ReadWriteMany (RWX)访问模式的共享存储.
  • 足够的 RAM 和网络带宽。
  • 如果虚拟机使用主机型号 CPU,则节点必须支持虚拟机的主机型号 CPU。
注意

您必须确保集群中有足够的内存请求容量来支持节点排空会导致实时迁移。您可以使用以下计算来确定大约所需的备用内存:

Product of (Maximum number of nodes that can drain in parallel) and (Highest total VM memory request allocations across nodes)

默认的在集群中可以并行运行的迁移数量为 5。

4.1.6. 快照和克隆

有关快照和克隆要求,请参阅 OpenShift Virtualization 存储功能

4.1.7. 集群高可用性选项

您可以为集群配置以下高可用性(HA)选项之一:

  • 通过部署机器健康检查,可以使用安装程序置备的基础架构 (IPI)自动高可用性。

    注意

    在使用安装程序置备的基础架构安装并正确配置 MachineHealthCheck 的 OpenShift Container Platform 集群中,如果节点上的 MachineHealthCheck 失败且对集群不可用,则该节点可以被回收使用。在故障节点上运行的虚拟机之后会发生什么,这取决于一系列条件。如需了解更多有关潜在结果以及 RunStrategies 如何影响这些结果的信息,请参阅虚拟机的 RunStrategies

  • 通过在 OpenShift Container Platform 集群上使用 Node Health Check Operator 来部署 NodeHealthCheck 控制器,可以使用 IPI 和非 IPI 自动高可用性。控制器标识不健康的节点,并使用 Self Node Remediation Operator 来修复不健康的节点。

    重要

    Node Health Check Operator 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

    有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

  • 任何平台的高可用性可通过使用监控系统或合格的人类监控节点可用性来实现。当节点丢失时,关闭并运行 oc delete node <lost_node>

    注意

    如果没有外部监控系统或合格的人类监控节点运行状况,虚拟机就失去高可用性。

4.2. 为 OpenShift Virtualization 组件指定节点

通过配置节点放置规则来指定要部署 OpenShift Virtualization Operator、工作负载和控制器的节点。

注意

您可以在安装 OpenShift Virtualization 后为一些组件配置节点放置,但如果要为工作负载配置节点放置,则一定不能存在虚拟机。

4.2.1. 关于虚拟化组件的节点放置

您可能想要自定义 OpenShift Virtualization 在什么位置部署其组件,以确保:

  • 虚拟机仅部署到设计为用于虚拟化工作负载的节点上。
  • Operator 仅在基础架构节点上部署。
  • 某些节点不会受到 OpenShift Virtualization 的影响。例如,您有与集群中运行的虚拟化不相关的工作负载,希望这些工作负载与 OpenShift Virtualization 分离。
4.2.1.1. 如何将节点放置规则应用到虚拟化组件

您可以通过直接编辑对应对象或使用 Web 控制台为组件指定节点放置规则。

  • 对于 Operator Lifecycle Manager(OLM)部署的 OpenShift Virtualization Operator,直接编辑 OLM Subscription 对象。目前,您无法使用 Web 控制台为 Subscription 对象配置节点放置规则。
  • 对于 OpenShift Virtualization Operator 部署的组件,直接编辑 HyperConverged 对象,或在 OpenShift Virtualization 安装过程中使用 Web 控制台进行配置。
  • 对于 hostpath 置备程序,直接编辑 HostPathProvisioner 对象,或使用 web 控制台进行配置。

    警告

    您必须将 hostpath 置备程序和虚拟化组件调度到同一节点上。否则,使用 hostpath 置备程序的虚拟化 pod 无法运行。

根据对象,您可以使用以下一个或多个规则类型:

nodeSelector
允许将 Pod 调度到使用您在此字段中指定的键值对标记的节点上。节点必须具有与所有列出的对完全匹配的标签。
关联性
可让您使用更宽松的语法来设置与 pod 匹配的规则。关联性也允许在规则应用方面更加精细。例如,您可以指定规则是首选项,而不是硬要求,因此如果不满足该规则,仍可以调度 pod。
容限(tolerations)
允许将 pod 调度到具有匹配污点的节点。如果某个节点有污点(taint),则该节点只接受容许该污点的 pod。
4.2.1.2. 放置在 OLM 订阅对象中的节点

要指定 OLM 部署 OpenShift Virtualization Operator 的节点,在 OpenShift Virtualization 安装过程中编辑 Subscription 对象。您可以在 spec.config 字段中包含节点放置规则,如下例所示:

apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: hco-operatorhub
  namespace: openshift-cnv
spec:
  source: redhat-operators
  sourceNamespace: openshift-marketplace
  name: kubevirt-hyperconverged
  startingCSV: kubevirt-hyperconverged-operator.v4.10.10
  channel: "stable"
  config: 1
1
config 字段支持 nodeSelectortolerations,但它不支持 关联性
4.2.1.3. HyperConverged 对象中的节点放置

要指定 OpenShift Virtualization 部署其组件的节点,您可以在 OpenShift Virtualization 安装过程中创建的 HyperConverged Cluster 自定义资源(CR)文件中包含 nodePlacement 对象。您可以在 spec.infraspec.workloads 字段中包含 nodePlacement,如下例所示:

apiVersion: hco.kubevirt.io/v1beta1
kind: HyperConverged
metadata:
  name: kubevirt-hyperconverged
  namespace: openshift-cnv
spec:
  infra:
    nodePlacement: 1
    ...
  workloads:
    nodePlacement:
    ...
1
nodePlacement 字段支持 nodeSelectoraffinitytolerations 字段。
4.2.1.4. HostPathProvisioner 对象中的节点放置

您可以在安装 hostpath 置备程序时创建的 HostPathProvisioner 对象的 spec.workload 字段中配置节点放置规则。

apiVersion: hostpathprovisioner.kubevirt.io/v1beta1
kind: HostPathProvisioner
metadata:
  name: hostpath-provisioner
spec:
  imagePullPolicy: IfNotPresent
  pathConfig:
    path: "</path/to/backing/directory>"
    useNamingPrefix: false
  workload: 1
1
workload 字段支持 nodeSelectoraffinitytolerations 字段。
4.2.1.5. 其他资源

4.2.2. 清单示例

以下示例 YAML 文件使用 nodePlacementaffinity(关联性)tolerations(容限)对象为 OpenShift Virtualization 组件自定义节点放置。

4.2.2.1. Operator Lifecycle Manager Subscription 对象
4.2.2.1.1. 示例:在 OLM 订阅对象中使用 nodeSelector 的节点放置

在本例中,配置了 nodeSelector,OLM 将 OpenShift Virtualization Operator 放置到标记为 example.io/example-infra-key = example-infra-value 的节点上。

apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: hco-operatorhub
  namespace: openshift-cnv
spec:
  source: redhat-operators
  sourceNamespace: openshift-marketplace
  name: kubevirt-hyperconverged
  startingCSV: kubevirt-hyperconverged-operator.v4.10.10
  channel: "stable"
  config:
    nodeSelector:
      example.io/example-infra-key: example-infra-value
4.2.2.1.2. 示例:将容限放置在 OLM 订阅对象中

在本例中,为 OLM 部署 OpenShift Virtualization Operator 保留的节点使用 key=virtualization:NoSchedule 污点标记。只有具有与容限匹配的 pod 才会调度到这些节点。

apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: hco-operatorhub
  namespace: openshift-cnv
spec:
  source: redhat-operators
  sourceNamespace: openshift-marketplace
  name: kubevirt-hyperconverged
  startingCSV: kubevirt-hyperconverged-operator.v4.10.10
  channel: "stable"
  config:
    tolerations:
    - key: "key"
      operator: "Equal"
      value: "virtualization"
      effect: "NoSchedule"
4.2.2.2. HyperConverged 对象
4.2.2.2.1. 示例: 在 HyperConverged Cluster CR 中使用 nodeSelector 进行节点放置

在本例中,配置了 nodeSelector,将基础架构资源放置在带有 example.io/example-infra-key = example-infra-value = example-infra-value 的节点上,把工作负载放置在带有 example.io/example-workloads-key = example-workloads-value 的节点上。

apiVersion: hco.kubevirt.io/v1beta1
kind: HyperConverged
metadata:
  name: kubevirt-hyperconverged
  namespace: openshift-cnv
spec:
  infra:
    nodePlacement:
      nodeSelector:
        example.io/example-infra-key: example-infra-value
  workloads:
    nodePlacement:
      nodeSelector:
        example.io/example-workloads-key: example-workloads-value
4.2.2.2.2. 示例:在 HyperConverged Cluster CR 中使用关联性进行节点放置

在本例中,配置了 affinity,将基础架构资源放置在带有 example.io/example-infra-key = example-value 的节点上,把工作负载放置在带有 example.io/example-workloads-key = example-workloads-value 的节点上。对于工作负载,最好使用八个以上 CPU 的节点,但如果它们不可用,仍可调度 pod。

apiVersion: hco.kubevirt.io/v1beta1
kind: HyperConverged
metadata:
  name: kubevirt-hyperconverged
  namespace: openshift-cnv
spec:
  infra:
    nodePlacement:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: example.io/example-infra-key
                operator: In
                values:
                - example-infra-value
  workloads:
    nodePlacement:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: example.io/example-workloads-key
                operator: In
                values:
                - example-workloads-value
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: example.io/num-cpus
                operator: Gt
                values:
                - 8
4.2.2.2.3. 示例:在 HyperConverged Cluster CR 中使用容限进行节点放置

在本例中,为 OpenShift Virtualization 组件保留的节点使用 key=virtualization:NoSchedule 污点标记。只有具有与容限匹配的 pod 才会调度到这些节点。

apiVersion: hco.kubevirt.io/v1beta1
kind: HyperConverged
metadata:
  name: kubevirt-hyperconverged
  namespace: openshift-cnv
spec:
  workloads:
    nodePlacement:
      tolerations:
      - key: "key"
        operator: "Equal"
        value: "virtualization"
        effect: "NoSchedule"
4.2.2.3. HostPathProvisioner 对象
4.2.2.3.1. 示例: HostPathProvisioner 对象中的 nodeSelector 的节点放置

在本例中,配置了 nodeSelector,以便将工作负载放置到带有 example.io/example-workloads-key = example-workloads-value 的节点上。

apiVersion: hostpathprovisioner.kubevirt.io/v1beta1
kind: HostPathProvisioner
metadata:
  name: hostpath-provisioner
spec:
  imagePullPolicy: IfNotPresent
  pathConfig:
    path: "</path/to/backing/directory>"
    useNamingPrefix: false
  workload:
    nodeSelector:
      example.io/example-workloads-key: example-workloads-value

4.3. 使用 Web 控制台安装 OpenShift Virtualization

安装 OpenShift Virtualization 以便在 OpenShift Container Platform 集群中添加虚拟化功能。

您可以使用 OpenShift Container Platform 4.10 web 控制台来订阅和部署 OpenShift Virtualization Operator。

4.3.1. 安装 OpenShift Virtualization Operator

您可以从 OpenShift Container Platform Web 控制台安装 OpenShift Virtualization Operator。

先决条件

  • 在集群上安装 OpenShift Container Platform 4.10。
  • 以具有 cluster-admin 权限的用户身份登录到 OpenShift Container Platform web 控制台。

流程

  1. Administrator 视角中,点 OperatorsOperatorHub
  2. Filter by keyword 字段中输入 OpenShift Virtualization
  3. 选择 OpenShift Virtualization 标题。
  4. 阅读 Operator 信息并单击 Install
  5. Install Operator 页面中:

    1. 从可用 Update Channel 选项列表中选择 stable。这样可确保安装与 OpenShift Container Platform 版本兼容的 OpenShift Virtualization 版本。
    2. 对于安装的命名空间,请确保选择了 Operator 推荐的命名空间选项。这会在 openshift-cnv 命名空间中安装 Operator,该命名空间在不存在时自动创建。

      警告

      尝试在 openshift-cnv 以外的命名空间中安装 OpenShift Virtualization Operator 会导致安装失败。

    3. 对于 Approval Strategy,强烈建议您选择 Automatic (默认值),以便在 stable 更新频道中提供新版本时 OpenShift Virtualization 会自动更新。

      虽然可以选择 Manual 批准策略,但这不可取,因为它会给集群提供支持和功能带来高风险。只有在您完全了解这些风险且无法使用 Automatic 时,才选择 Manual

      警告

      因为 OpenShift Virtualization 只在与对应的 OpenShift Container Platform 版本搭配使用时被支持,所以缺少的 OpenShift Virtualization 更新可能会导致您的集群不被支持。

  6. 点击 Install 使 Operator 可供 openshift-cnv 命名空间使用。
  7. 当 Operator 成功安装时,点 Create HyperConverged
  8. 可选: 为 OpenShift Virtualization 组件配置 InfraWorkloads 节点放置选项。
  9. 点击 Create 启动 OpenShift Virtualization。

验证

  • 导航到 WorkloadsPods 页面,并监控 OpenShift Virtualization Pod,直至全部处于 Running 状态。在所有 pod 都处于 Running 状态后,您可以使用 OpenShift Virtualization。

4.3.2. 后续步骤

您可能还需要额外配置以下组件:

  • hostpath 置备程序是设计用于 OpenShift Virtualization 的本地存储置备程序。如果要为虚拟机配置本地存储,您必须首先启用 hostpath 置备程序。

4.4. 使用 CLI 安装 OpenShift Virtualization

安装 OpenShift Virtualization 以便在 OpenShift Container Platform 集群中添加虚拟化功能。您可以使用命令行将清单应用到集群,以订阅和部署 OpenShift Virtualization Operator。

注意

要指定 OpenShift Virtualization 安装其组件的节点,请配置节点放置规则

4.4.1. 先决条件

  • 在集群上安装 OpenShift Container Platform 4.10。
  • 安装 OpenShift CLI (oc) 。
  • 以具有 cluster-admin 特权的用户身份登录。

4.4.2. 使用 CLI 订阅 OpenShift virtualization 目录

在安装 OpenShift Virtualization 前,需要订阅到 OpenShift Virtualization catalog。订阅会授予 OpenShift virtualization Operator 对 openshift-cnv 命名空间的访问权限。

为了订阅,在您的集群中应用一个单独的清单(manifest)来配置 NamespaceOperatorGroupSubscription 对象。

流程

  1. 创建一个包含以下清单的 YAML 文件:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: openshift-cnv
    ---
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: kubevirt-hyperconverged-group
      namespace: openshift-cnv
    spec:
      targetNamespaces:
        - openshift-cnv
    ---
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: hco-operatorhub
      namespace: openshift-cnv
    spec:
      source: redhat-operators
      sourceNamespace: openshift-marketplace
      name: kubevirt-hyperconverged
      startingCSV: kubevirt-hyperconverged-operator.v4.10.10
      channel: "stable" 1
    1
    使用 stable 频道可确保您安装与 OpenShift Container Platform 版本兼容的 OpenShift Virtualization 版本。
  2. 运行以下命令,为 OpenShift Virtualization 创建所需的 NamespaceOperatorGroupSubscription对象:

    $ oc apply -f <file name>.yaml
注意

您可以在 YAML 文件中配置证书轮转参数

4.4.3. 使用 CLI 部署 OpenShift Virtualization Operator

您可以使用 oc CLI 部署 OpenShift Virtualization Operator。

先决条件

  • openshift-cnv 命名空间中的一个有效的 OpenShift virtualization 目录订阅。

流程

  1. 创建一个包含以下清单的 YAML 文件:

    apiVersion: hco.kubevirt.io/v1beta1
    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
      namespace: openshift-cnv
    spec:
  2. 运行以下命令来部署 OpenShift Virtualization Operator:

    $ oc apply -f <file_name>.yaml

验证

  • 通过观察 openshift-cnv 命名空间中集群服务版本(CSV)的 PHASE 来确保 OpenShift Virtualization 已被成功部署。运行以下命令:

    $ watch oc get csv -n openshift-cnv

    如果部署成功,则会显示以下输出:

    输出示例

    NAME                                      DISPLAY                    VERSION   REPLACES   PHASE
    kubevirt-hyperconverged-operator.v4.10.10   OpenShift Virtualization   4.10.10                Succeeded

4.4.4. 后续步骤

您可能还需要额外配置以下组件:

  • hostpath 置备程序是设计用于 OpenShift Virtualization 的本地存储置备程序。如果要为虚拟机配置本地存储,您必须首先启用 hostpath 置备程序。

4.5. 启用 virtctl 客户端

virtctl 客户端是用于管理 OpenShift Virtualization 资源的命令行实用程序。它适用于 Linux、macOS 和 Windows 发行版。

4.5.1. 下载并安装 virtctl 客户端

4.5.1.1. 下载 virtctl 客户端

使用 ConsoleCLIDownload 自定义资源 (CR) 中提供的链接下载 virtctl 客户端。

流程

  1. 运行以下命令来查看 ConsoleCLIDownload 对象:

    $ oc get ConsoleCLIDownload virtctl-clidownloads-kubevirt-hyperconverged -o yaml
  2. 使用为您的发行版本列出的链接下载 virtctl 客户端。
4.5.1.2. 安装 virtctl 客户端

从适合您的操作系统的位置下载后,提取并安装 virtctl 客户端。

先决条件

  • 您必须已下载 virtctl 客户端。

流程

  • Linux:

    1. 解压 tarball。以下 CLI 命令将其提取到与 tarball 相同的目录中:

      $ tar -xvf <virtctl-version-distribution.arch>.tar.gz
    2. 进入解压的文件夹 hierachy 并运行以下命令使 virtctl 二进制可执行文件:

      $ chmod +x <virtctl-file-name>
    3. virtctl 二进制文件移到 PATH 环境变量中的目录中。
    4. 要检查您的路径,请运行以下命令:

      $ echo $PATH
  • 对于 Windows 用户:

    1. 解包和解压存档。
    2. 进入解压的目录中,双击 virtctl 可执行文件来安装客户端。
    3. virtctl 二进制文件移到 PATH 环境变量中的目录中。
    4. 要检查您的路径,请运行以下命令:

      C:\> path
  • 对于 macOS 用户:

    1. 解包和解压存档。
    2. virtctl 二进制文件移到 PATH 环境变量中的目录中。
    3. 要检查您的路径,请运行以下命令:

      echo $PATH

4.5.2. 其他设置选项

4.5.2.1. 使用 yum 工具安装 virtctl 客户端

kubevirt-virtctl 软件包安装 virtctl 客户端。

流程

  • 安装 kubevirt-virtctl 软件包:

    # yum install kubevirt-virtctl
4.5.2.2. 启用 OpenShift Virtualization 仓库

红帽为 Red Hat Enterprise Linux 8 和 Red Hat Enterprise Linux 7 提供 OpenShift Virtualization 仓库:

  • Red Hat Enterprise Linux 8 软件仓库: cnv-4.10-for-rhel-8-x86_64-rpms
  • Red Hat Enterprise Linux 7 软件仓库: rhel-7-server-cnv-4.10-rpms

subscription-manager 中启用存储库的过程与在两个平台中启用的过程相同。

流程

  • 使用以下命令为您的系统启用适当的 OpenShift virtualization 仓库:

    # subscription-manager repos --enable <repository>

4.5.3. 其他资源

4.6. 使用 Web 控制台卸载 OpenShift Virtualization

您可使用 OpenShift Container Platform Web 控制台来卸载 OpenShift Virtualization。

4.6.1. 先决条件

  • 已安装 OpenShift Virtualization 4.10。
  • 您必须删除所有 虚拟机虚拟机实例数据卷

    重要

    在不删除这些对象的情况下尝试卸载 OpenShift Virtualization 会导致失败。

4.6.2. 删除 OpenShift Virtualization Operator Deployment 自定义资源

要卸载 OpenShift Virtualization,首先需要删除 OpenShift Virtualization Operator Deployment 自定义资源。

先决条件

  • 创建 OpenShift Virtualization Operator Deployment 自定义资源。

流程

  1. 在 OpenShift Container Platform web 控制台中,从 Project 列表中选择 openshift-cnv
  2. 导航到 OperatorsInstalled Operators 页面。
  3. 点击 OpenShift Virtualization
  4. OpenShift Virtualization Operator Deployment 选项卡。
  5. 点击包含 kubevirt-hyperconverged 自定义资源 kebab 行中的 Options 菜单。在展开的菜单中,点击 Delete HyperConverged Cluster
  6. 在确认窗口中点击 Delete
  7. 进入 WorkloadsPods 页面,验证是否只有 Operator pod 正在运行。
  8. 在一个终端窗口中,运行以下命令清理剩余的资源:

    $ oc delete apiservices v1alpha3.subresources.kubevirt.io -n openshift-cnv

4.6.3. 删除 OpenShift Virtualization 目录订阅

要完成卸载 OpenShift Virtualization,删除 OpenShift virtualization 目录订阅。

先决条件

  • 一个有效的 OpenShift Virtualization 目录订阅

流程

  1. 导航到 OperatorsOperatorHub 页面。
  2. 搜索 OpenShift Virtualization 并选择它。
  3. 点击 Uninstall
注意

现在可删除 openshift-cnv 命名空间。

4.6.4. 使用 web 控制台删除命令空间

您可以使用 OpenShift Container Platform web 控制台删除一个命名空间。

注意

如果您没有删除命名空间的权限,则 Delete Namespace 选项不可用。

流程

  1. 导航至 AdministrationNamespaces
  2. 在命名空间列表中找到您要删除的命名空间。
  3. 在命名空间列表的右侧,从 Options 菜单 kebab 中选择 Delete Namespace
  4. Delete Namespace 页打开时,在相关项中输入您要删除的命名空间的名称。
  5. 点击 Delete

4.7. 使用 CLI 卸载 OpenShift Virtualization

您可以使用 OpenShift Container Platform CLI 卸载 OpenShift Virtualization。

4.7.1. 先决条件

  • 已安装 OpenShift Virtualization 4.10。
  • 您必须删除所有 虚拟机虚拟机实例数据卷

    重要

    在不删除这些对象的情况下尝试卸载 OpenShift Virtualization 会导致失败。

4.7.2. 删除 OpenShift Virtualization

您可以使用 CLI 删除 OpenShift Virtualization。

先决条件

  • 安装 OpenShift CLI(oc)。
  • 使用具有 cluster-admin 权限的账户访问 OpenShift Virtualization 集群。
注意

当使用 CLI 删除 OLM 中的 OpenShift Virtualization Operator 订阅时,集群不会从集群中删除 ClusterServiceVersion(CSV)对象。要完全卸载 OpenShift Virtualization,您必须明确删除 CSV。

流程

  1. 删除 HyperConverged 自定义资源:

    $ oc delete HyperConverged kubevirt-hyperconverged -n openshift-cnv
  2. 删除 Operator Lifecycle Manager(OLM)中的 OpenShift Virtualization 订阅:

    $ oc delete subscription kubevirt-hyperconverged -n openshift-cnv
  3. 将 OpenShift Virtualization 的集群服务版本(CSV)名称设置为环境变量:

    $ CSV_NAME=$(oc get csv -n openshift-cnv -o=jsonpath="{.items[0].metadata.name}")
  4. 通过指定上一步中的 CSV 名称从 OpenShift Virtualization 集群中删除 CSV:

    $ oc delete csv ${CSV_NAME} -n openshift-cnv

    当确认消息表示成功删除 CSV 时,则表示 OpenShift Virtualization 被卸载:

    输出示例

    clusterserviceversion.operators.coreos.com "kubevirt-hyperconverged-operator.v4.10.10" deleted

第 5 章 更新 OpenShift Virtualization

了解 Operator Lifecycle Manager (OLM) 如何为 OpenShift Virtualization 提供 z-stream 和次要版本更新。

5.1. 关于更新 OpenShift Virtualization

  • Operator Lifecycle Manager (OLM) 管理 OpenShift Virtualization Operator 的生命周期。Marketplace Operator 在 OpenShift Container Platform 安装过程中部署,使外部 Operator 可供集群使用。
  • OLM 为 OpenShift Virtualization 提供 z-stream 和次要版本更新。在将 OpenShift Container Platform 更新至下一个次版本时,次版本更新将变为可用。在不先更新 OpenShift Container Platform 的情况下,您无法将 OpenShift Virtualization 更新至下一个次版本。
  • OpenShift Virtualization 订阅使用一个名为 stable 的单一更新频道。stable 频道确保 OpenShift Virtualization 和 OpenShift Container Platform 版本兼容。
  • 如果您的订阅的批准策略被设置为 Automatic,则当 stable 频道中提供新版本的 Operator 时,更新过程就会马上启动。强烈建议您使用 Automatic(自动) 批准策略来维护可支持的环境。只有在运行对应的 OpenShift Container Platform 版本时,才会支持 OpenShift Virtualization 的每个次要版本。例如,您必须在 OpenShift Container Platform 4.10 上运行 OpenShift Virtualization 4.10。

    • 虽然可以选择 Manual(手工) 批准策略,但并不建议这样做,因为它存在集群的支持性和功能风险。使用 Manual 批准策略时,您必须手动批准每个待处理的更新。如果 OpenShift Container Platform 和 OpenShift Virtualization 更新不同步,您的集群将无法被支持。
  • 更新完成所需时间取决于您的网络连接情况。大部分自动更新可在十五分钟内完成。
  • 更新 OpenShift Virtualization 不会中断网络连接。
  • 数据卷及其关联的持久性卷声明会在更新过程中保留。
重要

如果您的虚拟机正在运行,使用 hostpath 置备程序存储,则无法实时迁移,并可能会阻止 OpenShift Container Platform 集群更新。

作为临时解决方案,您可以重新配置虚拟机以便在集群更新过程中自动关闭它们。删除 evictionStrategy: LiveMigrate 字段,并将 runStrategy 字段设置为 Always

5.2. 配置自动工作负载更新

5.2.1. 关于工作负载更新

更新 OpenShift Virtualization 时,虚拟机工作负载(包括 libvirtvirt-launcher )和 qemu (如果支持实时迁移)会自动更新。

注意

每个虚拟机均有一个 virt-launcher pod,用于运行虚拟机实例(VMI)。virt-launcher pod 运行一个 libvirt 实例,用于管理虚拟机(VM)进程。

您可以通过编辑 HyperConverged 自定义资源 (CR) 的 spec.workloadUpdateStrategy 小节来配置工作负载的更新方式。可用的工作负载更新方法有两种: LiveMigrateEvict

因为 Evict 方法关闭 VMI pod,所以只启用 LiveMigrate 更新策略。

LiveMigrate 是唯一启用的更新策略时:

  • 支持实时迁移的 VMI 会在更新过程中进行迁移。VM 客户机会进入启用了更新组件的新 pod。
  • 不支持实时迁移的 VMI 不会中断或更新。

    • 如果 VMI 有 LiveMigrate 驱除策略,但没有支持实时迁移。

如果您同时启用 LiveMigrateEvict

  • 支持实时迁移的 VMI 使用 LiveMigrate 更新策略。
  • 不支持实时迁移的 VMI 使用 Evict 更新策略。如果 VMI 由具有 alwaysrunStrategy 值的 VirtualMachine 对象控制,则会在带有更新组件的新 pod 中创建一个新的 VMI。
迁移尝试和超时

更新工作负载时,如果 pod 在以下时间段内处于 Pending 状态,实时迁移会失败:

5 分钟
如果 pod 因为是 Unschedulable 而处于 pending 状态。
15 分钟
如果 pod 因任何原因处于 pending 状态。

当 VMI 无法迁移时,virt-controller 会尝试再次迁移它。它会重复这个过程,直到所有可可迁移的 VMI 在新的 virt-launcher Pod 上运行。如果 VMI 没有被正确配置,这些尝试可能会无限期重复。

注意

每次尝试都会对应于一个迁移对象。只有最近五个尝试才在缓冲区中。这可防止迁移对象在系统上进行积累,同时保留用于调试的信息。

5.2.2. 配置工作负载更新方法

您可以通过编辑 HyperConverged 自定义资源(CR)来配置工作负载更新方法。

先决条件

  • 要使用实时迁移作为更新方法,您必须首先在集群中启用实时迁移。

    注意

    如果 VirtualMachineInstance CR 包含 evictionStrategy: LiveMigrate,且虚拟机实例(VMI)不支持实时迁移,则 VMI 将不会更新。

流程

  1. 要在默认编辑器中打开 HyperConverged CR,请运行以下命令:

    $ oc edit hco -n openshift-cnv kubevirt-hyperconverged
  2. 编辑 HyperConverged CR 的 workloadUpdateStrategy 小节。例如:

    apiVersion: hco.kubevirt.io/v1beta1
    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
    spec:
      workloadUpdateStrategy:
        workloadUpdateMethods: 1
        - LiveMigrate 2
        - Evict 3
        batchEvictionSize: 10 4
        batchEvictionInterval: "1m0s" 5
    ...
    1
    可用于执行自动化工作负载更新的方法。可用值为 LiveMigrateEvict。如果您如本例所示启用这两个选项,则更新会为不支持实时迁移的 VMI 使用 LiveMigrate,对于不支持实时迁移的 VMI 使用 Evict。要禁用自动工作负载更新,您可以删除 workloadUpdateStrategy 小节,或设置 workloadUpdateMethods: [] 将数组留空。
    2
    具有最低破坏性的更新方法。支持实时迁移的 VMI 通过将虚拟机 (VM) 客户机迁移到启用了更新组件的新 pod 中来更新。如果 LiveMigrate 是唯一列出的工作负载更新方法,不支持实时迁移的 VMI 不会中断或更新。
    3
    在升级过程中关闭 VMI pod 是一个有破坏性的方法。如果在集群中没有启用实时迁移,Evict 是唯一可用的更新方法。如果 VMI 由已配置了 runStrategy: alwaysVirtualMachine 对象控制,新的 VMI 会在带有更新组件的新 pod 中创建。
    4
    使用 Evict 方法每次可以强制更新的 VMI 数量。这不适用于 LiveMigrate 方法。
    5
    驱除下一批工作负载前等待的时间间隔。这不适用于 LiveMigrate 方法。
    注意

    您可以通过编辑 HyperConverged CR 的 spec.liveMigrationConfig 小节来配置实时迁移限制和超时。

  3. 若要应用您的更改,请保存并退出编辑器。

5.3. 批准待处理的 Operator 更新

5.3.1. 手动批准待处理的 Operator 更新

如果已安装的 Operator 的订阅被设置为 Manual,则当其当前更新频道中发布新更新时,在开始安装前必须手动批准更新。

先决条件

  • 之前使用 Operator Lifecycle Manager(OLM)安装的 Operator。

流程

  1. 在 OpenShift Container Platform Web 控制台的 Administrator 视角中,进入 Operators → Installed Operators
  2. 处于待定更新的 Operator 会显示 Upgrade available 状态。点您要更新的 Operator 的名称。
  3. Subscription 标签页。任何需要批准的更新都会在 Upgrade Status 旁边显示。例如:它可能会显示 1 requires approval
  4. 1 requires approval,然后点 Preview Install Plan
  5. 检查列出可用于更新的资源。在满意后,点 Approve
  6. 返回到 Operators → Installed Operators 页面,以监控更新的进度。完成后,状态会变为 SucceededUp to date

5.4. 监控更新状态

5.4.1. 监控 OpenShift Virtualization 升级状态

要监控 OpenShift Virtualization Operator 升级的状态,请观察集群服务版本 (CSV) PHASE。此外您还可在 web 控制台中,或运行此处提供的命令来监控 CSV 状况。

注意

PHASE 和状况值均是基于可用信息的近似值。

先决条件

  • 以具有 cluster-admin 角色的用户身份登录集群。
  • 安装 OpenShift CLI(oc)。

流程

  1. 运行以下命令:

    $ oc get csv -n openshift-cnv
  2. 查看输出,检查 PHASE 字段。例如:

    输出示例

    VERSION  REPLACES                                        PHASE
    4.9.0    kubevirt-hyperconverged-operator.v4.8.2         Installing
    4.9.0    kubevirt-hyperconverged-operator.v4.9.0         Replacing

  3. 可选:运行以下命令来监控所有 OpenShift Virtualization 组件状况的聚合状态:

    $ oc get hco -n openshift-cnv kubevirt-hyperconverged \
    -o=jsonpath='{range .status.conditions[*]}{.type}{"\t"}{.status}{"\t"}{.message}{"\n"}{end}'

    成功升级后会输出以下内容:

    输出示例

    ReconcileComplete  True  Reconcile completed successfully
    Available          True  Reconcile completed successfully
    Progressing        False Reconcile completed successfully
    Degraded           False Reconcile completed successfully
    Upgradeable        True  Reconcile completed successfully

5.4.2. 查看过时的 OpenShift Virtualization 工作负载

您可以使用 CLI 查看过时的工作负载列表。

注意

如果集群中存在过时的虚拟化 pod,OutdatedVirtualMachineInstanceWorkloads 警报会触发。

流程

  • 要查看过时的虚拟机实例 (VMI) 列表,请运行以下命令:

    $ oc get vmi -l kubevirt.io/outdatedLauncherImage --all-namespaces
注意

配置工作负载更新以确保 VMI 自动更新。

5.5. 其他资源

第 6 章 为 kubevirt-controller 和 virt-launcher 授予额外的安全权限

kubevirt-controller 和 virt-launcher pod 会被授予一些 SELinux 策略和安全上下文约束(除了典型的 pod 拥有者之外)的权限。这些权限可让虚拟机使用 OpenShift Virtualization 功能。

6.1. 为 virt-launcher pod 扩展 SELinux 策略

virt-launcher Pod 的 container_t SELinux 策略被扩展来启用 OpenShift Virtualization 的基本功能。

  • 网络多队列需要以下策略,它可在可用 vCPU 数量增加时扩展网络性能:

    • allow process self (tun_socket (relabelfrom relabelto attach_queue))
  • 以下策略允许 virt-launcher 读取 /proc 目录中的文件,包括 /proc/cpuinfo/proc/uptime

    • allow process proc_type (file (getattr open read))
  • 以下策略允许 libvirtd 转发与网络相关的调试信息。

    • allow process self (netlink_audit_socket (nlmsg_relay))

      注意

      如果没有此策略,则阻止任何转发网络调试信息。这可能会通过 SELinux 拒绝填充节点的审计日志。

  • 以下策略允许 libvirtd 访问 hugetblfs,这是支持巨页所必需的:

    • allow process hugetlbfs_t (dir (add_name create write remove_name rmdir setattr))
    • allow process hugetlbfs_t (file (create unlink))
  • 以下策略允许 virtiofs 挂载文件系统并访问 NFS:

    • allow process nfs_t (dir (mounton))
    • allow process proc_t (dir (mounton))
    • allow process proc_t (filesystem (mount unmount))

6.2. kubevirt-controller 服务帐户的其他 OpenShift Container Platform 安全性上下文约束和 Linux 功能

Pod 的安全上下文约束(SCC)控制权限。这些权限包括 Pod(容器集合)可以执行的操作以及它们可以访问的资源。您可以使用 SCC 定义 Pod 运行必须满足的一组条件,以便其能被系统接受。

kubevirt-controller 是一个集群控制器,可为集群中的虚拟机创建 virt-launcher Pod。这些 virt-launcher pod 由 kubevirt-controller 服务账户授予权限。

6.2.1. kubevirt-controller 服务账户会获得额外的 SCC

kubevirt-controller 服务帐户被授予额外的 SCC 和 Linux 功能,以便能够创建具有适当权限的 virt-launcher Pod。这些扩展权限允许虚拟机利用超出典型 Pod 范围的 OpenShift Virtualization 功能。

kubevirt-controller 服务帐户被授予以下 SCC:

  • scc.AllowHostDirVolumePlugin = true
    这允许虚拟机使用 hostpath 卷插件。
  • scc.AllowPrivilegedContainer = false
    可确保 virt-launcher pod 不是作为特权容器运行。
  • scc.AllowedCapabilities = []corev1.Capability{"NET_ADMIN", "NET_RAW", "SYS_NICE"}
    这可提供以下额外的 Linux 功能 NET_ADMINNET_RAWSYS_NICE

6.2.2. 查看 kubevirt-controller 的 SCC 和 RBAC 定义

您可以使用 oc 工具查看 kubevirt-controllerSecurityContextConstraints 定义:

$ oc get scc kubevirt-controller -o yaml

您可以使用 oc 工具查看 kubevirt-controller clusterrole 的 RBAC 定义:

$ oc get clusterrole kubevirt-controller -o yaml

6.3. 其他资源

第 7 章 使用 CLI 工具

用于管理集群中资源的两个主要 CLI 工具是:

  • OpenShift Virtualization virtctl 客户端
  • OpenShift Container Platform oc 客户端

7.1. 先决条件

7.2. OpenShift Container Platform 客户端命令

OpenShift Container Platform oc 客户端是一个用于管理 OpenShift Container Platform 资源的命令行实用程序,包括 VirtualMachinevm)和 VirtualMachineInstancevmi)对象类型。

注意

您可以使用 -n <namespace> 指定一个不同的项目。

表 7.1. oc 命令
命令描述

oc login -u <user_name>

<user_name> 身份登录 OpenShift Container Platform 集群。

oc get <object_type>

显示当前项目中指定对象类型的对象列表。

oc describe <object_type> <resource_name>

显示当前项目中指定资源的详情。

oc create -f <object_config>

从文件名称或 stdin 在当前项目中创建资源。

oc edit <object_type> <resource_name>

编辑当前项目中的资源。

oc delete <object_type> <resource_name>

删除当前项目中的资源。

有关 oc 客户端命令的更全面信息,请参阅 OpenShift Container Platform CLI 工具文档。

7.3. Virtctl 客户端命令

virtctl 客户端是用于管理 OpenShift Virtualization 资源的命令行实用程序。

要查看 virtctl 命令列表,请运行以下命令:

$ virtctl help

要查看与特定命令一起使用的选项列表,请使用 -h--help 标记运行该选项。例如:

$ virtctl image-upload -h

要查看您可以与任何 virtctl 命令一起使用的全局命令选项列表,请运行以下命令:

$ virtctl options

下表包含整个 OpenShift Virtualization 文档中使用的 virtctl 命令。

表 7.2. virtctl 客户端命令
命令描述

virtctl start <vm_name>

启动虚拟机。

virtctl start --paused <vm_name>

以暂停状态启动虚拟机。这个选项可让您从 VNC 控制台中断引导过程。

virtctl stop <vm_name>

停止虚拟机。

virtctl stop <vm_name> --grace-period 0 --force

强制停止虚拟机。这个选项可能会导致数据不一致或数据丢失。

virtctl pause vm|vmi <object_name>

暂停虚拟机或虚拟机实例。机器状态保存在内存中。

virtctl unpause vm|vmi <object_name>

取消暂停虚拟机或虚拟机实例。

virtctl migrate <vm_name>

迁移虚拟机。

virtctl restart <vm_name>

重启虚拟机。

virtctl expose <vm_name>

创建转发虚拟机或虚拟机实例的指定端口的服务,并在节点的指定端口上公开该服务。

virtctl console <vmi_name>

连接至虚拟机实例的串行控制台。

virtctl vnc --kubeconfig=$KUBECONFIG <vmi_name>

打开与虚拟机实例的 VNC(虚拟网络客户端)连接。通过 VNC 访问虚拟机实例的图形控制台,该 VNC 需要本地计算机上的远程查看器。

virtctl vnc --kubeconfig=$KUBECONFIG --proxy-only=true <vmi-name>

显示端口号,并使用任何查看器通过 VNC 连接手动连接到虚拟机实例。

virtctl vnc --kubeconfig=$KUBECONFIG --port=<port-number> <vmi-name>

如果该端口可用,则指定端口号用于在指定端口上运行代理。如果没有指定端口号,代理会在随机端口上运行。

virtctl image-upload dv <datavolume_name> --image-path=</path/to/image> --no-create

将虚拟机镜像上传到已存在的数据卷中。

virtctl image-upload dv <datavolume_name> --size=<datavolume_size> --image-path=</path/to/image>

将虚拟机镜像上传到新数据卷。

virtctl version

显示客户端和服务器版本。

virtctl fslist <vmi_name>

返回客户端机器中可用文件系统的完整列表。

virtctl guestosinfo <vmi_name>

返回有关操作系统的客户机代理信息。

virtctl userlist <vmi_name>

返回客户端机器中登录用户的完整列表。

7.4. 使用 virtctl guestfs 创建容器

您可以使用 virtctl guestfs 命令部署带有 libguestfs-tools 以及附加到它的持久性卷声明 (PVC) 的交互式容器。

流程

  • 要部署一个带有 libguestfs-tools 的容器,挂载 PVC 并为其附加一个 shell,运行以下命令:

    $ virtctl guestfs -n <namespace> <pvc_name> 1
    1
    PVC 名称是必需的参数。如果没有包括它,则会出现错误消息。

7.5. libguestfs 工具和 virtctl guestfs

libguestfs 工具可帮助您访问和修改虚拟机 (VM) 磁盘镜像。您可以使用 libguestfs 工具查看和编辑客户机中的文件、克隆和构建虚拟机,以及格式化和调整磁盘大小。

您还可以使用 virtctl guestfs 命令及其子命令在 PVC 上修改、检查和调试虚拟机磁盘。要查看可能子命令的完整列表,请在命令行中输入 virt- 并按 Tab 键。例如:

命令描述

virt-edit -a /dev/vda /etc/motd

在终端中以交互方式编辑文件。

virt-customize -a /dev/vda --ssh-inject root:string:<public key example>

将 ssh 密钥注入客户系统并创建登录。

virt-df -a /dev/vda -h

查看虚拟机使用了多少磁盘空间。

virt-customize -a /dev/vda --run-command 'rpm -qa > /rpm-list'

通过创建包含完整列表的输出文件,查看虚拟客户机上安装的所有 RPM 的完整列表。

virt-cat -a /dev/vda /rpm-list

在终端中使用 virt-customize -a /dev/vda --run-command 'rpm -qa > /rpm-list' 命令显示创建的所有 RPM 的输出文件列表。

virt-sysprep -a /dev/vda

封装要用作模板的虚拟机磁盘镜像。

默认情况下,virtctl guestfs 会创建一个会话,其中包含管理 VM 磁盘所需的一切内容。但是,如果想要自定义行为,该命令还支持几个标志选项:

标记选项描述

--h--help

guestfs 提供帮助.

带有 <pvc_name> 参数的 -n <namespace> 选项

使用特定命名空间中的 PVC。

如果不使用 -n <namespace> 选项,则使用您的当前项目。要更改项目,请使用 oc project <namespace>

如果没有包括 <pvc_name> 参数,则会出现错误消息。

--image string

列出 libguestfs-tools 容器镜像。

您可以使用 --image 选项,将容器配置为使用自定义镜像。

--kvm

代表 libguestfs-tools 容器使用 kvm

默认情况下,virtctl guestfs 为交互式容器设置 kvm,这可显著加快 libguest-tools 执行,因为它使用了 QEMU。

如果群集没有任何 kvm 支持节点,您必须通过设置 --kvm=false 选项来禁用 kvm

如果没有设置,libguestfs-tools pod 将保持待处理状态,因为它无法调度到任何节点上。

--pull-policy string

显示 libguestfs 镜像的拉取策略。

您还可以通过设置 pull-policy 选项来覆盖镜像的 pull 策略。

这个命令还会检查 PVC 是否被另一个 pod 使用,这时会出现错误消息。但是,libguestfs-tools 进程启动后,设置无法避免使用相同的 PVC 的新 pod。在启动虚拟机访问同一 PVC 前,您必须先验证没有活跃的 virtctl guestfs pod。

注意

virtctl guestfs 命令只接受附加到交互式 pod 的单个 PVC。

7.6. 其他资源

第 8 章 虚拟机

8.1. 创建虚拟机

使用以下其中一个流程来创建虚拟机:

  • 快速入门指南
  • 运行向导
  • 使用虚拟机向导来粘贴预先配置的 YAML 文件
  • 使用 CLI
警告

不要在 openshift-* 命名空间中创建虚拟机 。相反,创建一个新命名空间或使用没有 openshift 前缀的现有命名空间。

从 web 控制台创建虚拟机时,请选择配置了引导源的虚拟机模板。具有引导源的虚拟机模板标记为 Available boot source,或者它们显示自定义标签文本。使用有可用引导源的模板可促进创建虚拟机的过程。

没有引导源的模板被标记为 Boot source required。如果完成了向虚拟机中添加引导源的步骤,您可以使用这些模板。

重要

由于存储行为的区别,一些虚拟机模板与单节点 OpenShift 不兼容。为确保兼容性,请不要为使用数据卷或存储配置集的任何模板或虚拟机设置 evictionStrategy 字段。

8.1.1. 使用快速入门创建虚拟机

web 控制台为创建虚拟机提供指导指导快速入门。您可以通过在 Administrator 视角中选择 Help 菜单来查看 Quick Starts 目录来访问 Quick Starts 目录。当您点快速入门标题并开始使用时,系统会帮助您完成这个过程。

快速入门中的任务以选择红帽模板开始。然后,您可以添加一个引导源并导入操作系统镜像。最后,您可以保存自定义模板,并使用它来创建虚拟机。

先决条件

  • 访问您可以下载操作系统镜像的 URL 链接的网站。

流程

  1. 在 web 控制台中,从 Help 菜单中选择 Quick Starts
  2. 点 Quick Starts 目录里的一个标题。例如:Creating a Red Hat Linux Enterprise Linux virtual machine
  3. 按照教程中的说明,完成导入操作系统镜像并创建虚拟机的任务。VirtualizationVirtualMachines 页面显示虚拟机。

8.1.2. 运行虚拟机向导来创建虚拟机

web 控制台带有一个向导,指导您完成选择虚拟机模板和创建虚拟机的过程。红帽虚拟机模板会预先配置操作系统镜像、操作系统的默认设置、flavor(CPU 和内存)以及工作负载类型(server)。当模板配置为使用引导源配置时,会使用自定义标签文本或者默认标签文本 Available boot source 进行标记。这些模板可用于创建虚拟机。

您可以从预配置的模板列表中选择模板,查看设置并使用Create virtual machine from template 创建一个虚拟机。如果您选择自定义虚拟机,向导会帮助您完成 GeneralNetworkingStorageAdvancedReview 步骤。向导显示的所有必填字段均标有 *。

创建网络接口控制器 (NIC) 和存储磁盘,并将它们附加到虚拟机。

流程

  1. 从侧边菜单中点 WorkloadsVirtualization
  2. Virtual Machines 选项卡或 Templates 选项卡中点 Create 并选择 Virtual Machine with Wizard
  3. 选择一个使用引导源配置的模板。
  4. Next 进入 Review and create 步骤。
  5. 如果您不想现在就启动虚拟机,清除 Start this virtual machine after creation 选择。
  6. Create virtual machine 并退出向导或继续向导以自定义虚拟机。
  7. Customize virtual machine 进入 General 步骤。

    1. 可选:编辑 Name 字段,为虚拟机指定自定义名称。
    2. 可选:在 Description 字段中添加描述信息。
  8. Next 进入 Networking 步骤。默认附加 nic0 NIC。

    1. 可选:点 Add Network Interface 来创建额外 NIC。
    2. Optional:您可以通过点 Options 菜单 kebab 并选择 Delete 来删除任何或所有 NIC。虚拟机无需附加 NIC 也可创建。您可以在创建虚拟机后创建 NIC。
  9. Next 进入 Storage 步骤。

    1. 可选:点击 Add Disk 创建额外磁盘。可通过点 Options 菜单 kebab 并选择 Delete 来删除这些磁盘。
    2. 可选:点击 Options 菜单 kebab 来编辑磁盘并保存您的更改。
  10. Next 进入 Advanced 步骤并选择以下选项之一:

    1. 如果您选择了 Linux 模板来创建虚拟机,请查看 Cloud-init 的详情并配置 SSH 访问。

      注意

      使用 cloud-init 或向导中的自定义脚本,静态注入 SSH 密钥。这使您可以安全、远程管理虚拟机以及管理和传输信息。强烈建议您使用这个步骤来保护您的虚拟机。 

    2. 如果您选择了 Windows 模板来创建虚拟机,请使用 SysPrep 部分以 XML 格式上传应答文件,以进行自动 Windows 设置。
  11. Next 进入 Review 步骤并查看虚拟机的设置。
  12. Create Virtual Machine
  13. See virtual machine details 查看此虚拟机的 Overview

    虚拟机在 Virtual Machines 标签页中列出。

运行 web 控制台向导时,请参考虚拟机向导字段部分。

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

名称

 

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

描述

 

可选的描述字段。

操作系统

 

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

引导源

URL(创建 PVC)

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

Clone(创建 PVC)

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

Registry(创建 PVC)

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

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

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

持久性卷声明项目

 

用于克隆 PVC 的项目名称。

持久性卷声明名称

 

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

将它作为光盘引导源挂载

 

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

Flavor

tiny、small、Medium、Large、Custom

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

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

工作负载类型

注意

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

桌面

用于桌面的虚拟机配置。适用于小型工作环境。建议与 Web 控制台搭配使用。使用此模板类或 Server 模板类,设置虚拟机的密度比 guaranteed 的虚拟机性能有更高的优先级。

Server

在性能和广泛的服务器工作负载兼容性方面具有最佳平衡。使用此模板类或 Desktop 模板类,设置虚拟机的密度比 guaranteed 的虚拟机性能有更高的优先级。

高性能(需要 CPU Manager)

针对高性能负载进行了优化的虚拟机配置。使用此模板类,设置 guaranteed 比虚拟机密度有更高的优先级。

创建后启动此虚拟机。

 

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

启用 CPU Manager 使用高性能工作负载配置集。

8.1.2.1.1. 网络字段
名称描述

Name

网络接口控制器的名称。

model

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

网络

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

类型

可用绑定方法列表。选择适合网络接口的绑定方法:

  • 默认 pod 网络:masquerade
  • Linux 网桥网络:bridge
  • SR-IOV 网络: SR-IOV

MAC 地址

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

8.1.2.2. 存储字段
名称选择描述

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

 

用于创建磁盘的存储类。

高级存储设置

以下高级存储设置是可选的,对 Blank, Import via URL, and Clone existing PVC 磁盘可用。在 OpenShift Virtualization 4.11 之前,如果您没有指定这些参数,系统将使用 kubevirt-storage-class-defaults 配置映射中的默认值。在 OpenShift Virtualization 4.11 及更高版本中,系统使用存储配置集中的默认值。

注意

使用存储配置集来确保在为 OpenShift Virtualization 置备存储时一致的高级存储设置。

要手动指定 卷模式访问模式,您必须清除 Apply optimized StorageProfile settings 复选框,该复选框被默认选择。

Name模式描述参数参数描述

卷模式

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

Filesystem

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

Block

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

访问模式

持久性卷访问模式。

ReadWriteOnce (RWO)

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

ReadWriteMany (RWX)

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

注意

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

ReadOnlyMany (ROX)

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

8.1.2.3. Cloud-init 字段
名称描述

Hostname

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

授权 SSH 密钥

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

自定义脚本

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

要配置存储类默认设置,请使用存储配置集。如需更多信息,请参阅自定义存储配置集

8.1.2.4. 粘贴至预先配置的 YAML 文件中以创建虚拟机

通过写入或粘贴 YAML 配置文件来创建虚拟机。每当您打开 YAML 编辑屏幕,默认会提供一个有效的 example 虚拟机配置。

如果您点击 Create 时 YAML 配置无效,则错误消息会指示出错的参数。一次仅显示一个错误。

注意

编辑时离开 YAML 屏幕会取消您对配置做出的任何更改。

流程

  1. 在侧边菜单中点 VirtualizationVirtualMachines
  2. Create 并选择 With YAML
  3. 在可编辑窗口写入或粘贴您的虚拟机配置。

    1. 或者,使用 YAML 屏幕中默认提供的 example 虚拟机。
  4. 可选:点 Download 以下载当前状态下的 YAML 配置文件。
  5. 点击 Create 以创建虚拟机。

虚拟机在 VirtualMachines 页面中列出。

8.1.3. 使用 CLI 创建虚拟机

您可以从 virtualMachine 清单创建虚拟机。

流程

  1. 编辑虚拟机的 VirtualMachine 清单。例如,以下清单配置 Red Hat Enterprise Linux(RHEL)虚拟机:

    例 8.1. RHEL 虚拟机的清单示例

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      labels:
        app: <vm_name> 1
      name: <vm_name>
    spec:
      dataVolumeTemplates:
      - apiVersion: cdi.kubevirt.io/v1beta1
        kind: DataVolume
        metadata:
          name: <vm_name>
        spec:
          sourceRef:
            kind: DataSource
            name: rhel9
            namespace: openshift-virtualization-os-images
          storage:
            resources:
              requests:
                storage: 30Gi
      running: false
      template:
        metadata:
          labels:
            kubevirt.io/domain: <vm_name>
        spec:
          domain:
            cpu:
              cores: 1
              sockets: 2
              threads: 1
            devices:
              disks:
              - disk:
                  bus: virtio
                name: rootdisk
              - disk:
                  bus: virtio
                name: cloudinitdisk
              interfaces:
              - masquerade: {}
                name: default
              rng: {}
            features:
              smm:
                enabled: true
            firmware:
              bootloader:
                efi: {}
            resources:
              requests:
                memory: 8Gi
          evictionStrategy: LiveMigrate
          networks:
          - name: default
            pod: {}
          volumes:
          - dataVolume:
              name: <vm_name>
            name: rootdisk
          - cloudInitNoCloud:
              userData: |-
                #cloud-config
                user: cloud-user
                password: '<password>' 2
                chpasswd: { expire: False }
            name: cloudinitdisk
    1
    指定虚拟机的名称。
    2
    指定 cloud-user 的密码。
  2. 使用清单文件创建虚拟机:

    $ oc create -f <vm_manifest_file>.yaml
  3. 可选:启动虚拟机:

    $ virtctl start <vm_name>

8.1.4. 虚拟机存储卷类型

存储卷类型描述

ephemeral

将网络卷用作只读后备存储的本地写时复制 (COW) 镜像。后备卷必须为 PersistentVolumeClaim。当虚拟机启动并在本地存储所有写入数据时,便会创建临时镜像。当虚拟机停止、重启或删除时,便会丢弃临时镜像。其底层的卷 (PVC) 不会以任何方式发生变化。

persistentVolumeClaim

将可用 PV 附加到虚拟机。附加 PV 可确保虚拟机数据在会话之间保持。

将现有虚拟机导入到 OpenShift Container Platform 中的建议方法是,使用 CDI 将现有虚拟机磁盘导入到 PVC 中,然后将 PVC 附加到虚拟机实例。在 PVC 中使用磁盘需要满足一些要求。

dataVolume

通过导入、克隆或上传操作来管理虚拟机磁盘的准备过程,以此在 persistentVolumeClaim 磁盘类型基础上构建数据卷。使用此卷类型的虚拟机可保证在卷就绪前不会启动。

指定 type: dataVolumetype: ""。如果您为 type 指定任何其他值,如 persistentVolumeClaim,则会显示警告信息,虚拟机也不会启动。

cloudInitNoCloud

附加包含所引用的 cloud-init NoCloud 数据源的磁盘,从而向虚拟机提供用户数据和元数据。虚拟机磁盘内部需要安装 cloud-init。

containerDisk

引用容器镜像 registry 中存储的镜像,如虚拟机磁盘。镜像从 registry 中拉取,并在虚拟机启动时作为磁盘附加到虚拟机。

containerDisk 卷不仅限于一个虚拟机,对于要创建大量无需持久性存储的虚拟机克隆来说也非常有用。

容器镜像 registry 仅支持 RAW 和 QCOW2 格式的磁盘类型。建议使用 QCOW2 格式以减小镜像的大小。

注意

containerDisk 卷是临时的。将在虚拟机停止、重启或删除时丢弃。containerDisk 卷对于只读文件系统(如 CD-ROM)或可处理的虚拟机很有用。

emptyDisk

创建额外的稀疏 QCOW2 磁盘,与虚拟机接口的生命周期相关联。当虚拟机中的客户端初始化重启后,数据保留下来,但当虚拟机停止或从 web 控制台重启时,数据将被丢弃。空磁盘用于存储应用程序依赖项和数据,否则这些依赖项和数据会超出临时磁盘有限的临时文件系统。

此外还必须提供磁盘容量大小。

8.1.5. 关于虚拟机的 RunStrategies

虚拟机的 RunStrategy 会根据一系列条件,决定虚拟机实例(VMI)的行为。spec.runStrategy 设置存在于虚拟机配置过程中,作为 spec.running 设置的替代方案。spec.runStrategy 设置为创建和管理 VMI 提供了更大的灵活性。而 spec.running 设置只能有 truefalse 响应。但是,这两种设置是相互排斥的。只能同时使用 spec.runningspec.runStrategy 之一。如果两者都存在,则会出现错误。

有四个定义的 RunStrategies。

Always
在创建虚拟机时,始终会存在 VMI。如果因为任何原因造成原始的 VMI 停止运行,则会创建一个新的 VMI,这与 spec.running: true 的行为相同。
RerunOnFailure
如果上一个实例因为错误而失败,则会重新创建一个 VMI。如果虚拟机成功停止(例如虚拟机正常关机),则不会重新创建实例。
Manual
startstoprestart virtctl 客户端命令可以被用来控制 VMI 的状态。
Halted
创建虚拟机时没有 VMI,这与 spec.running: false 的行为相同。

startstoprestart virtctl 命令的不同组合会影响到使用哪个 RunStrategy

下表是虚拟机从不同状态过渡的列表。第一栏显示了 VM 的初始 RunStrategy。每个额外的栏都显示一个 virtctl 命令以及在运行该命令后的新的 RunStrategy

初始 RunStrategy开始停止重启

Always

-

Halted

Always

RerunOnFailure

-

Halted

RerunOnFailure

Manual

Manual

Manual

Manual

Halted

Always

-

-

注意

在使用安装程序置备的基础架构安装的 OpenShift Virtualization 集群中,当节点的 MachineHealthCheck 失败且集群不可用时,,带有 AlwaysRerunOnFailure 的 RunStrategy 的虚拟机会被重新调度到一个新的节点上。

apiVersion: kubevirt.io/v1
kind: VirtualMachine
spec:
  RunStrategy: Always 1
  template:
...
1
VMI 的当前 RunStrategy 设置。

8.1.6. 其他资源

8.2. 编辑虚拟机

您可以使用 web 控制台中的 YAML 编辑器或命令行上的 OpenShift CLI 来更新虚拟机配置。您还可以更新 Virtual Machine Details 屏幕中的参数子集。

8.2.1. 在 web 控制台中编辑虚拟机

点相关字段旁的铅笔图标来编辑 web 控制台中虚拟机的选择值。可使用 CLI 编辑其他值。

对于预先配置的红帽模板和自定义虚拟机模板,可编辑标签和注解。所有其他值只适用于用户使用红帽模板或 Create Virtual Machine Template 向导创建 的自定义虚拟机模板。

流程

  1. 在侧边菜单中点 VirtualizationVirtualMachines
  2. 可选:使用 Filter 下拉菜单根据状态、模板、节点或操作系统(OS)等属性对虚拟机列表进行排序。
  3. 选择虚拟机以打开 VirtualMachine 详情页面。
  4. 点击铅笔图标使该字段可编辑。
  5. 进行相关的更改并点击 Save
注意

如果虚拟机正在运行,对 Boot OrderFlavor 的更改在重启虚拟机后才会生效。

您可以点击相关字段右侧的 View Pending Changes 来查看待处理的更改。页面顶部的 Pending Changes 标题显示虚拟机重启时将应用的所有更改列表。

8.2.1.1. 虚拟机字段

下表列出了您可以在 OpenShift Container Platform web 控制台中编辑的虚拟机字段:

表 8.1. 虚拟机字段
标签页字段或功能

详情

  • 标签
  • 注解
  • 描述
  • CPU/内存
  • 引导模式
  • 引导顺序
  • GPU 设备
  • 主机设备
  • SSH 访问

YAML

  • 查看、编辑或下载自定义资源。

调度

  • 节点选择器
  • 容限(Tolerations)
  • 关联性规则
  • 专用资源
  • 驱除策略
  • Descheduler 设置

网络接口

  • 添加、编辑或删除网络接口。

磁盘

  • 添加、编辑或删除磁盘。

脚本

  • cloud-init 设置

快照

  • 添加、恢复或删除虚拟机快照。

8.2.2. 使用 web 控制台编辑虚拟机 YAML 配置

您可以在 web 控制台中编辑虚拟机的 YAML 配置。某些参数无法修改。如果在有无效配置时点 Save,则会出现一个错误消息指示无法更改的参数。

注意

编辑时离开 YAML 屏幕会取消您对配置做出的任何更改。

流程

  1. 在侧边菜单中点 VirtualizationVirtualMachines
  2. 选择虚拟机。
  3. 点击 YAML 选项卡以显示可编辑的配置。
  4. (可选):您可点击 Download,在本地下载当前状态的 YAML 文件。
  5. 编辑该文件并点击 Save

确认消息显示修改已成功,其中包含对象的更新版本号。

8.2.3. 使用 CLI 编辑虚拟机 YAML 配置

使用这个步骤,通过 CLI 编辑虚拟机 YAML 配置。

先决条件

  • 已使用 YAML 对象配置文件配置了虚拟机。
  • 已安装 oc CLI。

流程

  1. 运行以下命令以更新虚拟机配置:

    $ oc edit <object_type> <object_ID>
  2. 打开对象配置。
  3. 编辑 YAML。
  4. 如果要编辑正在运行的虚拟机,您需要执行以下任一操作:

    • 重启虚拟机。
    • 运行以下命令使新配置生效:

      $ oc apply <object_type> <object_ID>

8.2.4. 将虚拟磁盘添加到虚拟机

使用这个流程在虚拟机中添加虚拟磁盘。

流程

  1. 在侧边菜单中点 VirtualizationVirtualMachines
  2. 选择虚拟机以打开 VirtualMachine Details 屏幕。
  3. Disks 选项卡,然后点 Add disk
  4. Add disk 窗口中,指定 SourceNameSizeTypeInterfaceStorage Class

    1. 可选:如果您使用空磁盘源并在创建数据卷时要求最大写入性能,则可以启用预分配。如果要这样做,可选中启用预分配复选框。
    2. 可选:您可以清除 Apply optimized StorageProfile 设置,以更改虚拟磁盘的卷模式访问模式。如果没有指定这些参数,系统将使用 kubevirt-storage-class-defaults 配置映射中的默认值。
  5. Add
注意

如果虚拟机正在运行,新磁盘处于 pending restart 状态,且不会在重启虚拟机前附加。

页面顶部的 Pending Changes 标题显示虚拟机重启时将应用的所有更改列表。

要配置存储类默认设置,请使用存储配置集。如需更多信息,请参阅自定义存储配置集

8.2.4.1. 为 VirtualMachines 编辑 CD-ROM

使用以下步骤为虚拟机编辑 CD-ROM。

流程

  1. 在侧边菜单中点 VirtualizationVirtualMachines
  2. 选择虚拟机以打开 VirtualMachine Details 屏幕。
  3. Disks 选项卡。
  4. 点您要编辑的 CD-ROM 的 Options 菜单 kebab ,然后选择 Edit
  5. Edit CD-ROM 窗口中,编辑字段: SourcePersistent Volume ClaimNameTypeInterface
  6. 点击 Save
8.2.4.2. 存储字段
名称选择描述

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

 

用于创建磁盘的存储类。

高级存储设置

以下高级存储设置是可选的,对 Blank, Import via URL, and Clone existing PVC 磁盘可用。在 OpenShift Virtualization 4.11 之前,如果您没有指定这些参数,系统将使用 kubevirt-storage-class-defaults 配置映射中的默认值。在 OpenShift Virtualization 4.11 及更高版本中,系统使用存储配置集中的默认值。

注意

使用存储配置集来确保在为 OpenShift Virtualization 置备存储时一致的高级存储设置。

要手动指定 卷模式访问模式,您必须清除 Apply optimized StorageProfile settings 复选框,该复选框被默认选择。

Name模式描述参数参数描述

卷模式

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

Filesystem

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

Block

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

访问模式

持久性卷访问模式。

ReadWriteOnce (RWO)

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

ReadWriteMany (RWX)

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

注意

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

ReadOnlyMany (ROX)

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

8.2.5. 将网络接口添加到虚拟机

将网络接口添加到虚拟机.

流程

  1. 在侧边菜单中点 VirtualizationVirtualMachines
  2. 选择虚拟机以打开 VirtualMachine Details 屏幕。
  3. 点击 Network Interfaces 选项卡。
  4. 点击 Add Network Interface
  5. Add Network Interface 窗口中,指定网络接口的 NameModelNetworkTypeMAC Address
  6. Add
注意

如果虚拟机正在运行,新的网络接口处于 pending restart 状态,且更改在重启虚拟机后才会生效。

页面顶部的 Pending Changes 标题显示虚拟机重启时将应用的所有更改列表。

8.2.5.1. 网络字段
名称描述

Name

网络接口控制器的名称。

model

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

网络

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

类型

可用绑定方法列表。选择适合网络接口的绑定方法:

  • 默认 pod 网络:masquerade
  • Linux 网桥网络:bridge
  • SR-IOV 网络: SR-IOV

MAC 地址

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

8.2.6. 其他资源

8.3. 编辑引导顺序

您可以使用 Web 控制台或 CLI 更新引导顺序列表的值。

通过 Virtual Machine Overview 页面中的 Boot Order ,您可以:

  • 选择磁盘或网络接口控制器 (NIC) 并将其添加到引导顺序列表中。
  • 编辑引导顺序列表中磁盘或 NIC 的顺序。
  • 从引导顺序列表中移除磁盘或者 NIC,然后将其返回到可引导源清单。

8.3.1. 向 web 控制台的引导顺序列表中添加项目

使用 web 控制台将项目添加到引导顺序列表中。

流程

  1. 在侧边菜单中点 VirtualizationVirtualMachines
  2. 选择虚拟机以打开 VirtualMachine 详情页面。
  3. Details 标签页。
  4. 点击位于 Boot Order 右侧的铅笔图标。如果 YAML 配置不存在,或者是首次创建引导顺序列表时,会显示以下消息: No resource selected.虚拟机会根据在 YAML 文件中的顺序从磁盘引导。
  5. Add Source,为虚拟机选择一个可引导磁盘或网络接口控制器 (NIC)。
  6. 在引导顺序列表中添加附加磁盘或者 NIC。
  7. Save
注意

如果虚拟机正在运行,在重启虚拟机后对 Boot Order 的更改不会生效。

您可以点 Boot Order 字段右侧的 View Pending Changes 查看待处理的修改。页面顶部的 Pending Changes 标题显示虚拟机重启时将应用的所有更改列表。

8.3.2. 在 web 控制台中编辑引导顺序列表

在 web 控制台中编辑引导顺序列表。

流程

  1. 在侧边菜单中点 VirtualizationVirtualMachines
  2. 选择虚拟机以打开 VirtualMachine 详情页面。
  3. Details 标签页。
  4. 点击位于 Boot Order 右侧的铅笔图标。
  5. 选择适当的方法来移动引导顺序列表中的项目:

    • 如果您没有使用屏幕阅读器,请在您想要移动的项目旁的箭头图标上切换,拖动或下移项目,然后将其放到您选择的位置。
    • 如果您使用屏幕阅读器,请按上箭头或者下箭头键移动引导顺序列表中的项目。然后,按 Tab 键将项目放到您选择的位置。
  6. Save
注意

如果虚拟机正在运行,对引导顺序列表的更改将在重启虚拟机后才会生效。

您可以点 Boot Order 字段右侧的 View Pending Changes 查看待处理的修改。页面顶部的 Pending Changes 标题显示虚拟机重启时将应用的所有更改列表。

8.3.3. 在 YAML 配置文件中编辑引导顺序列表

使用 CLI 编辑 YAML 配置文件中的引导顺序列表。

流程

  1. 运行以下命令为虚拟机打开 YAML 配置文件:

    $ oc edit vm example
  2. 编辑 YAML 文件并修改与磁盘或网络接口控制器 (NIC) 关联的引导顺序值。例如:

    disks:
      - bootOrder: 1 1
        disk:
          bus: virtio
        name: containerdisk
      - disk:
          bus: virtio
        name: cloudinitdisk
      - cdrom:
          bus: virtio
        name: cd-drive-1
    interfaces:
      - boot Order: 2 2
        macAddress: '02:96:c4:00:00'
        masquerade: {}
        name: default
    1
    为磁盘指定的引导顺序值。
    2
    为网络接口控制器指定的引导顺序值。
  3. 保存 YAML 文件。
  4. reload the content,使 YAML 文件中更新的引导顺序值应用到 web 控制台的引导顺序列表中。

8.3.4. 从 web 控制台中的引导顺序列表中删除项目

使用 Web 控制台从引导顺序列表中移除项目。

流程

  1. 在侧边菜单中点 VirtualizationVirtualMachines
  2. 选择虚拟机以打开 VirtualMachine 详情页面。
  3. Details 标签页。
  4. 点击位于 Boot Order 右侧的铅笔图标。
  5. 点击项 delete 旁边的 Remove 图标。该项目从引导顺序列表中删除,可用引导源列表的内容被保存。如果您从引导顺序列表中删除所有项目,则会显示以下消息: No resource selected.虚拟机会根据在 YAML 文件中的顺序从磁盘引导。
注意

如果虚拟机正在运行,在重启虚拟机后对 Boot Order 的更改不会生效。

您可以点 Boot Order 字段右侧的 View Pending Changes 查看待处理的修改。页面顶部的 Pending Changes 标题显示虚拟机重启时将应用的所有更改列表。

8.4. 删除虚拟机

您可从 web 控制台或使用 oc 命令行删除虚拟机。

8.4.1. 使用 web 控制台删除虚拟机

删除虚拟机会将其从集群中永久移除。

注意

当您删除虚拟机时,其使用的数据卷会被自动删除。

流程

  1. 在 OpenShift Container Platform 控制台中,从侧边菜单中点 VirtualizationVirtualMachines
  2. 点您要删除的虚拟机的 Options 菜单 kebab ,然后选择 Delete

    • 或者,击虚拟机名称,打开 VirtualMachine 详情页面并点击 ActionsDelete
  3. 在确认弹出窗口中,点击 Delete 永久删除虚拟机。

8.4.2. 使用 CLI 删除虚拟机

您可以使用 oc 命令行界面(CLI)删除虚拟机。您可以使用 oc 对多个虚拟机执行操作。

注意

当您删除虚拟机时,其使用的数据卷会被自动删除。

先决条件

  • 找到要删除的虚拟机名称。

流程

  • 运行以下命令以删除虚拟机:

    $ oc delete vm <vm_name>
    注意

    此命令只删除当前项目中存在的对象。如果您要删除其他项目或命名空间中的对象,请使用 -n <project_name> 选项。

8.5. 管理虚拟机实例

如果您在 OpenShift Virtualization 环境之外创建独立虚拟机实例(VMI),您可以使用 web 控制台或使用命令行界面(CLI)使用 ocvirtctl 命令管理它们。

virtctl 命令提供比 oc 命令更多的虚拟化选项。例如,您可以使用 virtctl 暂停虚拟机或公开端口。

8.5.1. 关于虚拟机实例

虚拟机实例(VMI)代表正在运行的虚拟机(VM)。当某个 VMI 属于某个虚拟机或者其他对象,您可通过 web 控制台中的拥有者或使用 oc 命令行界面(CLI)来管理它。

通过自动化或其他 CLI 的方法使用脚本创建并启动独立 VMI。在您的环境中,您可能会在 OpenShift Virtualization 环境之外开发并启动的独立 VMI。您可以使用 CLI 继续管理这些独立的 VMI。您还可以将 Web 控制台用于与独立 VMI 关联的特定任务:

  • 列出独立 VMI 及其详情。
  • 编辑独立 VMI 的标签和注解。
  • 删除独立 VMI。

当删除虚拟机时,相关的 VMI 会被自动删除。您直接删除一个独立的 VMI,因为它不归 VM 或其他对象所有。

注意

在卸载 OpenShift Virtualization 前,使用 CLI 或 Web 控制台列出并查看独立 VMI。然后,删除所有未完成的 VMI。

8.5.2. 使用 CLI 列出所有虚拟机实例

您可以使用 oc 命令行界面(CLI)列出集群中的所有虚拟机实例(VMI),包括独立 VMI 和虚拟机拥有的实例。

流程

  • 运行以下命令列出所有 VMI:

    $ oc get vmis -A

8.5.3. 使用 web 控制台列出独立虚拟机实例

使用 web 控制台,您可以列出并查看集群中不属于虚拟机(VM)的独立虚拟机实例(VMI)。

注意

受 VM 或其他对象拥有的 VMI 不会被显示在 web 控制台中。web 控制台仅显示独立 VMI。如果要列出集群中的所有 VMI,则必须使用 CLI。

流程

  • 在侧边菜单中点 VirtualizationVirtualMachines

    您可以在名称旁使用黑色徽标识别独立 VMI。

8.5.4. 使用 web 控制台编辑独立虚拟机实例

您可以使用 web 控制台编辑独立虚拟机实例(VMI)的注解和标签。其他字段不可编辑。

流程

  1. 在 OpenShift Container Platform 控制台中,从侧边菜单中点 VirtualizationVirtualMachines
  2. 选择独立 VMI 以打开 VirtualMachineInstance 详情页面。
  3. Details 标签页中,点 AnnotationsLabels 旁边的铅笔图标。
  4. 进行相关的更改并点击 Save

8.5.5. 使用 CLI 删除独立虚拟机实例

您可以使用 oc CLI 删除独立虚拟机实例。

先决条件

  • 找出要删除的 VMI 的名称。

流程

  • 运行以下命令来创建 VMI:

    $ oc delete vmi <vmi_name>

8.5.6. 使用 web 控制台删除独立虚拟机实例

从 web 控制台删除独立虚拟机实例(VMI)。

流程

  1. 在 OpenShift Container Platform web 控制台中,从侧边菜单中点 VirtualizationVirtualMachines
  2. ActionsDelete VirtualMachineInstance
  3. 在弹出的确认窗口中点击 Delete 永久删除独立的 VMI。

8.6. 控制虚拟机状态

您可从 web 控制台来停止、启动和重启虚拟机。

您可使用 virtctl 管理虚拟机状态并从 CLI 执行其他操作。例如,您可以使用 virtctl 来强制停止虚拟机或公开端口。

8.6.1. 启动虚拟机

您可从 web 控制台启动虚拟机。

流程

  1. 在侧边菜单中点 VirtualizationVirtualMachines
  2. 找到包含要启动的虚拟机的行。
  3. 导航到适合您的用例的菜单:

    • 要保留此页面(您可以在其中对多个虚拟机执行操作):

      1. 点击 kebab 位于行右边的 Options 菜单。
    • 在启动虚拟机前,要查看有关所选虚拟机的综合信息:

      1. 点虚拟机名称访问 VirtualMachine 详情页面。
      2. Actions
  4. 选择 Restart
  5. 在确认窗口中,点 Start 启动虚拟机。
注意

首次启动从 URL 源置备的虚拟机时,当 OpenShift Virtualization 从 URL 端点导入容器时,虚拟机将处于 Importing 状态。根据镜像大小,该过程可能需要几分钟时间。

8.6.2. 重启虚拟机

您可从 web 控制台重启正在运行的虚拟机。

重要

为了避免错误,不要重启状态为 Importing 的虚拟机。

流程

  1. 在侧边菜单中点 VirtualizationVirtualMachines
  2. 找到包含要启动的虚拟机的行。
  3. 导航到适合您的用例的菜单:

    • 要保留此页面(您可以在其中对多个虚拟机执行操作):

      1. 点击 kebab 位于行右边的 Options 菜单。
    • 要在重启前查看有关所选虚拟机的综合信息:

      1. 点虚拟机名称访问 VirtualMachine 详情页面。
      2. ActionsRestart
  4. 在确认窗口中,点击 Restart 重启虚拟机。

8.6.3. 停止虚拟机

您可从 web 控制台停止虚拟机。

流程

  1. 在侧边菜单中点 VirtualizationVirtualMachines
  2. 找到包含您要停止的虚拟机的行。
  3. 导航到适合您的用例的菜单:

    • 要保留此页面(您可以在其中对多个虚拟机执行操作):

      1. 点击 kebab 位于行右边的 Options 菜单。
    • 在停止之前,查看所选虚拟机的综合信息:

      1. 点虚拟机名称访问 VirtualMachine 详情页面。
      2. ActionsStop
  4. 在确认窗口中,点击 Stop 停止虚拟机。

8.6.4. 取消暂停虚拟机

您可从 web 控制台取消暂停一个正暂停的虚拟机。

先决条件

  • 至少一个虚拟机的状态是 Paused

    注意

    您可以使用 virtctl 客户端暂停虚拟机。

流程

  1. 在侧边菜单中点 VirtualizationVirtualMachines
  2. 找到包含您要取消暂停的虚拟机的行。
  3. 导航到适合您的用例的菜单:

    • 要保留此页面(您可以在其中对多个虚拟机执行操作):

      1. Status 栏中点 Paused
    • 要在取消暂停之前查看所选虚拟机的综合信息:

      1. 点虚拟机名称访问 VirtualMachine 详情页面。
      2. 点击位于 Status 右侧的铅笔图标。
  4. 在确认窗口中,点击 Unpause 来取消暂停虚拟机。

8.7. 访问虚拟机控制台

OpenShift Virtualization 提供不同的虚拟机控制台,您可使用这些控制台来完成不同的产品任务。您可以使用 CLI 命令通过 OpenShift Container Platform Web 控制台和访问这些控制台。

8.7.1. 在 OpenShift Container Platform web 控制台中访问虚拟机控制台

您可以使用 OpenShift Container Platform web 控制台中的串口控制台或 VNC 控制台连接至虚拟机。

您可以使用 OpenShift Container Platform Web 控制台中的 desktop viewer 控制台(使用 RDP(远程桌面协议)连接到 Windows 虚拟机。

8.7.1.1. 连接至串行控制台

从 web 控制台的 VirtualMachine 详情页中的 Console 选项卡连接至正在运行的虚拟机的串行控制台。

流程

  1. 在 OpenShift Container Platform 控制台中,从侧边菜单中点 VirtualizationVirtualMachines
  2. 选择虚拟机以打开 VirtualMachine 详情页面。
  3. 点击 Console 选项卡。默认会打开 VNC 控制台。
  4. Disconnect 以确保一次只打开一个控制台会话。否则,VNC 控制台会话会在后台保持活跃。
  5. 点击 VNC Console 下拉菜单并选择 Serial Console
  6. Disconnect 结束控制台会话。
  7. 可选:点 Open Console in New Window 在一个单独的窗口中打开串口控制台。
8.7.1.2. 连接至 VNC 控制台

从 web 控制台的 VirtualMachine 详情页中的 Console 选项卡连接至正在运行的虚拟机的 VNC 控制台。

流程

  1. 在 OpenShift Container Platform 控制台中,从侧边菜单中点 VirtualizationVirtualMachines
  2. 选择虚拟机以打开 VirtualMachine 详情页面。
  3. 点击 Console 选项卡。默认会打开 VNC 控制台。
  4. 可选:点 Open Console in New Window 在一个单独的窗口中打开 VNC 控制台。
  5. 可选:点 Send Key 将密钥组合发送到虚拟机。
  6. 点控制台窗口外,然后点 Disconnect 结束会话。
8.7.1.3. 通过 RDP 连接至 Windows 虚拟机

桌面查看器控制台利用远程桌面协议 (RDP),为连接至 Windows 虚拟机提供更好的控制台体验。

要使用 RDP 连接至 Windows 虚拟机,请从 web 控制台上 Virtual Machine Details 屏幕中的 Consoles 选项卡下载虚拟机的 console.rdp 文件,并将其提供给您首选的 RDP 客户端。

先决条件

  • 正在运行的 Windows 虚拟机装有 QEMU 客户机代理。VirtIO 驱动程序中包含 qemu-guest-agent
  • 第 2 层 vNIC 附加到虚拟机。
  • 与 Windows 虚拟机处于相同网络的机器上装有 RDP 客户端。

流程

  1. 在 OpenShift Container Platform 控制台中,从侧边菜单中点 VirtualizationVirtualMachines
  2. 点 Windows 虚拟机打开 VirtualMachine 详情页。
  3. 点击 Console 选项卡。
  4. Console 列表中,选择 Desktop Viewer
  5. Network Interface 列表中,选择第 2 层 vNIC。
  6. 点击 Launch Remote Desktop 下载 console.rdp 文件。
  7. 打开 RDP 客户端并引用 console.rdp 文件。例如,使用 Remmina

    $ remmina --connect /path/to/console.rdp
  8. 输入 Administrator 用户名和密码以连接至 Windows 虚拟机。

8.7.2. 使用 CLI 命令访问虚拟机控制台

8.7.2.1. 通过 SSH 访问虚拟机实例

在虚拟机上公开 22 端口后,就可以使用 SSH 访问虚拟机(VM)。

virtctl expose 命令可将虚拟机实例(VMI)端口转发到节点端口,并创建一个服务以启用对它的访问。以下示例创建 fedora-vm-ssh 服务,它将集群节点的特定端口流量转发到 <fedora-vm> 虚拟机的端口 22。

先决条件

  • 您必须与 VMI 在同一个项目中。
  • 您要访问的 VMI 必须使用 masquerade 绑定方法连接到默认 pod 网络。
  • 您要访问的 VMI 必须正在运行。
  • 安装 OpenShift CLI(oc)。

流程

  1. 运行以下命令来创建 fedora-vm-ssh 服务:

    $ virtctl expose vm <fedora-vm> --port=22 --name=fedora-vm-ssh --type=NodePort 1
    1
    <fedora-vm> 是您在其上运行 fedora-vm-ssh 服务的虚拟机的名称。
  2. 检查服务,找出服务获取的端口:

    $ oc get svc

    输出示例

    NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)           AGE
    fedora-vm-ssh   NodePort   127.0.0.1      <none>        22:32551/TCP   6s

    在本例中,服务获取了 32551 端口。

  3. 通过 SSH 登录 VMI。使用任何集群节点的 ipAddress,以及在上一步中找到的端口:

    $ ssh username@<node_IP_address> -p 32551
8.7.2.2. 使用 YAML 配置通过 SSH 访问虚拟机

您可以启用与虚拟机的 SSH 连接,而无需运行 virtctl expose 命令。当配置并应用虚拟机的 YAML 文件和服务的 YAML 文件时,服务会将 SSH 流量转发到虚拟机。

以下示例显示了虚拟机的 YAML 文件和服务 YAML 文件的配置。

先决条件

  • 安装 OpenShift CLI (oc) 。
  • 使用 oc create namespace 命令并指定命名空间的名称,为虚拟机的 YAML 文件创建一个命名空间。

流程

  1. 在虚拟机的 YAML 文件中,添加标签和一个值来公开 SSH 连接的服务。为接口启用伪装(masquerade)功能:

    VirtualMachine 定义示例

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      namespace: ssh-ns 1
      name: vm-ssh
    spec:
      running: false
      template:
        metadata:
          labels:
            kubevirt.io/vm: vm-ssh
            special: vm-ssh 2
        spec:
          domain:
            devices:
              disks:
              - disk:
                  bus: virtio
                name: containerdisk
              - disk:
                  bus: virtio
                name: cloudinitdisk
              interfaces:
              - masquerade: {} 3
                name: testmasquerade 4
              rng: {}
            machine:
              type: ""
            resources:
              requests:
                memory: 1024M
          networks:
          - name: testmasquerade
            pod: {}
          volumes:
          - name: containerdisk
            containerDisk:
              image: kubevirt/fedora-cloud-container-disk-demo
          - name: cloudinitdisk
            cloudInitNoCloud:
              userData: |
                #cloud-config
                user: fedora
                password: fedora
                chpasswd: {expire: False}
    # ...

    1
    oc create namespace 命令创建的命名空间的名称。
    2
    服务用于标识为 SSH 流量连接启用的虚拟机实例的标签。标签可以是任何 key:value 对,作为标签(label)添加到此 YAML 文件,也可以作为服务 YAML 文件中的 selector 添加。
    3
    接口类型是 masquerade
    4
    此接口的名称为 testmasquerade
  2. 创建虚拟机:

    $ oc create -f <path_for_the_VM_YAML_file>
  3. 启动虚拟机:

    $ virtctl start vm-ssh
  4. 在服务的 YAML 文件中,指定服务名称、端口号和目标端口。

    Service 定义示例

    apiVersion: v1
    kind: Service
    metadata:
      name: svc-ssh 1
      namespace: ssh-ns 2
    spec:
      ports:
      - targetPort: 22 3
        protocol: TCP
        port: 27017
      selector:
        special: vm-ssh 4
      type: NodePort
    # ...

    1
    SSH 服务的名称。
    2
    oc create namespace 命令创建的命名空间的名称。
    3
    SSH 连接的目标端口号。
    4
    选择器名称和值必须与虚拟机的 YAML 文件中指定的标签匹配。
  5. 创建服务:

    $ oc create -f <path_for_the_service_YAML_file>
  6. 验证虚拟机是否正在运行:

    $ oc get vmi

    输出示例

    NAME    AGE     PHASE       IP              NODENAME
    vm-ssh 6s       Running     10.244.196.152  node01

  7. 检查服务,找出服务获取的端口:

    $ oc get svc

    输出示例

    NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)           AGE
    svc-ssh     NodePort       10.106.236.208 <none>        27017:30093/TCP   22s

    在本例中,服务获取了端口号 30093。

  8. 运行以下命令来获取节点的 IP 地址:

    $ oc get node <node_name> -o wide

    输出示例

    NAME    STATUS   ROLES   AGE    VERSION  INTERNAL-IP      EXTERNAL-IP
    node01  Ready    worker  6d22h  v1.23.0  192.168.55.101   <none>

  9. 通过 SSH 登录虚拟机运行的节点的 IP 地址和端口号。使用 oc get svc 命令显示的端口号,以及 oc get node 命令显示的节点 IP 地址。以下示例显示了带有用户名、节点 IP 地址和端口号的 ssh 命令:

    $ ssh fedora@192.168.55.101 -p 30093
8.7.2.3. 访问虚拟机实例的串行控制台

virtctl console 命令可打开特定虚拟机实例的串行控制台。

先决条件

  • 必须安装 virt-viewer 软件包。
  • 您要访问的虚拟机实例必须正在运行。

流程

  • 使用 virtctl 连接至串行控制台:

    $ virtctl console <VMI>
8.7.2.4. 使用 VNC 访问虚拟机实例的图形控制台

virtctl 客户端实用程序可使用 remote-viewer 功能打开正在运行的虚拟机实例的图形控制台。该功能包含在 virt-viewer 软件包中。

先决条件

  • 必须安装 virt-viewer 软件包。
  • 您要访问的虚拟机实例必须正在运行。
注意

如果要通过 SSH 在远程机器上使用 virtctl,您必须将 X 会话转发至您的机器。

流程

  1. 使用 virtctl 实用程序连接至图形界面:

    $ virtctl vnc <VMI>
  2. 如果命令失败,请尝试使用 -v 标志来收集故障排除信息:

    $ virtctl vnc <VMI> -v 4
8.7.2.5. 通过 RDP 控制台连接至 Windows 虚拟机

远程桌面协议 (RDP) 为连接至 Windows 虚拟机提供更好的控制台体验。

要通过 RDP 连接至 Windows 虚拟机,请为 RDP 客户端指定附加的 L2 vNIC 的 IP 地址。

先决条件

  • 正在运行的 Windows 虚拟机装有 QEMU 客户机代理。VirtIO 驱动程序中包含 qemu-guest-agent
  • 附加到虚拟机的第 2 层 vNIC。
  • 与 Windows 虚拟机处于相同网络的机器上装有 RDP 客户端。

流程

  1. 以具有访问令牌的用户身份通过 oc CLI 工具登录 OpenShift Virtualization 集群。

    $ oc login -u <user> https://<cluster.example.com>:8443
  2. 使用 oc describe vmi 显示正在运行的 Windows 虚拟机的配置。

    $ oc describe vmi <windows-vmi-name>

    输出示例

    ...
    spec:
      networks:
      - name: default
        pod: {}
      - multus:
          networkName: cnv-bridge
        name: bridge-net
    ...
    status:
      interfaces:
      - interfaceName: eth0
        ipAddress: 198.51.100.0/24
        ipAddresses:
          198.51.100.0/24
        mac: a0:36:9f:0f:b1:70
        name: default
      - interfaceName: eth1
        ipAddress: 192.0.2.0/24
        ipAddresses:
          192.0.2.0/24
          2001:db8::/32
        mac: 00:17:a4:77:77:25
        name: bridge-net
    ...

  3. 找出并复制第 2 层网络接口的 IP 地址。在以上示例中是 192.0.2.0,如果您首选 IPv6,则为 2001:db8::
  4. 打开 RDP 客户端,并使用上一步中复制的 IP 地址进行连接。
  5. 输入 Administrator 用户名和密码以连接至 Windows 虚拟机。

8.8. 使用 sysprep 自动执行 Windows 安装

您可以使用 Microsoft DVD 镜像和 sysprep 自动安装、设置和软件置备 Windows 虚拟机。

8.8.1. 使用 Windows DVD 创建虚拟机磁盘镜像

Microsoft 不提供下载的磁盘镜像,但您可以使用 Windows DVD 创建磁盘镜像。然后,可以使用此磁盘镜像来创建虚拟机。

流程

  1. 在 OpenShift Virtualization web 控制台中,点 StoragePersistentVolumeClaimsCreate PersistentVolumeClaim With Data upload form
  2. 选择预期的项目。
  3. 设置 持久性卷声明名称
  4. 从 Windows DVD 上传虚拟机磁盘镜像。该镜像现在可作为引导源来创建新的 Windows 虚拟机。

8.8.2. 使用磁盘镜像安装 Windows

您可以使用磁盘镜像在虚拟机上安装 Windows。

先决条件

  • 您必须使用 Windows DVD 创建磁盘镜像。
  • 您必须创建一个 autounattend.xml 回答文件。详情请查看 Microsoft 文档

流程

  1. 在 OpenShift Container Platform 控制台中,从侧边菜单中点 VirtualizationCatalog
  2. 选择 Windows 模板并点 Customize VirtualMachine
  3. Disk source 列表中选择 Upload(Upload a new file to a PVC),并浏览 DVD 镜像。
  4. Review and create VirtualMachine
  5. 清除 Clone available operating system source to this Virtual Machine
  6. 清除 Start this VirtualMachine after creation
  7. Scripts 选项卡的 Sysprep 部分,点 Edit
  8. 浏览到 autounattend.xml 回答文件,然后点保存
  9. Create VirtualMachine
  10. YAML 标签页中,将 running:false 替换为 runStrategy: RerunOnFailure,点 Save

虚拟机将从包含 autounattend.xml 回答文件的 sysprep 磁盘开始。

8.8.3. 使用 sysprep 常规调整 Windows 虚拟机

常规化镜像允许该镜像在部署虚拟机上时删除所有特定于系统的配置数据。

在常规调整虚拟机前,您必须确保 sysprep 工具在无人值守的 Windows 安装后无法检测到应答文件。

流程

  1. 在 OpenShift Container Platform 控制台中点 VirtualizationVirtualMachines
  2. 选择 Windows 虚拟机以打开 VirtualMachine 详情页。
  3. Disks 选项卡。
  4. sysprep 磁盘的 Options 菜单 kebab ,然后选择 Detach
  5. 单击 Detach
  6. 重命名 C:\Windows\Panther\unattend.xml 以避免 sysprep 工具对其进行检测。
  7. 运行以下命令启动 sysprep 程序:

    %WINDIR%\System32\Sysprep\sysprep.exe /generalize /shutdown /oobe /mode:vm
  8. sysprep 工具完成后,Windows 虚拟机将关闭。VM 的磁盘镜像现在可作为 Windows 虚拟机的安装镜像使用。

现在,您可以对虚拟机进行特殊化。

8.8.4. 专用 Windows 虚拟机

专用虚拟机(VM)将配置从常规化 Windows 镜像到虚拟机中的计算机特定信息。

先决条件

  • 您必须有一个通用的 Windows 磁盘镜像。
  • 您必须创建一个 unattend.xml 回答文件。详情请查看 Microsoft 文档

流程

  1. 在 OpenShift Container Platform 控制台中点 VirtualizationCatalog
  2. 选择 Windows 模板并点 Customize VirtualMachine
  3. Disk source 列表中选择 PVC(clone PVC)。
  4. 指定通用 Windows 镜像的持久性卷声明项目持久性卷声明名称
  5. Review and create VirtualMachine
  6. Scripts 选项卡。
  7. Sysprep 部分中,点 Edit,浏览到 unattend.xml 回答文件,然后点保存
  8. Create VirtualMachine

在初次启动过程中,Windows 使用 unattend.xml 回答文件来专注于虚拟机。虚拟机现在可供使用。

8.8.5. 其他资源

8.9. 解决故障节点来触发虚拟机故障切换

如果节点失败,并且没有在集群中部署 机器健康检查,则带有 RunStrategy: Always 配置的虚拟机(VM)不会被自动重新定位到健康的节点上。要触发虚拟机故障切换,您必须手动删除 Node 对象。

注意

如果使用安装程序置备的基础架构安装集群,并且正确地配置了机器健康检查:

  • 故障节点会被自动回收。
  • RunStrategy 被设置为 AlwaysRerunOnFailure 的虚拟机会自动调度到健康的节点上。

8.9.1. 先决条件

  • 运行虚拟机的节点具有 NotReady 条件
  • 在故障节点中运行的虚拟机的 RunStrategy 设置为 Always
  • 已安装 OpenShift CLI(oc)。

8.9.2. 从裸机集群中删除节点

当您使用 CLI 删除节点时,节点对象会从 Kubernetes 中删除,但该节点上存在的 pod 不会被删除。任何未由复制控制器支持的裸机 pod 都无法从 OpenShift Container Platform 访问。由复制控制器支持的 Pod 会重新调度到其他可用的节点。您必须删除本地清单 pod。

流程

通过完成以下步骤,从裸机上运行的 OpenShift Container Platform 集群中删除节点:

  1. 将节点标记为不可调度:

    $ oc adm cordon <node_name>
  2. 排空节点上的所有 pod:

    $ oc adm drain <node_name> --force=true

    如果节点离线或者无响应,此步骤可能会失败。即使节点没有响应,它仍然在运行写入共享存储的工作负载。为了避免数据崩溃,请在进行操作前关闭物理硬件。

  3. 从集群中删除节点:

    $ oc delete node <node_name>

    虽然节点对象现已从集群中删除,但它仍然可在重启后或 kubelet 服务重启后重新加入集群。要永久删除该节点及其所有数据,您必须弃用该节点

  4. 如果您关闭了物理硬件,请重新打开它以便节点可以重新加入集群。

8.9.3. 验证虚拟机故障切换

在不健康节点上终止所有资源后,会为每个重新定位的虚拟机在健康的节点上自动创建新虚拟机实例(VMI)。要确认已创建了 VMI,使用 oc CLI 查看所有 VMI。

8.9.3.1. 使用 CLI 列出所有虚拟机实例

您可以使用 oc 命令行界面(CLI)列出集群中的所有虚拟机实例(VMI),包括独立 VMI 和虚拟机拥有的实例。

流程

  • 运行以下命令列出所有 VMI:

    $ oc get vmis -A

8.10. 在虚拟机上安装 QEMU 客户机代理

QEMU 客户机代理是在虚拟机上运行的一个守护进程,它会将有关虚拟机、用户、文件系统和从属网络的信息传递给主机。

8.10.1. 在 Linux 虚拟机上安装 QEMU 客户机代理

qemu-guest-agent 广泛可用,默认在红帽虚拟机中可用。安装代理并启动服务。

要检查您的虚拟机 (VM) 是否已安装并运行 QEMU 客户机代理,请验证 AgentConnected 是否列在 VM spec 中。

注意

要为具有最高完整性的在线(Running 状态)虚拟机创建快照,请安装 QEMU 客户机代理。

QEMU 客户机代理通过尝试静止虚拟机的文件系统来尽可能取一个一致的快照,具体取决于系统工作负载。这样可确保在进行快照前将 in-flight I/O 写入磁盘。如果没有客户机代理,则无法静止并生成最佳快照。执行快照的条件反映在 web 控制台或 CLI 中显示的快照声明中。

流程

  1. 通过其中一个控制台或通过 SSH 访问虚拟机命令行。
  2. 在虚拟机上安装 QEMU 客户机代理:

    $ yum install -y qemu-guest-agent
  3. 确保服务持久并启动它:

    $ systemctl enable --now qemu-guest-agent

8.10.2. 在 Windows 虚拟机上安装 QEMU 客户机代理

对于 Windows 虚拟机,QEMU 客户机代理包含在 VirtIO 驱动程序中。在现有或者新的 Windows 安装上安装驱动程序。

要检查您的虚拟机 (VM) 是否已安装并运行 QEMU 客户机代理,请验证 AgentConnected 是否列在 VM spec 中。

注意

要为具有最高完整性的在线(Running 状态)虚拟机创建快照,请安装 QEMU 客户机代理。

QEMU 客户机代理通过尝试静止虚拟机的文件系统来尽可能取一个一致的快照,具体取决于系统工作负载。这样可确保在进行快照前将 in-flight I/O 写入磁盘。如果没有客户机代理,则无法静止并生成最佳快照。执行快照的条件反映在 web 控制台或 CLI 中显示的快照声明中。

8.10.2.1. 在现有 Windows 虚拟机上安装 VirtIO 驱动程序

从附加的 SATA CD 驱动器将 VirtIO 驱动程序安装到现有 Windows 虚拟机。

注意

该流程使用通用方法为 Windows 添加驱动。具体流程可能会因 Windows 版本而稍有差异。有关具体安装步骤,请参阅您的 Windows 版本安装文档。

流程

  1. 启动虚拟机并连接至图形控制台。
  2. 登录 Windows 用户会话。
  3. 打开 Device Manager 并展开 Other devices 以列出所有 Unknown device

    1. 打开 Device Properties 以识别未知设备。右击设备并选择 Properties
    2. 单击 Details 选项卡,并在 Property 列表中选择 Hardware Ids
    3. Hardware IdsValue 与受支持的 VirtIO 驱动程序相比较。
  4. 右击设备并选择 Update Driver Software
  5. 点击 Browse my computer for driver software 并浏览所附加的 VirtIO 驱动程序所在 SATA CD 驱动器。驱动程序将按照其驱动程序类型、操作系统和 CPU 架构分层排列。
  6. 点击 Next 以安装驱动程序。
  7. 对所有必要 VirtIO 驱动程序重复这一过程。
  8. 安装完驱动程序后,点击 Close 关闭窗口。
  9. 重启虚拟机以完成驱动程序安装。
8.10.2.2. 在 Windows 安装过程中安装 VirtIO 驱动程序

在 Windows 安装过程中,从附加的 SATA CD 驱动程序安装 VirtIO 驱动程序。

注意

该流程使用通用方法安装 Windows,且安装方法可能因 Windows 版本而异。有关您要安装的 Windows 版本,请参阅相关文档。

流程

  1. 启动虚拟机并连接至图形控制台。
  2. 开始 Windows 安装过程。
  3. 选择 Advanced 安装。
  4. 加载驱动程序前无法识别存储目的地。点击 Load driver
  5. 驱动程序将附加为 SATA CD 驱动器。点击 OK 并浏览 CD 驱动器以加载存储驱动程序。驱动程序将按照其驱动程序类型、操作系统和 CPU 架构分层排列。
  6. 对所有所需驱动程序重复前面两步。
  7. 完成 Windows 安装。

8.11. 查看虚拟机的 QEMU 客户机代理信息

当 QEMU 客户机代理在虚拟机上运行时,您可以使用 web 控制台查看有关虚拟机、用户、文件系统和从属网络的信息。

8.11.1. 先决条件

8.11.2. 关于 web 控制台中的 QEMU 客户机代理信息

安装 QEMU 客户机代理后,VirtualMachine 详情页中的 OverviewDetails 选项卡会显示主机名、操作系统、时区和登录用户的信息。

VirtualMachine 详情页面会显示在虚拟机上安装的客户端操作系统的信息。Details 标签显示有登录用户信息的表。Disks 标签页显示含有文件系统信息的表格。

注意

如果没有安装 QEMU 客户机代理,OverviewDetails 选项卡将显示有关创建虚拟机时指定的操作系统的信息。

8.11.3. 在 web 控制台中查看 QEMU 客户机代理信息

您可以使用 web 控制台查看由 QEMU 客户机代理传递给主机的虚拟机信息。

流程

  1. 在侧边菜单中点 VirtualizationVirtualMachines
  2. 选择虚拟机名称以打开 VirtualMachine 详情页。
  3. Details 选项卡查看活跃用户。
  4. Disks 标签查看文件系统的信息。

8.12. 在虚拟机中管理配置映射、secret 和服务帐户

您可以使用 secret、配置映射和服务帐户将配置数据传递给虚拟机。例如,您可以:

  • 通过向虚拟机添加 secret 来授予虚拟机对需要凭证的服务的访问权限。
  • 在配置映射中存储非机密配置数据,以便 pod 或另一个对象可以使用这些数据。
  • 允许组件通过将服务帐户与该组件关联来访问 API 服务器。
注意

OpenShift Virtualization 将 secret、配置映射和服务帐户作为虚拟机磁盘公开,以便可以在平台间使用这些 secret、ConfigMap 和服务帐户而无需额外的开销。

8.12.1. 将 secret、配置映射或服务帐户添加到虚拟机

使用 OpenShift Container Platform Web 控制台向虚拟机添加 secret、配置映射或服务帐户。

这些资源作为磁盘添加到虚拟机中。您可在挂载任何其他磁盘时挂载 secret、配置映射或服务帐户。

如果虚拟机正在运行,则更改在重启虚拟机之后才会生效。新添加的资源在页面顶部的 Pending Changes 中的 EnvironmentDisks 都会标记为改变待处理。

先决条件

  • 要添加的 secret、配置映射或服务帐户必须与目标虚拟机位于同一命名空间中。

流程

  1. 在侧边菜单中点 VirtualizationVirtualMachines
  2. 选择虚拟机以打开 VirtualMachine 详情页面。
  3. Environment 选项卡中,点 Add Config Map、Secret or Service Account
  4. Select a resource,从列表中选择一个资源。为所选资源自动生成带有六个字符的序列号。
  5. 可选:点 Reload 将环境恢复到其上次保存的状态。
  6. 点击 Save

验证

  1. VirtualMachine 详情页中,点 Disks 选项卡,验证 secret、配置映射或服务帐户是否包含在磁盘列表中。
  2. ActionsRestart 重启虚拟机。

现在,您可以在挂载任何其他磁盘时挂载 secret、配置映射或服务帐户。

8.12.2. 从虚拟机中删除 secret、配置映射或服务帐户

使用 OpenShift Container Platform Web 控制台从虚拟机中删除 secret、配置映射或服务帐户。

先决条件

  • 您必须至少有一个 secret、配置映射或服务帐户附加到虚拟机。

流程

  1. 在侧边菜单中点 VirtualizationVirtualMachines
  2. 选择虚拟机以打开 VirtualMachine 详情页面。
  3. Environment 标签页。
  4. 在列表中找到您要删除的项目,然后点击项目右侧的 Remove delete
  5. 点击 Save
注意

您可以点击 Reload 将表单重置为最后一个保存的状态。

验证

  1. VirtualMachine 详情页,点 Disks 选项卡。
  2. 检查以确保删除的 secret、配置映射或服务帐户不再包含在磁盘列表中。

8.12.3. 其他资源

8.13. 在现有 Windows 虚拟机上安装 VirtIO 驱动程序

8.13.1. 关于 VirtIO 驱动程序

VirtIO 驱动程序是 Microsoft Windows 虚拟机在 OpenShift Virtualization 中运行时所需的半虚拟化设备驱动程序。受支持的驱动程序可在 红帽生态系统目录container-native-virtualization/virtio-win 容器磁盘中找到。

必须将 container-native-virtualization/virtio-win 容器磁盘作为 SATA CD 驱动器附加到虚拟机,以启用驱动程序安装。您可在虚拟机安装 Windows 期间安装 VirtIO 驱动程序,或将其附加到现有 Windows 安装。

安装完驱动程序后,可从虚拟机中移除 container-native-virtualization/virtio-win 容器磁盘。

另请参阅:在新 Windows 虚拟机上安装 Virtio 驱动程序

8.13.2. Microsoft Windows 虚拟机支持的 VirtIO 驱动程序

表 8.2. 支持的驱动程序
驱动程序名称硬件 ID描述

viostor

VEN_1AF4&DEV_1001
VEN_1AF4&DEV_1042

块驱动程序。有时会在 Other devices 组中显示为 SCSI Controller

viorng

VEN_1AF4&DEV_1005
VEN_1AF4&DEV_1044

熵源(entropy)驱动程序。有时会在 Other devices 组中显示为 PCI Device

NetKVM

VEN_1AF4&DEV_1000
VEN_1AF4&DEV_1041

网络驱动程序。有时会在 Other devices 组中显示为 Ethernet Controller。仅在配置了 VirtIO NIC 时可用。

8.13.3. 将 VirtIO 驱动程序容器磁盘添加到虚拟机中

针对 Microsoft Windows 的 OpenShift Virtualization VirtIO 驱动程序作为一个容器磁盘提供,可在 Red Hat Ecosystem Catalog 中找到。要为 Windows 虚拟机安装这些驱动程序,请在虚拟机配置文件中将 container-native-virtualization/virtio-win 容器磁盘作为 SATA CD 驱动器附加到虚拟机。

先决条件

  • Red Hat Ecosystem Catalog 下载 container-native-virtualization/virtio-win 容器磁盘。这一步并非强制要求,因为如果集群中不存在容器磁盘,将从 Red Hat registry 中下载,但通过此步下载可节省安装时间。

流程

  1. container-native-virtualization/virtio-win 容器磁盘作为 cdrom 磁盘添加到 Windows 虚拟机配置文件中。如果集群中还没有容器磁盘,将从 registry 中下载。

    spec:
      domain:
        devices:
          disks:
            - name: virtiocontainerdisk
              bootOrder: 2 1
              cdrom:
                bus: sata
    volumes:
      - containerDisk:
          image: container-native-virtualization/virtio-win
        name: virtiocontainerdisk
    1
    OpenShift Virtualization 按照 VirtualMachine 配置文件中定义的顺序启动虚拟机磁盘。您可将虚拟机的其他磁盘定义到 container-native-virtualization/virtio-win 容器磁盘前面,也可使用 bootOrder 可选参数来确保虚拟机从正确磁盘启动。如果为一个磁盘指定 bootOrder,则必须为配置中的所有磁盘指定。
  2. 虚拟机启动后,磁盘随即可用:

    • 如果要将容器磁盘添加到正在运行的虚拟机,请在 CLI 中执行 oc apply -f <vm.yaml>,或重启虚拟机,以使更改生效。
    • 如果虚拟机还未运行,则使用 virtctl start <vm>

虚拟机启动后,可从附加的 SATA CD 驱动器安装 VirtIO 驱动程序。

8.13.4. 在现有 Windows 虚拟机上安装 VirtIO 驱动程序

从附加的 SATA CD 驱动器将 VirtIO 驱动程序安装到现有 Windows 虚拟机。

注意

该流程使用通用方法为 Windows 添加驱动。具体流程可能会因 Windows 版本而稍有差异。有关具体安装步骤,请参阅您的 Windows 版本安装文档。

流程

  1. 启动虚拟机并连接至图形控制台。
  2. 登录 Windows 用户会话。
  3. 打开 Device Manager 并展开 Other devices 以列出所有 Unknown device

    1. 打开 Device Properties 以识别未知设备。右击设备并选择 Properties
    2. 单击 Details 选项卡,并在 Property 列表中选择 Hardware Ids
    3. Hardware IdsValue 与受支持的 VirtIO 驱动程序相比较。
  4. 右击设备并选择 Update Driver Software
  5. 点击 Browse my computer for driver software 并浏览所附加的 VirtIO 驱动程序所在 SATA CD 驱动器。驱动程序将按照其驱动程序类型、操作系统和 CPU 架构分层排列。
  6. 点击 Next 以安装驱动程序。
  7. 对所有必要 VirtIO 驱动程序重复这一过程。
  8. 安装完驱动程序后,点击 Close 关闭窗口。
  9. 重启虚拟机以完成驱动程序安装。

8.13.5. 从虚拟机移除 VirtIO 容器磁盘

在向虚拟机安装完所有所需 VirtIO 驱动程序后,container-native-virtualization/virtio-win 容器磁盘便不再需要附加到虚拟机。从虚拟机配置文件中移除 container-native-virtualization/virtio-win 容器磁盘。

流程

  1. 编辑配置文件并移除 diskvolume

    $ oc edit vm <vm-name>
    spec:
      domain:
        devices:
          disks:
            - name: virtiocontainerdisk
              bootOrder: 2
              cdrom:
                bus: sata
    volumes:
      - containerDisk:
          image: container-native-virtualization/virtio-win
        name: virtiocontainerdisk
  2. 重启虚拟机以使更改生效。

8.14. 在新 Windows 虚拟机上安装 VirtIO 驱动程序

8.14.1. 先决条件

8.14.2. 关于 VirtIO 驱动程序

VirtIO 驱动程序是 Microsoft Windows 虚拟机在 OpenShift Virtualization 中运行时所需的半虚拟化设备驱动程序。受支持的驱动程序可在 红帽生态系统目录container-native-virtualization/virtio-win 容器磁盘中找到。

必须将 container-native-virtualization/virtio-win 容器磁盘作为 SATA CD 驱动器附加到虚拟机,以启用驱动程序安装。您可在虚拟机安装 Windows 期间安装 VirtIO 驱动程序,或将其附加到现有 Windows 安装。

安装完驱动程序后,可从虚拟机中移除 container-native-virtualization/virtio-win 容器磁盘。

另请参阅:在现有 Windows 虚拟机上安装 VirtIO 驱动程序

8.14.3. Microsoft Windows 虚拟机支持的 VirtIO 驱动程序

表 8.3. 支持的驱动程序
驱动程序名称硬件 ID描述

viostor

VEN_1AF4&DEV_1001
VEN_1AF4&DEV_1042

块驱动程序。有时会在 Other devices 组中显示为 SCSI Controller

viorng

VEN_1AF4&DEV_1005
VEN_1AF4&DEV_1044

熵源(entropy)驱动程序。有时会在 Other devices 组中显示为 PCI Device

NetKVM

VEN_1AF4&DEV_1000
VEN_1AF4&DEV_1041

网络驱动程序。有时会在 Other devices 组中显示为 Ethernet Controller。仅在配置了 VirtIO NIC 时可用。

8.14.4. 将 VirtIO 驱动程序容器磁盘添加到虚拟机中

针对 Microsoft Windows 的 OpenShift Virtualization VirtIO 驱动程序作为一个容器磁盘提供,可在 Red Hat Ecosystem Catalog 中找到。要为 Windows 虚拟机安装这些驱动程序,请在虚拟机配置文件中将 container-native-virtualization/virtio-win 容器磁盘作为 SATA CD 驱动器附加到虚拟机。

先决条件

  • Red Hat Ecosystem Catalog 下载 container-native-virtualization/virtio-win 容器磁盘。这一步并非强制要求,因为如果集群中不存在容器磁盘,将从 Red Hat registry 中下载,但通过此步下载可节省安装时间。

流程

  1. container-native-virtualization/virtio-win 容器磁盘作为 cdrom 磁盘添加到 Windows 虚拟机配置文件中。如果集群中还没有容器磁盘,将从 registry 中下载。

    spec:
      domain:
        devices:
          disks:
            - name: virtiocontainerdisk
              bootOrder: 2 1
              cdrom:
                bus: sata
    volumes:
      - containerDisk:
          image: container-native-virtualization/virtio-win
        name: virtiocontainerdisk
    1
    OpenShift Virtualization 按照 VirtualMachine 配置文件中定义的顺序启动虚拟机磁盘。您可将虚拟机的其他磁盘定义到 container-native-virtualization/virtio-win 容器磁盘前面,也可使用 bootOrder 可选参数来确保虚拟机从正确磁盘启动。如果为一个磁盘指定 bootOrder,则必须为配置中的所有磁盘指定。
  2. 虚拟机启动后,磁盘随即可用:

    • 如果要将容器磁盘添加到正在运行的虚拟机,请在 CLI 中执行 oc apply -f <vm.yaml>,或重启虚拟机,以使更改生效。
    • 如果虚拟机还未运行,则使用 virtctl start <vm>

虚拟机启动后,可从附加的 SATA CD 驱动器安装 VirtIO 驱动程序。

8.14.5. 在 Windows 安装过程中安装 VirtIO 驱动程序

在 Windows 安装过程中,从附加的 SATA CD 驱动程序安装 VirtIO 驱动程序。

注意

该流程使用通用方法安装 Windows,且安装方法可能因 Windows 版本而异。有关您要安装的 Windows 版本,请参阅相关文档。

流程

  1. 启动虚拟机并连接至图形控制台。
  2. 开始 Windows 安装过程。
  3. 选择 Advanced 安装。
  4. 加载驱动程序前无法识别存储目的地。点击 Load driver
  5. 驱动程序将附加为 SATA CD 驱动器。点击 OK 并浏览 CD 驱动器以加载存储驱动程序。驱动程序将按照其驱动程序类型、操作系统和 CPU 架构分层排列。
  6. 对所有所需驱动程序重复前面两步。
  7. 完成 Windows 安装。

8.14.6. 从虚拟机移除 VirtIO 容器磁盘

在向虚拟机安装完所有所需 VirtIO 驱动程序后,container-native-virtualization/virtio-win 容器磁盘便不再需要附加到虚拟机。从虚拟机配置文件中移除 container-native-virtualization/virtio-win 容器磁盘。

流程

  1. 编辑配置文件并移除 diskvolume

    $ oc edit vm <vm-name>
    spec:
      domain:
        devices:
          disks:
            - name: virtiocontainerdisk
              bootOrder: 2
              cdrom:
                bus: sata
    volumes:
      - containerDisk:
          image: container-native-virtualization/virtio-win
        name: virtiocontainerdisk
  2. 重启虚拟机以使更改生效。

8.15. 高级虚拟机管理

8.15.1. 为虚拟机使用资源配额

为虚拟机创建和管理资源配额。

8.15.1.1. 为虚拟机设置资源配额限制

只有使用请求自动用于虚拟机 (VM) 的资源配额。如果您的资源配额使用限制,则必须为虚拟机手动设置资源限值。资源限值必须至少大于资源请求的 100 MiB。

流程

  1. 通过编辑 VirtualMachine 清单来为虚拟机设置限值。例如:

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: with-limits
    spec:
      running: false
      template:
        spec:
          domain:
    # ...
            resources:
              requests:
                memory: 128Mi
              limits:
                memory: 256Mi  1
    1
    这个配置被支持,因为 limits.memory 值至少比 requests.memory 的值大 100Mi
  2. 保存 VirtualMachine 清单。
8.15.1.2. 其他资源

8.15.2. 为虚拟机指定节点

您可以使用节点放置规则将虚拟机放置到特定的节点上。

8.15.2.1. 关于虚拟机的节点放置

要确保虚拟机在适当的节点上运行,您可以配置节点放置规则。如果出现以下情况,您可能需要进行此操作:

  • 您有多台虚拟机。为确保容错,您希望它们在不同节点上运行。
  • 您有两个 chatty 虚拟机。为了避免冗余节点间路由,您希望虚拟机在同一节点上运行。
  • 您的虚拟机需要所有可用节点上不存在的特定硬件功能。
  • 您有一个 pod 可以向节点添加功能,并想将虚拟机放置到该节点上,以便它可以使用这些功能。
注意

虚拟机放置依赖于工作负载的现有节点放置规则。如果组件级别上的特定节点排除工作负载,则虚拟机无法放置在这些节点上。

您可以在 VirtualMachine 清单的 spec 字段中使用以下规则类型:

nodeSelector
允许将虚拟机调度到使用此字段中指定的键值对标记的节点上。节点必须具有与所有列出的对完全匹配的标签。
关联性

这可让您使用更具表达力的语法来设置与虚拟机匹配的规则。例如,您可以指定规则是首选项,而非硬要求,因此在规则不满足时仍然可以调度虚拟机。虚拟机放置支持 Pod 关联性、pod 反关联性和节点关联性。Pod 关联性适用于虚拟机,因为 VirtualMachine 工作负载类型基于 Pod 对象。

注意

关联性规则仅在调度期间应用。如果不再满足限制,OpenShift Container Platform 不会重新调度正在运行的工作负载。

容限(tolerations)
允许将虚拟机调度到具有匹配污点的节点。如果污点应用到某个节点,则该节点只接受容许该污点的虚拟机。
8.15.2.2. 节点放置示例

以下示例 YAML 文件片断使用 nodePlacementaffinitytolerations 字段为虚拟机自定义节点放置。

8.15.2.2.1. 示例:使用 nodeSelector 放置虚拟机节点

在本例中,虚拟机需要一个包含 example-key-1 = example-value-1example-key-2 = example-value-2 标签的元数据的节点。

警告

如果没有节点适合此描述,则不会调度虚拟机。

VM 清单示例

metadata:
  name: example-vm-node-selector
apiVersion: kubevirt.io/v1
kind: VirtualMachine
spec:
  template:
    spec:
      nodeSelector:
        example-key-1: example-value-1
        example-key-2: example-value-2
...

8.15.2.2.2. 示例:使用 pod 关联性和 pod 反关联性的虚拟机节点放置

在本例中,虚拟机必须调度到具有标签 example-key-1 = example-value-1 的正在运行的 pod 的节点上。如果没有在任何节点上运行这样的 pod,则不会调度虚拟机。

如果可能,虚拟机不会调度到具有标签 example-key-2 = example-value-2 的 pod 的节点上。但是,如果所有候选节点都有具有此标签的 pod,调度程序会忽略此约束。

VM 清单示例

metadata:
  name: example-vm-pod-affinity
apiVersion: kubevirt.io/v1
kind: VirtualMachine
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution: 1
      - labelSelector:
          matchExpressions:
          - key: example-key-1
            operator: In
            values:
            - example-value-1
        topologyKey: kubernetes.io/hostname
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution: 2
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: example-key-2
              operator: In
              values:
              - example-value-2
          topologyKey: kubernetes.io/hostname
...

1
如果您使用 requiredDuringSchedulingIgnoredDuringExecution 规则类型,如果没有满足约束,则不会调度虚拟机。
2
如果您使用 preferredDuringSchedulingIgnoredDuringExecution 规则类型,只要满足所有必要的限制,仍会调度虚拟机(如果未满足约束)。
8.15.2.2.3. 示例:使用节点关联性进行虚拟机节点放置

在本例中,虚拟机必须调度到具有标签 example.io/example-key = example-value-1 或标签 example.io/example-key = example-value-2 的节点上。如果节点上只有一个标签,则会满足约束。如果没有标签,则不会调度虚拟机。

若有可能,调度程序会避免具有标签 example-node-label-key = example-node-label-value 的节点。但是,如果所有候选节点都具有此标签,调度程序会忽略此限制。

VM 清单示例

metadata:
  name: example-vm-node-affinity
apiVersion: kubevirt.io/v1
kind: VirtualMachine
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution: 1
        nodeSelectorTerms:
        - matchExpressions:
          - key: example.io/example-key
            operator: In
            values:
            - example-value-1
            - example-value-2
      preferredDuringSchedulingIgnoredDuringExecution: 2
      - weight: 1
        preference:
          matchExpressions:
          - key: example-node-label-key
            operator: In
            values:
            - example-node-label-value
...

1
如果您使用 requiredDuringSchedulingIgnoredDuringExecution 规则类型,如果没有满足约束,则不会调度虚拟机。
2
如果您使用 preferredDuringSchedulingIgnoredDuringExecution 规则类型,只要满足所有必要的限制,仍会调度虚拟机(如果未满足约束)。
8.15.2.2.4. 示例:带有容限的虚拟机节点放置

在本例中,为虚拟机保留的节点已使用 key=virtualization:NoSchedule 污点标记。由于此虚拟机具有匹配的容限,它可以调度到污点节点上。

注意

容许污点的虚拟机不需要调度到具有该污点的节点。

VM 清单示例

metadata:
  name: example-vm-tolerations
apiVersion: kubevirt.io/v1
kind: VirtualMachine
spec:
  tolerations:
  - key: "key"
    operator: "Equal"
    value: "virtualization"
    effect: "NoSchedule"
...

8.15.2.3. 其他资源

8.15.3. 配置证书轮转

配置证书轮转参数以替换现有证书。

8.15.3.1. 配置证书轮转

您可以在 web 控制台中的 OpenShift Virtualization 安装过程中,或者在安装 HyperConverged 自定义资源(CR)后完成此操作。

流程

  1. 运行以下命令打开 HyperConverged CR:

    $ oc edit hco -n openshift-cnv kubevirt-hyperconverged
  2. 按照以下示例所示,编辑 spec.certConfig 字段。要避免系统过载,请确保所有值都大于或等于 10 分钟。将所有值显示为符合 golang ParseDuration 格式的字符串

    apiVersion: hco.kubevirt.io/v1beta1
    kind: HyperConverged
    metadata:
     name: kubevirt-hyperconverged
     namespace: openshift-cnv
    spec:
      certConfig:
        ca:
          duration: 48h0m0s
          renewBefore: 24h0m0s 1
        server:
          duration: 24h0m0s  2
          renewBefore: 12h0m0s  3
    1
    ca.renewBefore 的值必须小于或等于 ca.duration 的值。
    2
    server.duration 的值必须小于或等于 ca.duration 的值。
    3
    server.renewBefore 的值必须小于或等于 server.duration 的值。
  3. 将 YAML 文件应用到集群。
8.15.3.2. 证书轮转参数故障排除

删除一个或多个 certConfig 值会导致它们恢复到默认值,除非默认值与以下条件之一冲突:

  • ca.renewBefore 的值必须小于或等于 ca.duration 的值。
  • server.duration 的值必须小于或等于 ca.duration 的值。
  • server.renewBefore 的值必须小于或等于 server.duration 的值。

如果默认值与这些条件冲突,您将收到错误。

如果您删除了以下示例中的 server.duration 值,则默认值 24h0m0s 大于 ca.duration 的值,并与指定条件冲突。

示例

certConfig:
   ca:
     duration: 4h0m0s
     renewBefore: 1h0m0s
   server:
     duration: 4h0m0s
     renewBefore: 4h0m0s

这会生成以下出错信息:

error: hyperconvergeds.hco.kubevirt.io "kubevirt-hyperconverged" could not be patched: admission webhook "validate-hco.kubevirt.io" denied the request: spec.certConfig: ca.duration is smaller than server.duration

错误消息仅提及第一个冲突。在继续操作前,查看所有 certConfig 值。

8.15.4. 自动执行管理任务

您可以使用 Red Hat Ansible Automation Platform 自动完成 OpenShift Virtualization 管理任务。通过使用 Ansible Playbook 创建新虚拟机来了解基础知识。

8.15.4.1. 关于 Red Hat Ansible Automation

Ansible 是用于配置系统、部署软件和执行滚动更新的自动化工具。Ansible 包含对 OpenShift Virtualization 的支持,Ansible 模块可用于自动执行集群管理任务,如模板、持久性卷声明和虚拟机操作。

Ansible 提供了一种方式来自动执行 OpenShift Virtualization 管理,您也可以使用 oc CLI 工具或 API 来完成此项操作。Ansible 独具特色,因其可用于将 KubeVirt 模块与其他 Ansible 模块集成。

8.15.4.2. 自动创建虚拟机

使用 Red Hat Ansible Automation Platform,您可使用 kubevirt_vm Ansible Playbook 在 OpenShift Container Platform 集群中创建虚拟机。

先决条件

流程

  1. 编辑 Ansible Playbook YAML 文件,以便其包含 kubevirt_vm 任务:

      kubevirt_vm:
        namespace:
        name:
        cpu_cores:
        memory:
        disks:
          - name:
            volume:
              containerDisk:
                image:
            disk:
              bus:
    注意

    该片断仅包含 playbook 的 kubevirt_vm 部分。

  2. 编辑这些值以反应您要创建的虚拟机,包括 namespacecpu_cores 数、memory 以及 disks。例如:

      kubevirt_vm:
        namespace: default
        name: vm1
        cpu_cores: 1
        memory: 64Mi
        disks:
          - name: containerdisk
            volume:
              containerDisk:
                image: kubevirt/cirros-container-disk-demo:latest
            disk:
              bus: virtio
  3. 如果希望虚拟机创建后立即启动,请向 YAML 文件添加 state: running。例如:

      kubevirt_vm:
        namespace: default
        name: vm1
        state: running 1
        cpu_cores: 1
    1
    将该值改为 state: absent 会删除已存在的虚拟机。
  4. 运行 ansible-playbook 命令,将 playbook 文件名用作唯一参数:

    $ ansible-playbook create-vm.yaml
  5. 查看输出以确定该 play 是否成功:

    输出示例

    (...)
    TASK [Create my first VM] ************************************************************************
    changed: [localhost]
    
    PLAY RECAP ********************************************************************************************************
    localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

  6. 如果您未在 playbook 文件中包含 state: running,而您希望立即启动虚拟机,请编辑文件使其包含 state: running 并再次运行 playbook:

    $ ansible-playbook create-vm.yaml

要验证是否已创建虚拟机,请尝试访问虚拟机控制台

8.15.4.3. 示例:用于创建虚拟机的 Ansible Playbook

您可使用 kubevirt_vm Ansible Playbook 自动创建虚拟机。

以下 YAML 文件是一个 kubevirt_vm playbook 示例。如果运行 playbook,其中会包含必须替换为您自己的信息的样本值。

---
- name: Ansible Playbook 1
  hosts: localhost
  connection: local
  tasks:
    - name: Create my first VM
      kubevirt_vm:
        namespace: default
        name: vm1
        cpu_cores: 1
        memory: 64Mi
        disks:
          - name: containerdisk
            volume:
              containerDisk:
                image: kubevirt/cirros-container-disk-demo:latest
            disk:
              bus: virtio

8.15.5. 为虚拟机使用 UEFI 模式

您可以使用统一可扩展固件接口(UEFI)模式引导虚拟机(VM)。

8.15.5.1. 关于虚拟机的 UEFI 模式

像旧的 BIOS 一样,统一可扩展固件接口(UEFI)在计算机启动时初始化硬件组件和操作系统镜像文件。与 BIOS 相比,UEFI 支持更现代的功能和自定义选项,从而加快启动速度。

它将初始化和启动的所有信息保存在带有 .efi 扩展的文件中,该扩展被保存在名为 EFI 系统分区(ESP)的特殊分区中。ESP 还包含安装在计算机上的操作系统的引导装载程序程序。

8.15.5.2. 在 UEFI 模式中引导虚拟机

您可以通过编辑 VirtualMachine 清单,将虚拟机配置为在 UEFI 模式中引导。

先决条件

  • 安装 OpenShift CLI (oc) 。

流程

  1. 编辑或创建 VirtualMachine 清单文件。使用 spec.firmware.bootloader 小节来配置 UEFI 模式:

    使用安全引导活跃在 UEFI 模式中引导

    apiversion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      labels:
        special: vm-secureboot
      name: vm-secureboot
    spec:
      template:
        metadata:
          labels:
            special: vm-secureboot
        spec:
          domain:
            devices:
              disks:
              - disk:
                  bus: virtio
                name: containerdisk
            features:
              acpi: {}
              smm:
                enabled: true 1
            firmware:
              bootloader:
                efi:
                  secureBoot: true 2
    ...

    1
    OpenShift Virtualization 需要为 UEFI 模式的安全引导启用系统管理模式(SMM)。
    2
    使用 UEFI 模式时,OpenShift Virtualization 支持带有或不进行安全引导的虚拟机。如果启用了安全引导,则需要 UEFI 模式。但是,可以在不使用安全引导的情况下启用 UEFI 模式。
  2. 运行以下命令,将清单应用到集群:

    $ oc create -f <file_name>.yaml

8.15.6. 为虚拟机配置 PXE 启动

OpenShift Virtualization 中提供 PXE 启动或网络启动。网络启动支持计算机启动和加载操作系统或其他程序,无需本地连接的存储设备。例如,在部署新主机时,您可使用 PXE 启动从 PXE 服务器中选择所需操作系统镜像。

8.15.6.1. 先决条件
  • Linux 网桥必须已连接
  • PXE 服务器必须作为网桥连接至相同 VLAN。
8.15.6.2. 使用指定的 MAC 地址的 PXE 引导

作为管理员,您可首先为您的 PXE 网络创建 NetworkAttachmentDefinition 对象,以此通过网络引导客户端。然后在启动虚拟机实例前,在您的虚拟机实例配置文件中引用网络附加定义。如果 PXE 服务器需要,您还可在虚拟机实例配置文件中指定 MAC 地址。

先决条件

  • 必须已连接 Linux 网桥。
  • PXE 服务器必须作为网桥连接至相同 VLAN。

流程

  1. 在集群上配置 PXE 网络:

    1. 为 PXE 网络 pxe-net-conf 创建网络附加定义文件:

      apiVersion: "k8s.cni.cncf.io/v1"
      kind: NetworkAttachmentDefinition
      metadata:
        name: pxe-net-conf
      spec:
        config: '{
          "cniVersion": "0.3.1",
          "name": "pxe-net-conf",
          "plugins": [
            {
              "type": "cnv-bridge",
              "bridge": "br1",
              "vlan": 1 1
            },
            {
              "type": "cnv-tuning" 2
            }
          ]
        }'
      1
      可选: VLAN 标签。
      2
      cnv-tuning 插件为自定义 MAC 地址提供支持。
      注意

      虚拟机实例将通过所请求的 VLAN 的访问端口附加到网桥 br1

  2. 使用您在上一步中创建的文件创建网络附加定义:

    $ oc create -f pxe-net-conf.yaml
  3. 编辑虚拟机实例配置文件以包括接口和网络的详情。

    1. 如果 PXE 服务器需要,请指定网络和 MAC 地址。如果未指定 MAC 地址,则会自动分配一个值。

      请确保 bootOrder 设置为 1,以便该接口先启动。在本例中,该接口连接到了名为 <pxe-net> 的网络中:

      interfaces:
      - masquerade: {}
        name: default
      - bridge: {}
        name: pxe-net
        macAddress: de:00:00:00:00:de
        bootOrder: 1
      注意

      启动顺序对于接口和磁盘全局通用。

    2. 为磁盘分配一个启动设备号,以确保置备操作系统后能够正确启动。

      将磁盘 bootOrder 值设置为 2

      devices:
        disks:
        - disk:
            bus: virtio
          name: containerdisk
          bootOrder: 2
    3. 指定网络连接到之前创建的网络附加定义。在这种情况下,<pxe-net> 连接到名为 <pxe-net-conf> 的网络附加定义:

      networks:
      - name: default
        pod: {}
      - name: pxe-net
        multus:
          networkName: pxe-net-conf
  4. 创建虚拟机实例:

    $ oc create -f vmi-pxe-boot.yaml

输出示例

  virtualmachineinstance.kubevirt.io "vmi-pxe-boot" created

  1. 等待虚拟机实例运行:

    $ oc get vmi vmi-pxe-boot -o yaml | grep -i phase
      phase: Running
  2. 使用 VNC 查看虚拟机实例:

    $ virtctl vnc vmi-pxe-boot
  3. 查看启动屏幕,验证 PXE 启动是否成功。
  4. 登录虚拟机实例:

    $ virtctl console vmi-pxe-boot
  5. 验证虚拟机上的接口和 MAC 地址,并验证连接到网桥的接口是否具有指定的 MAC 地址。在本例中,我们使用了 eth1 进行 PXE 启动,无需 IP 地址。另一接口 eth0 从 OpenShift Container Platform 获取 IP 地址。

    $ ip addr

输出示例

...
3. eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
   link/ether de:00:00:00:00:de brd ff:ff:ff:ff:ff:ff

8.15.6.3. OpenShift Virtualization 术语表

OpenShift Virtualization 使用自定义资源和插件提供高级联网功能。

以下是整个 OpenShift Virtualization 文档中使用的术语:

Container Network Interface (CNI)
一个 Cloud Native Computing Foundation 项目,侧重容器网络连接。OpenShift Virtualization 使用 CNI 插件基于基本 Kubernetes 网络功能进行构建。
Multus
一个“meta”CNI 插件,支持多个 CNI 共存,以便 pod 或虚拟机可使用其所需的接口。
自定义资源定义(CRD)
一种 Kubernetes API 资源,用于定义自定义资源,或使用 CRD API 资源定义的对象。
网络附加定义(NAD)
由 Multus 项目引入的 CRD,允许您将 Pod、虚拟机和虚拟机实例附加到一个或多个网络。
节点网络配置策略(NNCP)
节点上请求的网络配置的描述。您可以通过将 NodeNetworkConfigurationPolicy清单应用到集群来更新节点网络配置,包括添加和删除网络接口 。
预启动执行环境 (PXE)
一种接口,让管理员能够通过网络从服务器启动客户端机器。网络启动可用于为客户端远程加载操作系统和其他软件。

8.15.7. 在虚拟机中使用巨页

您可以使用巨页作为集群中虚拟机的后备内存。

8.15.7.1. 先决条件
8.15.7.2. 巨页的作用

内存在块(称为页)中进行管理。在大多数系统中,页的大小为 4Ki。1Mi 内存相当于 256 个页,1Gi 内存相当于 256,000 个页。CPU 有内置的内存管理单元,可在硬件中管理这些页的列表。Translation Lookaside Buffer (TLB) 是虚拟页到物理页映射的小型硬件缓存。如果在硬件指令中包括的虚拟地址可以在 TLB 中找到,则其映射信息可以被快速获得。如果没有包括在 TLN 中,则称为 TLB miss。系统将会使用基于软件的,速度较慢的地址转换机制,从而出现性能降低的问题。因为 TLB 的大小是固定的,因此降低 TLB miss 的唯一方法是增加页的大小。

巨页指一个大于 4Ki 的内存页。在 x86_64 构架中,有两个常见的巨页大小: 2Mi 和 1Gi。在其它构架上的大小会有所不同。要使用巨页,必须写相应的代码以便应用程序了解它们。Transparent Huge Pages(THP)试图在应用程序不需要了解的情况下自动管理巨页,但这个技术有一定的限制。特别是,它的页大小会被限为 2Mi。当有较高的内存使用率时,THP 可能会导致节点性能下降,或出现大量内存碎片(因为 THP 的碎片处理)导致内存页被锁定。因此,有些应用程序可能更适用于(或推荐)使用预先分配的巨页,而不是 THP。

在 OpenShift Virtualization 中,可将虚拟机配置为消耗预先分配的巨页。

8.15.7.3. 为虚拟机配置巨页

您可以在虚拟机配置中包括 memory.hugepages.pageSizeresources.requests.memory 参数来配置虚拟机来使用预分配的巨页。

内存请求必须按页大小分离。例如,您不能对大小为 1Gi 的页请求 500Mi 内存。

注意

主机的内存布局和客户端操作系统不相关。虚拟机清单中请求的巨页适用于 QEMU。客户端中的巨页只能根据虚拟机实例的可用内存量来配置。

如果您编辑了正在运行的虚拟机,则必须重启虚拟机才能使更改生效。

先决条件

  • 节点必须配置预先分配的巨页。

流程

  1. 在虚拟机配置中,把 resources.requests.memorymemory.hugepages.pageSize 参数添加到 spec.domain。以下配置片段适用于请求总计 4Gi 内存的虚拟机,页面大小为 1Gi:

    kind: VirtualMachine
    ...
    spec:
      domain:
        resources:
          requests:
            memory: "4Gi" 1
        memory:
          hugepages:
            pageSize: "1Gi" 2
    ...
    1
    为虚拟机请求的总内存量。这个值必须可以被按页大小整除。
    2
    每个巨页的大小。x86_64 架构的有效值为 1Gi2Mi。页面大小必须小于请求的内存。
  2. 应用虚拟机配置:

    $ oc apply -f <virtual_machine>.yaml

8.15.8. 为虚拟机启用专用资源

要提高性能,您可以将节点的资源(如 CPU)专用于特定的一个虚拟机。

8.15.8.1. 关于专用资源

当为您的虚拟机启用专用资源时,您的工作负载将会在不会被其他进程使用的 CPU 上调度。通过使用专用资源,您可以提高虚拟机性能以及延迟预测的准确性。

8.15.8.2. 先决条件
  • 节点上必须配置 CPU Manager。在调度虚拟机工作负载前,请确认节点具有 cpumanager = true 标签。
  • 虚拟机必须关机。
8.15.8.3. 为虚拟机启用专用资源

您可以在 Details 选项卡中为虚拟机启用专用资源。从红帽模板创建的虚拟机可以使用专用资源进行配置。

流程

  1. 在 OpenShift Container Platform 控制台中,从侧边菜单中点 VirtualizationVirtualMachines
  2. 选择虚拟机以打开 VirtualMachine 详情页面。
  3. Scheduling 选项卡中,点 Dedicated Resources 旁边的铅笔图标。
  4. 选择 Schedule this workload with dedicated resources (guaranteed policy)
  5. Save

8.15.9. 调度虚拟机

在确保虚拟机的 CPU 模型和策略属性与节点支持的 CPU 模型和策略属性兼容的情况下,可在节点上调度虚拟机(VM)。

8.15.9.1. 策略属性

您可以指定策略属性和在虚拟机调度到节点上时匹配的 CPU 功能来调度虚拟机(VM)。为虚拟机指定的策略属性决定了如何在节点上调度该虚拟机。

策略属性描述

force

VM 被强制调度到某个节点上。即使主机 CPU 不支持虚拟机的 CPU,也是如此。

require

在虚拟机没有使用特定 CPU 模型和功能规格配置时,应用于虚拟机的默认策略。如果节点没有配置为支持使用此默认策略属性或其他策略属性的 CPU 节点发现,则虚拟机不会调度到该节点上。主机 CPU 必须支持虚拟机的 CPU,或者虚拟机监控程序必须可以模拟支持的 CPU 模型。

optional

如果主机物理机器 CPU 支持该虚拟机,则虚拟机会被添加到节点。

disable

无法通过 CPU 节点发现调度虚拟机。

forbid

即使主机 CPU 支持该功能,且启用了 CPU 节点发现,也不会调度虚拟机。

8.15.9.2. 设置策略属性和 CPU 功能

您可以为每个虚拟机(VM)设置策略属性和 CPU 功能,以确保根据策略和功能在节点上调度该功能。验证您设置的 CPU 功能以确保主机 CPU 支持或者虚拟机监控程序模拟该功能。

流程

  • 编辑虚拟机配置文件的 domain spec。以下示例设置虚拟机 (VM) 的 CPU 功能和 require 策略:

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: myvm
    spec:
      template:
        spec:
          domain:
            cpu:
              features:
                - name: apic 1
                  policy: require 2
    1
    虚拟机的 CPU 功能名称。
    2
    虚拟机的策略属性.
8.15.9.3. 使用支持的 CPU 型号调度虚拟机

您可以为虚拟机 (VM) 配置 CPU 模型,将其调度到支持其 CPU 模型的节点。

流程

  • 编辑虚拟机配置文件的 domain spec。以下示例显示了为虚拟机定义的特定 CPU 模型:

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: myvm
    spec:
      template:
        spec:
          domain:
            cpu:
              model: Conroe 1
    1
    虚拟机的 CPU 模型.
8.15.9.4. 使用主机模型调度虚拟机

当将虚拟机(VM)的 CPU 模型设置为 host-model 时,虚拟机会继承调度节点的 CPU 模型。

流程

  • 编辑虚拟机配置文件的 domain spec。以下示例演示了为虚拟机指定 host-model

    apiVersion: kubevirt/v1alpha3
    kind: VirtualMachine
    metadata:
      name: myvm
    spec:
      template:
        spec:
          domain:
            cpu:
              model: host-model 1
    1
    继承调度节点的 CPU 模型的虚拟机。

8.15.10. 配置 PCI 透传

借助 Peripheral Component Interconnect(PCI)透传功能,您可以从虚拟机访问和管理硬件设备。配置 PCI 透传后,PCI 设备的功能就如同它们实际上附加到客户机操作系统上一样。

集群管理员可以使用 oc CLI 来公开和管理集群中允许在集群中使用的主机设备。

8.15.10.1. 关于为 PCI 透传准备主机设备

要使用 CLI 为 PCI 透传准备主机设备,请创建一个 MachineConfig 对象并添加内核参数,以启用输入输出内存管理单元(IOMMU)。将 PCI 设备绑定到虚拟功能 I/O(VFIO)驱动程序,然后通过编辑 HyperConverged 自定义资源(CR)的 allowedHostDevices 字段在集群中公开它。首次安装 OpenShift Virtualization Operator 时,allowedHostDevices 列表为空。

要使用 CLI 从集群中删除 PCI 主机设备,可从 HyperConverged CR 中删除 PCI 设备信息。

8.15.10.1.1. 添加内核参数以启用 IOMMU 驱动程序

要在内核中启用 IOMMU(Input-Output Memory Management Unit)驱动程序,请创建 MachineConfig 对象并添加内核参数。

先决条件

  • 正常运行的 OpenShift 容器平台集群的管理特权。
  • Intel 或 AMD CPU 硬件。
  • 启用用于直接 I/O 扩展的 Intel 虚拟化技术或 BIOS 中的 AMD IOMMU(基本输入/输出系统)。

流程

  1. 创建用于标识内核参数的 MachineConfig 对象。以下示例显示了 Intel CPU 的内核参数。

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: worker 1
      name: 100-worker-iommu 2
    spec:
      config:
        ignition:
          version: 3.2.0
      kernelArguments:
          - intel_iommu=on 3
    ...
    1
    仅将新内核参数应用到 worker 节点。
    2
    name 表示此内核参数(100)在机器配置及其目的中的排名。如果您有 AMD CPU,请将内核参数指定为 amd_iommu=on
    3
    将内核参数标识为 Intel CPU 的 intel_iommu
  2. 创建新的 MachineConfig 对象:

    $ oc create -f 100-worker-kernel-arg-iommu.yaml

验证

  • 验证是否添加了新的 MachineConfig 对象。

    $ oc get MachineConfig
8.15.10.1.2. 将 PCI 设备绑定到 VFIO 驱动程序

要将 PCI 设备绑定到 VFIO(虚拟功能 I/O)驱动程序,请从每个设备获取 vendor-IDdevice-ID 的值,并创建值的列表。将这个列表添加到 MachineConfig 对象。MachineConfig Operator 在带有 PCI 设备的节点上生成 /etc/modprobe.d/vfio.conf,并将 PCI 设备绑定到 VFIO 驱动程序。

先决条件

  • 您添加了内核参数来为 CPU 启用 IOMMU。

流程

  1. 运行 lspci 命令,以获取 PCI 设备的 vendor-IDdevice-ID

    $ lspci -nnv | grep -i nvidia

    输出示例

    02:01.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 32GB] [10de:1eb8] (rev a1)

  2. 创建 Butane 配置文件 100-worker-vfiopci.bu,将 PCI 设备绑定到 VFIO 驱动程序。

    注意

    有关 Butane 的信息,请参阅"使用 Butane 创建机器配置"。

    示例

    variant: openshift
    version: 4.10.0
    metadata:
      name: 100-worker-vfiopci
      labels:
        machineconfiguration.openshift.io/role: worker 1
    storage:
      files:
      - path: /etc/modprobe.d/vfio.conf
        mode: 0644
        overwrite: true
        contents:
          inline: |
            options vfio-pci ids=10de:1eb8 2
      - path: /etc/modules-load.d/vfio-pci.conf 3
        mode: 0644
        overwrite: true
        contents:
          inline: vfio-pci

    1
    仅将新内核参数应用到 worker 节点。
    2
    指定之前确定的 vendor-ID 值(10de)和 device-ID 值(1eb8)来将单个设备绑定到 VFIO 驱动程序。您可以使用其供应商和设备信息添加多个设备列表。
    3
    在 worker 节点上载入 vfio-pci 内核模块的文件。
  3. 使用 Butane 生成 MachineConfig 对象文件 100-worker-vfiopci.yaml,包含要发送到 worker 节点的配置:

    $ butane 100-worker-vfiopci.bu -o 100-worker-vfiopci.yaml
  4. MachineConfig 对象应用到 worker 节点:

    $ oc apply -f 100-worker-vfiopci.yaml
  5. 验证 MachineConfig 对象是否已添加。

    $ oc get MachineConfig

    输出示例

    NAME                             GENERATEDBYCONTROLLER                      IGNITIONVERSION  AGE
    00-master                        d3da910bfa9f4b599af4ed7f5ac270d55950a3a1   3.2.0            25h
    00-worker                        d3da910bfa9f4b599af4ed7f5ac270d55950a3a1   3.2.0            25h
    01-master-container-runtime      d3da910bfa9f4b599af4ed7f5ac270d55950a3a1   3.2.0            25h
    01-master-kubelet                d3da910bfa9f4b599af4ed7f5ac270d55950a3a1   3.2.0            25h
    01-worker-container-runtime      d3da910bfa9f4b599af4ed7f5ac270d55950a3a1   3.2.0            25h
    01-worker-kubelet                d3da910bfa9f4b599af4ed7f5ac270d55950a3a1   3.2.0            25h
    100-worker-iommu                                                            3.2.0            30s
    100-worker-vfiopci-configuration                                            3.2.0            30s

验证

  • 验证是否已加载 VFIO 驱动程序。

    $ lspci -nnk -d 10de:

    输出确认使用了 VFIO 驱动程序。

    输出示例

    04:00.0 3D controller [0302]: NVIDIA Corporation GP102GL [Tesla P40] [10de:1eb8] (rev a1)
            Subsystem: NVIDIA Corporation Device [10de:1eb8]
            Kernel driver in use: vfio-pci
            Kernel modules: nouveau

8.15.10.1.3. 使用 CLI 在集群中公开 PCI 主机设备

要在集群中公开 PCI 主机设备,将 PCI 设备的详细信息添加到 HyperConverged 自定义资源(CR)的 spec.permittedHostDevices.pciHostDevices 数组中。

流程

  1. 运行以下命令,在默认编辑器中编辑 HyperConverged CR:

    $ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv
  2. 将 PCI 设备信息添加到 spec.percommitHostDevices.pciHostDevices 数组。例如:

    配置文件示例

    apiVersion: hco.kubevirt.io/v1
    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
      namespace: openshift-cnv
    spec:
      permittedHostDevices: 1
        pciHostDevices: 2
        - pciDeviceSelector: "10DE:1DB6" 3
          resourceName: "nvidia.com/GV100GL_Tesla_V100" 4
        - pciDeviceSelector: "10DE:1EB8"
          resourceName: "nvidia.com/TU104GL_Tesla_T4"
        - pciDeviceSelector: "8086:6F54"
          resourceName: "intel.com/qat"
          externalResourceProvider: true 5
    ...

    1
    允许在集群中使用的主机设备。
    2
    节点上可用的 PCI 设备列表。
    3
    标识 PCI 设备所需的 vendor-IDdevice-ID
    4
    PCI 主机设备的名称。
    5
    可选:将此字段设置为 true 表示资源由外部设备插件提供。OpenShift Virtualization 允许在集群中使用这个设备,但会把分配和监控留给外部设备插件。
    注意

    上例代码片段显示有两个 PCI 主机设备,名为 nvidia.com/GV100GL_Tesla_V100nvidia.com/TU104GL_Tesla_Tesla_T4。它们被添加到 HyperConverged CR 中的允许主机设备列表中。这些设备已经过测试和验证以用于 OpenShift Virtualization。

  3. 保存更改并退出编辑器。

验证

  • 运行以下命令,验证 PCI 主机设备是否已添加到节点。示例输出显示,每个设备都与 nvidia.com/GV100GL_Tesla_V100nvidia.com/TU104GL_Tesla_T4intel.com/qat 资源名称关联。

    $ oc describe node <node_name>

    输出示例

    Capacity:
      cpu:                            64
      devices.kubevirt.io/kvm:        110
      devices.kubevirt.io/tun:        110
      devices.kubevirt.io/vhost-net:  110
      ephemeral-storage:              915128Mi
      hugepages-1Gi:                  0
      hugepages-2Mi:                  0
      memory:                         131395264Ki
      nvidia.com/GV100GL_Tesla_V100   1
      nvidia.com/TU104GL_Tesla_T4     1
      intel.com/qat:                  1
      pods:                           250
    Allocatable:
      cpu:                            63500m
      devices.kubevirt.io/kvm:        110
      devices.kubevirt.io/tun:        110
      devices.kubevirt.io/vhost-net:  110
      ephemeral-storage:              863623130526
      hugepages-1Gi:                  0
      hugepages-2Mi:                  0
      memory:                         130244288Ki
      nvidia.com/GV100GL_Tesla_V100   1
      nvidia.com/TU104GL_Tesla_T4     1
      intel.com/qat:                  1
      pods:                           250

8.15.10.1.4. 使用 CLI 从集群中删除 PCI 主机设备

要从集群中删除 PCI 主机设备,请从 HyperConverged 自定义资源(CR)中删除该设备的信息。

流程

  1. 运行以下命令,在默认编辑器中编辑 HyperConverged CR:

    $ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv
  2. 通过删除相应设备的 pciDeviceSelectorresourceNameexternalResourceProvider(如果适用)字段来从 spec.permittedHostDevices.pciHostDevices 阵列中删除 PCI 设备信息。在本例中,intel.com/qat 资源已被删除。

    配置文件示例

    apiVersion: hco.kubevirt.io/v1
    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
      namespace: openshift-cnv
    spec:
      permittedHostDevices:
        pciHostDevices:
        - pciDeviceSelector: "10DE:1DB6"
          resourceName: "nvidia.com/GV100GL_Tesla_V100"
        - pciDeviceSelector: "10DE:1EB8"
          resourceName: "nvidia.com/TU104GL_Tesla_T4"
    ...

  3. 保存更改并退出编辑器。

验证

  • 运行以下命令,验证 PCI 主机设备已从节点移除。示例输出显示,与 intel.com/qat 资源名称关联的设备为零。

    $ oc describe node <node_name>

    输出示例

    Capacity:
      cpu:                            64
      devices.kubevirt.io/kvm:        110
      devices.kubevirt.io/tun:        110
      devices.kubevirt.io/vhost-net:  110
      ephemeral-storage:              915128Mi
      hugepages-1Gi:                  0
      hugepages-2Mi:                  0
      memory:                         131395264Ki
      nvidia.com/GV100GL_Tesla_V100   1
      nvidia.com/TU104GL_Tesla_T4     1
      intel.com/qat:                  0
      pods:                           250
    Allocatable:
      cpu:                            63500m
      devices.kubevirt.io/kvm:        110
      devices.kubevirt.io/tun:        110
      devices.kubevirt.io/vhost-net:  110
      ephemeral-storage:              863623130526
      hugepages-1Gi:                  0
      hugepages-2Mi:                  0
      memory:                         130244288Ki
      nvidia.com/GV100GL_Tesla_V100   1
      nvidia.com/TU104GL_Tesla_T4     1
      intel.com/qat:                  0
      pods:                           250

8.15.10.2. 为 PCI 透传配置虚拟机

将 PCI 设备添加到集群中后,您可以将它们分配到虚拟机。PCI 设备现在可用。就像它们被物理地连接到虚拟机一样。

8.15.10.2.1. 为虚拟机分配 PCI 设备

当集群中有 PCI 设备时,您可以将其分配到虚拟机并启用 PCI 透传。

流程

  • 将 PCI 设备分配到虚拟机作为主机设备。

    示例

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    spec:
      domain:
        devices:
          hostDevices:
          - deviceName: nvidia.com/TU104GL_Tesla_T4 1
            name: hostdevices1

    1
    集群中作为主机设备允许的 PCI 设备的名称。虚拟机可以访问此主机设备。

验证

  • 使用以下命令,验证主机设备可从虚拟机使用。

    $ lspci -nnk | grep NVIDIA

    输出示例

    $ 02:01.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 32GB] [10de:1eb8] (rev a1)

8.15.10.3. 其他资源

8.15.11. 配置 vGPU 透传

您的虚拟机可以访问虚拟 GPU(vGPU)硬件。通过为虚拟机分配 vGPU,您可以执行以下操作:

  • 访问底层硬件的 GPU 以达到虚拟机中的高性能优势。
  • 简化资源密集型 I/O 操作。
重要

vGPU 透传只能分配给连接到裸机环境中运行的集群的设备。

8.15.11.1. 为虚拟机分配 vGPU 透传设备

使用 OpenShift Container Platform web 控制台为虚拟机分配 vGPU 透传设备。

先决条件

  • 必须停止虚拟机。

流程

  1. 在 OpenShift Container Platform web 控制台中,从侧边菜单中点 Virtualization → VirtualMachines
  2. 选择您要为其分配该设备的虚拟机。
  3. Details 标签页中,点 GPU 设备

    如果将 vGPU 设备添加为主机设备,则无法使用 VNC 控制台访问该设备。

  4. Add GPU 设备,输入名称并从设备名称列表中选择 设备
  5. 点击 Save
  6. YAML 选项卡,验证 hostDevices 部分中的新设备是否已添加到集群配置中。
注意

您可以将硬件设备添加到从自定义模板或 YAML 文件创建的虚拟机中。您不能将设备添加到特定操作系统的预先提供的引导源模板,如 Windows 10 或 RHEL 7。

要显示连接到集群的资源,请从侧边菜单中点 ComputeHardware Devices

8.15.11.2. 其他资源

8.15.12. 配置介质设备

如果您在 HyperConverged 自定义资源(CR)中提供设备列表,OpenShift Virtualization 会自动创建介质设备,如虚拟 GPU(vGPU)。

重要

介质(mediated)设备的声明配置只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

8.15.12.1. 关于使用 NVIDIA GPU Operator

NVIDIA GPU Operator 在 OpenShift Container Platform 集群中管理 NVIDIA GPU 资源,并自动执行与引导 GPU 节点相关的任务。由于 GPU 是集群中的一个特殊资源,因此您必须在将应用程序工作负载部署到 GPU 之前安装一些组件。这些组件包括 NVIDIA 驱动程序,启用计算统一设备架构(CUDA)、Kubernetes 设备插件、容器运行时等,如自动节点标签、监控等。

注意

NVIDIA GPU Operator 仅支持 NVIDIA。有关从 NVIDIA 获取支持的更多信息,请参阅 NVIDIA 支持

使用 OpenShift Container Platform OpenShift Virtualization 启用 GPU 有两种方法:这里介绍了 OpenShift Container Platform 原生方法,并使用 NVIDIA GPU Operator。

NVIDIA GPU Operator 是一个 Kubernetes Operator,它允许 OpenShift Container Platform OpenShift Virtualization 将 GPU 公开给在 OpenShift Container Platform 上运行的虚拟化工作负载。它允许用户轻松调配和管理启用了 GPU 的虚拟机,使他们能够在与其他工作负载相同的平台上运行复杂的人工智能/机器学习(AI/ML)工作负载。它还提供了一种简单的方式来扩展其基础架构的 GPU 容量,从而可以快速增长基于 GPU 的工作负载。

有关使用 NVIDIA GPU Operator 为运行 GPU 加速虚拟机置备 worker 节点的更多信息,请参阅使用 OpenShift Virtualization 的 NVIDIA GPU Operator

8.15.12.2. 关于在 OpenShift Virtualization 中使用虚拟 GPU

有些图形处理单元(GPU)卡支持创建虚拟 GPU(vGPU)。如果管理员在 HyperConverged 自定义资源(CR)中提供配置详情,则 OpenShift Virtualization 可以自动创建 vGPU 和其他介质设备。这个自动化对大型集群特别有用。

注意

有关功能和支持详情,请参考您的硬件供应商文档。

介质设备
划分为一个或多个虚拟设备的物理设备。vGPU 是一个介质设备(mdev)类型,物理 GPU 的性能会被划分到各个虚拟设备中。您可以将介质设备分配给一个或多个虚拟机(VM),但客户机数量必须与您的 GPU 兼容。有些 GPU 不支持多个虚拟机。
8.15.12.2.1. 先决条件
  • 如果您的硬件厂商提供驱动程序,您可以在要创建介质设备的节点上安装它们。

8.15.12.2.2. 配置概述

在配置介质设备时,管理员必须完成以下任务:

  • 创建介质设备。
  • 在集群中公开介质设备。

HyperConverged CR 包含可以实现这两个任务的 API。

创建介质设备

...
spec:
  mediatedDevicesConfiguration:
    mediatedDevicesTypes: 1
    - <device_type>
    nodeMediatedDeviceTypes: 2
    - mediatedDevicesTypes: 3
      - <device_type>
      nodeSelector: 4
        <node_selector_key>: <node_selector_value>
...

1
必需:为集群配置全局设置。
2
可选:覆盖特定节点或一组节点的全局配置。必须与全局 mediatedDevicesTypes 配置一起使用。
3
使用 nodeMediatedDeviceTypes 时需要此项。覆盖指定节点的全局 mediatedDevicesTypes 配置。
4
使用 nodeMediatedDeviceTypes 时需要此项。必须包含一个 key:value 对。

在集群中公开介质设备

...
  permittedHostDevices:
    mediatedDevices:
    - mdevNameSelector: GRID T4-2Q 1
      resourceName: nvidia.com/GRID_T4-2Q 2
...

1
公开映射到主机上这个值的介质设备。
注意

您可以通过 /sys/bus/pci/devices/<slot>:<bus>:<domain>.<function>/mdev_supported_types/<type>/name(使用您的具体系统信息替换相关部分)查看您的设备支持的介质设备类型。

例如,nvidia-231 类型的名称文件包含选择器字符串 GRID T4-2Q。使用 GRID T4-2Q 作为 mdevNameSelector 值,允许节点使用 nvidia-231 类型。

2
resourceName 应该与节点上分配的匹配。使用以下命令查找 resourceName
$ oc get $NODE -o json \
  | jq '.status.allocatable \
    | with_entries(select(.key | startswith("nvidia.com/"))) \
    | with_entries(select(.value != "0"))'
8.15.12.2.3. vGPU 如何分配给节点

对于每个物理设备,OpenShift Virtualization 配置以下值:

  • 单个 mdev 类型。
  • 所选 mdev 类型的最大实例数量。

集群架构会影响创建设备并分配到节点的方式。

每个节点具有多个卡的大型集群

在支持多个 vGPU 类型的节点上,以轮循方式创建相关设备类型。例如:

...
mediatedDevicesConfiguration:
  mediatedDevicesTypes:
  - nvidia-222
  - nvidia-228
  - nvidia-105
  - nvidia-108
...

在这种情况下,每个节点有两个卡,它们支持以下 vGPU 类型:

nvidia-105
...
nvidia-108
nvidia-217
nvidia-299
...

在每个节点上,OpenShift Virtualization 会创建以下 vGPU:

  • 在第一个卡上,16 个类型为 nvidia-105 的 vGPU。
  • 第二卡上的 2 个类型为 nvidia-108 的 vGPU。
一个节点有一个卡,它支持多个请求的 vGPU 类型

OpenShift Virtualization 使用最先在 mediatedDevicesTypes 列表中提供的支持类型。

例如,节点卡中的卡支持 nvidia-223nvidia-224。以下 mediatedDevicesTypes 列表已配置:

...
mediatedDevicesConfiguration:
  mediatedDevicesTypes:
  - nvidia-22
  - nvidia-223
  - nvidia-224
...

在本例中,OpenShift Virtualization 使用 nvidia-223 类型。

8.15.12.2.4. 关于更改和删除介质设备

集群的介质设备配置可使用 OpenShift Virtualization 更新:

  • 编辑 HyperConverged CR 并更改 mediatedDevicesTypes 小节的内容。
  • 更改与 nodeMediatedDeviceTypes 节点选择器匹配的节点标签。
  • HyperConverged CR 的 spec.mediatedDevicesConfigurationspec.permittedHostDevices 小节中删除设备信息。

    注意

    如果您在 spec.permittedHostDevices 小节中删除设备信息,且没有将其从 spec.mediatedDevicesConfiguration 小节中移除,则无法在同一节点上创建新的介质设备类型。要正确删除介质设备,请从两个段中删除设备信息。

根据具体更改,这些操作会导致 OpenShift Virtualization 重新配置介质设备或从集群节点中删除它们。

8.15.12.2.5. 为介质设备准备主机

在配置介质设备前,您必须启用输入输出内存管理单元 (IOMMU) 驱动程序。

8.15.12.2.5.1. 添加内核参数以启用 IOMMU 驱动程序

要在内核中启用 IOMMU(Input-Output Memory Management Unit)驱动程序,请创建 MachineConfig 对象并添加内核参数。

先决条件

  • 正常运行的 OpenShift 容器平台集群的管理特权。
  • Intel 或 AMD CPU 硬件。
  • 启用用于直接 I/O 扩展的 Intel 虚拟化技术或 BIOS 中的 AMD IOMMU(基本输入/输出系统)。

流程

  1. 创建用于标识内核参数的 MachineConfig 对象。以下示例显示了 Intel CPU 的内核参数。

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: worker 1
      name: 100-worker-iommu 2
    spec:
      config:
        ignition:
          version: 3.2.0
      kernelArguments:
          - intel_iommu=on 3
    ...
    1
    仅将新内核参数应用到 worker 节点。
    2
    name 表示此内核参数(100)在机器配置及其目的中的排名。如果您有 AMD CPU,请将内核参数指定为 amd_iommu=on
    3
    将内核参数标识为 Intel CPU 的 intel_iommu
  2. 创建新的 MachineConfig 对象:

    $ oc create -f 100-worker-kernel-arg-iommu.yaml

验证

  • 验证是否添加了新的 MachineConfig 对象。

    $ oc get MachineConfig
8.15.12.2.6. 添加和删除介质设备

您可以添加或删除介质设备。

8.15.12.2.6.1. 创建并公开介质设备

您可以通过编辑 HyperConverged 自定义资源(CR)来公开和创建介质设备,如虚拟 GPU(vGPU)。

先决条件

  • 已启用 IOMMU(Input-Output Memory Management Unit)驱动程序。

流程

  1. 运行以下命令,在默认编辑器中编辑 HyperConverged CR:

    $ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv
  2. 将介质设备信息添加到 HyperConverged CR spec 中,确保包含 mediatedDevicesConfiguration 和 allowed HostDevices 小节。例如:

    配置文件示例

    apiVersion: hco.kubevirt.io/v1
    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
      namespace: openshift-cnv
    spec:
      mediatedDevicesConfiguration: <.>
        mediatedDevicesTypes: <.>
        - nvidia-231
        nodeMediatedDeviceTypes: <.>
        - mediatedDevicesTypes: <.>
          - nvidia-233
          nodeSelector:
            kubernetes.io/hostname: node-11.redhat.com
      permittedHostDevices: <.>
        mediatedDevices:
        - mdevNameSelector: GRID T4-2Q
          resourceName: nvidia.com/GRID_T4-2Q
        - mdevNameSelector: GRID T4-8Q
          resourceName: nvidia.com/GRID_T4-8Q
    ...

    <.> 创建介质设备。<.> 必需: 全局 mediatedDevicesTypes 配置。<.> 可选:覆盖特定节点的全局配置。<.> 如果使用 nodeMediatedDeviceTypes 是必需的。<.> 向集群公开介质设备。

  3. 保存更改并退出编辑器。

验证

  • 您可以运行以下命令来验证设备是否已添加到特定节点:

    $ oc describe node <node_name>
8.15.12.2.6.2. 使用 CLI 从集群中删除介质设备

要从集群中删除介质设备,请从 HyperConverged 自定义资源(CR)中删除该设备的信息。

流程

  1. 运行以下命令,在默认编辑器中编辑 HyperConverged CR:

    $ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv
  2. HyperConverged CR 的 spec.mediatedDevicesConfigurationspec.permittedHostDevices 小节中删除设备信息。删除这两个条目可确保您稍后在同一节点上创建新的介质设备类型。例如:

    配置文件示例

    apiVersion: hco.kubevirt.io/v1
    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
      namespace: openshift-cnv
    spec:
      mediatedDevicesConfiguration:
        mediatedDevicesTypes: 1
          - nvidia-231
      permittedHostDevices:
        mediatedDevices: 2
        - mdevNameSelector: GRID T4-2Q
          resourceName: nvidia.com/GRID_T4-2Q

    1
    要删除 nvidia-231 设备类型,请从 mediatedDevicesTypes 阵列中删除它。
    2
    要删除 GRID T4-2Q 设备,请删除 mdevNameSelector 字段及其对应的 resourceName 字段。
  3. 保存更改并退出编辑器。
8.15.12.3. 使用介质设备

vGPU 是介质设备的类型;物理 GPU 的性能被划分到虚拟设备中。您可以将介质设备分配给一个或多个虚拟机。

8.15.12.3.1. 为虚拟机分配介质设备

为虚拟机分配介质设备,如虚拟 GPU(vGPU)。

先决条件

  • 介质设备在 HyperConverged 自定义资源中配置。

流程

  • 通过编辑 VirtualMachine 清单的 spec.domain.devices.gpus 小节,将介质设备分配给虚拟机(VM):

    虚拟机清单示例

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    spec:
      domain:
        devices:
          gpus:
          - deviceName: nvidia.com/TU104GL_Tesla_T4 1
            name: gpu1 2
          - deviceName: nvidia.com/GRID_T4-1Q
            name: gpu2

    1
    与介质设备关联的资源名称。
    2
    用于标识虚拟机上设备的名称。

验证

  • 要验证该设备在虚拟机中可用,运行以下命令,将 <device_name> 替换为 VirtualMachine 清单中的 deviceName 值:

    $ lspci -nnk | grep <device_name>
8.15.12.4. 其他资源

8.15.13. 配置 watchdog

通过为 watchdog 设备配置虚拟机(VM)、安装 watchdog 并启动 watchdog 服务来公开 watchdog。

8.15.13.1. 先决条件
  • 虚拟机必须具有对 i6300esb watchdog 设备的内核支持。Red Hat Enterprise Linux (RHEL) 镜像支持 i6300esb
8.15.13.2. 定义 watchdog 设备

定义在操作系统(OS)没有响应时 watchdog 如何进行处理。

表 8.4. 可能的操作

poweroff

虚拟机(VM)立即关闭。如果 spec.running 设为 true,或者 spec.runStrategy 没有设置为 manual,则 VM 会重启。

reset

虚拟机将进行重启,客户机操作系统无法响应。由于客户机操作系统重启所需一定的时间完成,可能会导致存活度探测超时,因此不建议使用这个选项。如果集群级别的保护发现存活度探测失败并强制重新调度存活度探测,则此超时可以延长虚拟机重启所需的时间。

shutdown

虚拟机通过停止所有服务来正常关闭电源。

流程

  1. 创建包含以下内容的 YAML 文件:

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      labels:
        kubevirt.io/vm: vm2-rhel84-watchdog
      name: <vm-name>
    spec:
      running: false
      template:
        metadata:
         labels:
            kubevirt.io/vm: vm2-rhel84-watchdog
        spec:
          domain:
            devices:
              watchdog:
                name: <watchdog>
                i6300esb:
                  action: "poweroff" 1
    ...
    1
    指定 watchdog 操作(poweroffresetshutdown)。

    上面的示例使用 poweroff 操作配置 RHEL8 虚拟机上的 i6300esb watchdog 设备,并将设备公开为 /dev/watchdog

    现在,watchdog 二进制文件可以使用这个设备。

  2. 运行以下命令,将 YAML 文件应用到集群:

    $ oc apply -f <file_name>.yaml
重要

此流程仅用于测试 watchdog 功能,且不得在生产环境中运行。

  1. 运行以下命令来验证虚拟机是否已连接到 watchdog 设备:

    $ lspci | grep watchdog -i
  2. 运行以下命令之一以确认 watchdog 处于活跃状态:

    • 触发内核 panic:

      # echo c > /proc/sysrq-trigger
    • 终止 watchdog 服务:

      # pkill -9 watchdog
8.15.13.3. 安装 watchdog 设备

在虚拟机上安装 watchdog 软件包,再启动 watchdog 服务。

流程

  1. 作为 root 用户,安装 watchdog 软件包和依赖项:

    # yum install watchdog
  2. /etc/watchdog.conf 文件中取消注释以下行,并保存更改:

    #watchdog-device = /dev/watchdog
  3. 在引导时启用 watchdog 服务:

    # systemctl enable --now watchdog.service
8.15.13.4. 其他资源

8.15.14. 自动导入和更新预定义的引导源

您可以使用 系统定义的 引导源(包括在 OpenShift Virtualization 中),或使用您自己创建的用户定义的引导源。系统定义的引导源导入和更新由产品功能门控制。您可以使用功能门启用、禁用或重新启用更新。用户定义的引导源不受产品功能门控制,需要单独管理自动导入和更新。

重要

您必须设置一个默认存储类来自动导入和更新引导源。

8.15.14.1. 启用自动引导源更新

如果您已在 OpenShift Virtualization 4.9 中预定义的引导源,则必须手动选择它们到自动引导源更新。OpenShift Virtualization 4.10 及之后的版本中的所有预定义的引导源都会被默认自动更新。

流程

  • 使用以下命令将 dataImportCron 标签应用到数据源:

    $ oc label --overwrite DataSource rhel8 -n openshift-virtualization-os-images cdi.kubevirt.io/dataImportCron=true
8.15.14.2. 禁用自动引导源更新

您可以减少在断开连接的环境中的日志数量,或通过禁用预定义的引导源自动更新来减少资源使用量。将 HyperConverged 自定义资源(CR)中的 spec.featureGates.enableCommonBootImageImport 字段设置为 false

注意

自定义引导源不受此设置的影响。

流程

  • 使用以下命令禁用自动更新:

    $ oc patch hco kubevirt-hyperconverged -n openshift-cnv --type json -p '[{"op": "replace", "path": "/spec/featureGates/enableCommonBootImageImport", "value": false}]'
8.15.14.3. 重新启用自动引导源更新

如果您之前禁用了自动引导源更新,您必须手动重新启用该功能。将 HyperConverged 自定义资源(CR)中的 spec.featureGates.enableCommonBootImageImport 字段设置为 true

流程

  • 使用以下命令重新启用自动更新:

    $ oc patch hco kubevirt-hyperconverged -n openshift-cnv --type json -p '[{"op": "replace", "path": "/spec/featureGates/enableCommonBootImageImport", "value": true}]'
8.15.14.4. 在自定义引导源中启用自动更新

OpenShift Virtualization 默认自动更新预定义的引导源,但不会自动更新自定义引导源。您必须通过编辑 HyperConverged 自定义资源(CR)在任何自定义引导源上手动启用自动导入和更新。

流程

  1. 使用以下命令打开 HyperConverged CR 进行编辑:

    $ oc edit -n openshift-cnv HyperConverged
  2. 编辑 HyperConverged CR,在 dataImportCronTemplates 部分指定适当的模板和引导源。例如:

    CentOS 7 中的示例

    apiVersion: hco.kubevirt.io/v1beta1
    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
    spec:
      dataImportCronTemplates:
      - metadata:
          name: centos7-image-cron
          annotations:
            cdi.kubevirt.io/storage.bind.immediate.requested: "true" 1
        spec:
          schedule: "0 */12 * * *" 2
          template:
            spec:
              source:
                registry: 3
                  url: docker://quay.io/containerdisks/centos:7-2009
              storage:
                resources:
                  requests:
                    storage: 10Gi
          managedDataSource: centos7 4
          retentionPolicy: "None" 5

    1
    对于将 volumeBindingMode 设置为 WaitForFirstConsumer 的存储类来说,这个注解是必需的。
    2
    以 cron 格式指定的作业调度计划。
    3
    用于从 registry 源创建数据卷。使用默认 pod pullMethod 而不是 节点 pullMethod,这基于 节点 docker 缓存。当 registry 镜像通过 Container.Image 可用时,节点 docker 缓存很有用,但 CDI 导入程序没有授权访问它。
    4
    要使自定义镜像被检测到为可用的引导源,镜像的 managedDataSource 的名称必须与模板的 DataSource 的名称匹配,它在 VM 模板 YAML 文件中的 spec.dataVolumeTemplates.spec.sourceRef.name 下找到。
    5
    在删除 cron 作业时,使用 All 来保留数据卷和数据源。删除 cron 作业时,使用 None 删除数据卷和数据源。

8.15.15. 在虚拟机上启用 descheduler 驱除

您可以使用 descheduler 来驱除 pod,以便可将 pod 重新调度到更合适的节点上。如果 pod 是虚拟机,pod 驱除会导致虚拟机实时迁移到另一节点。

重要

虚拟机的 descheduler 驱除功能只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

8.15.15.1. Descheduler 配置集

使用技术预览 DevPreviewLifecycle 配置集为虚拟机启用 descheduler。这是当前可用于 OpenShift Virtualization 的 descheduler 配置集。为确保正确调度,请创建带有 CPU 和内存请求的虚拟机用于预期的负载。

DevPreviewLongLifecycle

此配置集在节点间平衡资源使用量并启用以下策略:

  • RemovePodsHavingTooManyRestarts :删除其容器重启次数太多的 pod,以及其中所有容器(包括 Init 容器)重启的总数超过 100 的 pod。重启虚拟机客户端操作系统不会增加这个计数。
  • LowNodeUtilization :在存在没有被充分利用的节点时,将 pod 从过度使用的节点上驱除。被驱除的 pod 的目标节点将由调度程序决定。

    • 如果节点的用量低于 20%(CPU、内存和 pod 的数量),则该节点将被视为使用率不足。
    • 如果节点的用量超过 50%(CPU、内存和 pod 的数量),则该节点将被视为过量使用。
8.15.15.2. 安装 descheduler

在默认情况下,不提供 descheduler。要启用 descheduler,您必须从 OperatorHub 安装 Kube Descheduler Operator,并启用一个或多个 descheduler 配置集。

先决条件

  • 必须具有集群管理员权限。
  • 访问 OpenShift Container Platform Web 控制台。

流程

  1. 登陆到 OpenShift Container Platform Web 控制台。
  2. 为 Kube Descheduler Operator 创建所需的命名空间。

    1. 进行 AdministrationNamespaces,点 Create Namespace
    2. Name 字段中输入 openshift-kube-descheduler-operator,在 Labels 字段中输入 openshift.io/cluster-monitoring=true 来启用 descheduler 指标,然后点击 Create
  3. 安装 Kube Descheduler Operator。

    1. 进入 OperatorsOperatorHub
    2. 在过滤框中输入 Kube Descheduler Operator
    3. 选择 Kube Descheduler Operator 并点 Install
    4. Install Operator 页面中,选择 A specific namespace on the cluster。从下拉菜单中选择 openshift-kube-descheduler-operator
    5. Update ChannelApproval Strategy 的值调整为所需的值。
    6. 点击 Install
  4. 创建 descheduler 实例。

    1. OperatorsInstalled Operators 页面中,点 Kube Descheduler Operator
    2. 选择 Kube Descheduler 标签页并点 Create KubeDescheduler
    3. 根据需要编辑设置。

      1. 展开 Profiles 部分,再选择 DevPreviewLongLifecycleAffinityAndTaints 配置集默认为启用。

        重要

        当前仅适用于 OpenShift Virtualization 的配置集是 DevPreviewLongLifecycle

您还可以稍后使用 OpenShift CLI(oc)为 descheduler 配置配置集和设置。

8.15.15.3. 在虚拟机(VM)上启用 descheduler 驱除

安装 descheduler 后,您可以通过在 VirtualMachine 自定义资源(CR)中添加注解来在虚拟机上启用 descheduler 驱除。

先决条件

  • 在 OpenShift Container Platform Web 控制台或 OpenShift CLI(oc)中安装 descheduler。
  • 确保虚拟机没有运行。

流程

  1. 在启动虚拟机前,将 descheduler.alpha.kubernetes.io/evict 注解添加到 VirtualMachine CR:

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    spec:
      template:
        metadata:
          annotations:
            descheduler.alpha.kubernetes.io/evict: "true"
  2. 如果您还没有在安装过程中在 web 控制台中设置 DevPreviewLongLifecycle 配置集,请在 KubeDescheduler 对象的 spec.profile 部分指定 DevPreviewLongLifecycle

    apiVersion: operator.openshift.io/v1
    kind: KubeDescheduler
    metadata:
      name: cluster
      namespace: openshift-kube-descheduler-operator
    spec:
      deschedulingIntervalSeconds: 3600
      profiles:
      - DevPreviewLongLifecycle

现在在虚拟机上启用了 descheduler。

8.15.15.4. 其他资源

8.16. 导入虚拟机

8.16.1. 数据卷导入的 TLS 证书

8.16.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.16.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.16.2. 使用数据卷导入虚拟机镜像

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

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

重要

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

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

8.16.2.1. 先决条件
8.16.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.16.2.3. 关于数据卷

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

8.16.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: 180
          volumes:
          - dataVolume:
              name: fedora-dv
            name: datavolumedisk1
    status: {}
    1
    指定虚拟机的名称。
    2
    指定数据卷的名称。
    3
    为 HTTP 或 HTTPS 端点指定 http。为从 registry 导入的容器磁盘镜像指定 registry。
    4
    指定您要导入的虚拟机镜像的 URL 或 registry 端点。本例引用了 HTTPS 端点上的虚拟机镜像。容器镜像仓库端点示例为 url: "docker://kubevirt/fedora-cloud-container-disk-demo:latest"
    5
    如果为数据源创建 Secret,请指定 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.16.2.5. 其他资源

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

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

重要

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

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

8.16.3.1. 先决条件
8.16.3.2. 关于数据卷

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

8.16.3.3. 关于块持久性卷

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

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

8.16.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.16.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,请指定 Secret 名称。
    5
    对于已知的存储置备程序,会自动检测到卷模式和访问模式。否则,指定 Block
  4. 创建数据卷来导入虚拟机镜像:

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

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

8.16.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.16.3.7. 其他资源

8.17. 克隆虚拟机

8.17.1. 启用用户权限跨命名空间克隆数据卷

命名空间的隔离性质意味着用户默认无法在命名空间之间克隆资源。

要让用户将虚拟机克隆到另一个命名空间,具有 cluster-admin 角色的用户必须创建新的集群角色。将此集群角色绑定到用户,以便其将虚拟机克隆到目标命名空间。

8.17.1.1. 先决条件
  • 只有具有 cluster-admin 角色的用户才能创建集群角色。
8.17.1.2. 关于数据卷

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

8.17.1.3. 创建用于克隆数据卷的 RBAC 资源

创建一个新的集群角色,为 datavolumes 资源的所有操作启用权限。

流程

  1. 创建 ClusterRole 清单:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: <datavolume-cloner> 1
    rules:
    - apiGroups: ["cdi.kubevirt.io"]
      resources: ["datavolumes/source"]
      verbs: ["*"]
    1
    集群角色的唯一名称。
  2. 在集群中创建集群角色:

    $ oc create -f <datavolume-cloner.yaml> 1
    1
    上一步中创建的 ClusterRole 清单的文件名。
  3. 创建应用于源和目标命名空间的 RoleBinding 清单,并引用上一步中创建的集群角色。

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: <allow-clone-to-user> 1
      namespace: <Source namespace> 2
    subjects:
    - kind: ServiceAccount
      name: default
      namespace: <Destination namespace> 3
    roleRef:
      kind: ClusterRole
      name: datavolume-cloner 4
      apiGroup: rbac.authorization.k8s.io
    1
    角色绑定的唯一名称。
    2
    源数据卷的命名空间。
    3
    数据卷克隆到的命名空间。
    4
    上一步中创建的集群角色的名称。
  4. 在集群中创建角色绑定:

    $ oc create -f <datavolume-cloner.yaml> 1
    1
    上一步中创建的 RoleBinding 清单的文件名。

8.17.2. 将虚拟机磁盘克隆到新数据卷中

您可以通过引用数据卷配置文件中的源 PVC 来将虚拟机磁盘的持久性卷声明(PVC)克隆到新数据卷中。

警告

支持在不同卷模式间克隆操作,比如从带有 volumeMode: Block 的持久性卷(PV)克隆到带有 volumeMode: Filesystem 的 PV。

但是,只有在不同的卷模式中存在contentType: kubevirt 时才可以克隆它们。

提示

当您全局启用预分配或单个数据卷时,Containerized Data Importer(CDI)会在克隆过程中预分配磁盘空间。预分配可提高写入性能。如需更多信息,请参阅对数据卷使用预分配

8.17.2.1. 先决条件
  • 用户需要额外权限才能将虚拟机磁盘的 PVC 克隆到另一个命名空间中。
8.17.2.2. 关于数据卷

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

8.17.2.3. 将虚拟机磁盘的持久性卷声明克隆到新数据卷中

您可以将现有虚拟机磁盘的持久性卷声明(PVC)克隆到新数据卷中。新的数据卷可用于新虚拟机。

注意

当独立于虚拟机创建数据卷时,数据卷的生命周期与虚拟机是独立的。如果删除了虚拟机,数据卷及其相关 PVC 都不会被删除。

先决条件

  • 确定要使用的现有虚拟机磁盘的 PVC。克隆之前,必须关闭与 PVC 关联的虚拟机。
  • 安装 OpenShift CLI(oc)。

流程

  1. 检查您要克隆的虚拟机磁盘,以识别关联 PVC 的名称和命名空间。
  2. 为数据卷创建一个 YAML 文件,用于指定新数据卷的名称、源 PVC 的名称和命名空间,以及新数据卷的大小。

    例如:

    apiVersion: cdi.kubevirt.io/v1beta1
    kind: DataVolume
    metadata:
      name: <cloner-datavolume> 1
    spec:
      source:
        pvc:
          namespace: "<source-namespace>" 2
          name: "<my-favorite-vm-disk>" 3
      pvc:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: <2Gi> 4
    1
    新数据卷的名称。
    2
    源 PVC 所在的命名空间。
    3
    源 PVC 的名称。
    4
    新数据卷的大小。您必须分配足够空间,否则克隆操作会失败。其大小不得低于源 PVC。
  3. 通过创建数据卷开始克隆 PVC:

    $ oc create -f <cloner-datavolume>.yaml
    注意

    在 PVC 就绪前,DataVolume 会阻止虚拟机启动,以便您可以在 PVC 克隆期间创建引用新数据卷的虚拟机。

8.17.2.4. 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*

✓ 支持的操作

□ 不支持的操作

* 需要涂销空间

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

8.17.3. 使用数据卷模板克隆虚拟机

您可以通过克隆现有虚拟机的持久性卷声明(PVC)来创建新虚拟机。在虚拟机配置文件中包括 dataVolumeTemplate,即可从原始 PVC 创建新数据卷。

警告

支持在不同卷模式间克隆操作,比如从带有 volumeMode: Block 的持久性卷(PV)克隆到带有 volumeMode: Filesystem 的 PV。

但是,只有在不同的卷模式中存在contentType: kubevirt 时才可以克隆它们。

提示

当您全局启用预分配或单个数据卷时,Containerized Data Importer(CDI)会在克隆过程中预分配磁盘空间。预分配可提高写入性能。如需更多信息,请参阅对数据卷使用预分配

8.17.3.1. 先决条件
  • 用户需要额外权限才能将虚拟机磁盘的 PVC 克隆到另一个命名空间中。
8.17.3.2. 关于数据卷

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

8.17.3.3. 使用数据卷模板从克隆的持久性卷声明创建新虚拟机

您可以创建一个虚拟机,将现有虚拟机的持久性卷声明(PVC)克隆到数据卷中。在虚拟机清单中引用 dataVolumeTemplate,并将 PVC 克隆到数据卷中,然后自动用于创建虚拟机。

注意

当作为虚拟机的数据卷模板创建数据卷时,数据卷的生命周期依赖于虚拟机。如果删除了虚拟机,数据卷和相关 PVC 也会被删除。

先决条件

  • 确定要使用的现有虚拟机磁盘的 PVC。克隆之前,必须关闭与 PVC 关联的虚拟机。
  • 安装 OpenShift CLI(oc)。

流程

  1. 检查您要克隆的虚拟机,以识别关联 PVC 的名称和命名空间。
  2. VirtualMachine 对象创建 YAML 文件。以下虚拟机示例克隆 my-favorite-vm-disk,该磁盘位于 source-name 命名空间中。从my-favorite-vm-disk 创建的名为 favorite-clone2Gi 数据卷 。

    例如:

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      labels:
        kubevirt.io/vm: vm-dv-clone
      name: vm-dv-clone 1
    spec:
      running: false
      template:
        metadata:
          labels:
            kubevirt.io/vm: vm-dv-clone
        spec:
          domain:
            devices:
              disks:
              - disk:
                  bus: virtio
                name: root-disk
            resources:
              requests:
                memory: 64M
          volumes:
          - dataVolume:
              name: favorite-clone
            name: root-disk
      dataVolumeTemplates:
      - metadata:
          name: favorite-clone
        spec:
          storage:
            accessModes:
            - ReadWriteOnce
            resources:
              requests:
                storage: 2Gi
          source:
            pvc:
              namespace: "source-namespace"
              name: "my-favorite-vm-disk"
    1
    要创建的虚拟机。
  3. 使用 PVC 克隆的数据卷创建虚拟机:

    $ oc create -f <vm-clone-datavolumetemplate>.yaml
8.17.3.4. 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*

✓ 支持的操作

□ 不支持的操作

* 需要涂销空间

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

8.17.4. 将虚拟机磁盘克隆到新块存储数据卷中

您可以通过引用数据卷配置文件中的源 PVC 来将虚拟机磁盘的持久性卷声明(PVC)克隆到新的块数据卷中。

警告

支持在不同卷模式间克隆操作,比如从带有 volumeMode: Block 的持久性卷(PV)克隆到带有 volumeMode: Filesystem 的 PV。

但是,只有在不同的卷模式中存在contentType: kubevirt 时才可以克隆它们。

提示

当您全局启用预分配或单个数据卷时,Containerized Data Importer(CDI)会在克隆过程中预分配磁盘空间。预分配可提高写入性能。如需更多信息,请参阅对数据卷使用预分配

8.17.4.1. 先决条件
  • 用户需要额外权限才能将虚拟机磁盘的 PVC 克隆到另一个命名空间中。
8.17.4.2. 关于数据卷

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

8.17.4.3. 关于块持久性卷

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

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

8.17.4.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.17.4.5. 将虚拟机磁盘的持久性卷声明克隆到新数据卷中

您可以将现有虚拟机磁盘的持久性卷声明(PVC)克隆到新数据卷中。新的数据卷可用于新虚拟机。

注意

当独立于虚拟机创建数据卷时,数据卷的生命周期与虚拟机是独立的。如果删除了虚拟机,数据卷及其相关 PVC 都不会被删除。

先决条件

  • 确定要使用的现有虚拟机磁盘的 PVC。克隆之前,必须关闭与 PVC 关联的虚拟机。
  • 安装 OpenShift CLI(oc)。
  • 至少一个可用块持久性卷(PV)大小不低于源 PVC。

流程

  1. 检查您要克隆的虚拟机磁盘,以识别关联 PVC 的名称和命名空间。
  2. 为数据卷创建一个 YAML 文件,用于指定新数据卷的名称、源 PVC 的名称和命名空间、volumeMode: Block,以便使用可用块 PV,以及新数据卷的大小。

    例如:

    apiVersion: cdi.kubevirt.io/v1beta1
    kind: DataVolume
    metadata:
      name: <cloner-datavolume> 1
    spec:
      source:
        pvc:
          namespace: "<source-namespace>" 2
          name: "<my-favorite-vm-disk>" 3
      pvc:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: <2Gi> 4
        volumeMode: Block 5
    1
    新数据卷的名称。
    2
    源 PVC 所在的命名空间。
    3
    源 PVC 的名称。
    4
    新数据卷的大小。您必须分配足够空间,否则克隆操作会失败。其大小不得低于源 PVC。
    5
    指定目标为一个块 PV
  3. 通过创建数据卷开始克隆 PVC:

    $ oc create -f <cloner-datavolume>.yaml
    注意

    在 PVC 就绪前,DataVolume 会阻止虚拟机启动,以便您可以在 PVC 克隆期间创建引用新数据卷的虚拟机。

8.17.4.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*

✓ 支持的操作

□ 不支持的操作

* 需要涂销空间

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

8.18. 虚拟机网络

8.18.1. 为默认 pod 网络配置虚拟机

您可以通过将其网络接口配置为使用 masquerade 绑定模式,将虚拟机连接到默认的内部 pod 网络

注意

附加到默认 pod 网络的虚拟网络接口卡 (vNIC) 上的流量在实时迁移过程中中断。

8.18.1.1. 从命令行配置伪装模式

您可以使用伪装模式将虚拟机的外发流量隐藏在 pod IP 地址后。伪装模式使用网络地址转换 (NAT) 来通过 Linux 网桥将虚拟机连接至 pod 网络后端。

启用伪装模式,并通过编辑虚拟机配置文件让流量进入虚拟机。

先决条件

  • 虚拟机必须配置为使用 DHCP 来获取 IPv4 地址。以下示例配置为使用 DHCP。

流程

  1. 编辑虚拟机配置文件的 interfaces 规格:

    kind: VirtualMachine
    spec:
      domain:
        devices:
          interfaces:
            - name: default
              masquerade: {} 1
              ports: 2
                - port: 80
      networks:
      - name: default
        pod: {}
    1
    使用伪装模式进行连接。
    2
    可选:列出您要从虚拟机公开的端口,每个都由 port 字段指定。port 值必须是 0 到 65536 之间的数字。如果没有使用 port 数组,则有效范围内的所有端口都开放给传入流量。在本例中,端口 80 上允许传入的流量。
    注意

    端口 49152 和 49153 保留供 libvirt 平台使用,这些端口的所有其他传入流量将被丢弃。

  2. 创建虚拟机:

    $ oc create -f <vm-name>.yaml
8.18.1.2. 使用双栈(IPv4 和 IPv6)配置伪装模式

您可以使用 cloud-init 将新虚拟机配置为在默认 pod 网络上同时使用 IPv6 和 IPv4。

虚拟机实例配置中的 Network.pod.vmIPv6NetworkCIDR 字段决定虚拟机的静态 IPv6 地址和网关 IP 地址。virt-launcher Pod 使用它们将 IPv6 流量路由到虚拟机,而不在外部使用。Network.pod.vmIPv6NetworkCIDR 字段在无类别域间路由(CIDR)标记中指定一个 IPv6 地址块。默认值为 fd10:0:2::2/120。您可以根据网络要求编辑这个值。

当虚拟机运行时,虚拟机的传入和传出流量将路由到 IPv4 地址和 virt-launcher Pod 的唯一 IPv6 地址。virt-launcher pod 随后将 IPv4 流量路由到虚拟机的 DHCP 地址,并将 IPv6 流量路由到虚拟机的静态设置 IPv6 地址。

先决条件

  • OpenShift Container Platform 集群必须使用为 dual-stack 配置的 OVN-Kubernetes Container Network Interface(CNI)网络供应商。

流程

  1. 在新的虚拟机配置中,包含具有 masquerade 的接口,并使用 cloud-init 配置 IPv6 地址和默认网关。

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: example-vm-ipv6
    ...
              interfaces:
                - name: default
                  masquerade: {} 1
                  ports:
                    - port: 80 2
          networks:
          - name: default
            pod: {}
          volumes:
          - cloudInitNoCloud:
              networkData: |
                version: 2
                ethernets:
                  eth0:
                    dhcp4: true
                    addresses: [ fd10:0:2::2/120 ] 3
                    gateway6: fd10:0:2::1 4
    1
    使用伪装模式进行连接。
    2
    允许虚拟机上端口 80 上的传入流量。
    3
    由虚拟机实例配置中的 Network.pod.vmIPv6NetworkCIDR 字段确定的静态 IPv6 地址。默认值为 fd10:0:2::2/120
    4
    网关 IP 地址由虚拟机实例配置中的 Network.pod.vmIPv6NetworkCIDR 字段决定。默认值为 fd10:0:2::1
  2. 在命名空间中创建虚拟机:

    $ oc create -f example-vm-ipv6.yaml

验证

  • 要验证 IPv6 是否已配置,启动虚拟机并查看虚拟机实例的接口状态,以确保它具有 IPv6 地址:
$ oc get vmi <vmi-name> -o jsonpath="{.status.interfaces[*].ipAddresses}"