第 7 章 虚拟机
7.1. 从红帽镜像创建虚拟机
7.1.1. 从红帽镜像创建虚拟机概述
红帽镜像是金级镜像。它们作为容器磁盘在安全 registry 中发布。Containerized Data Importer (CDI) 轮询容器磁盘并将其导入到集群中,并将其存储在 openshift-virtualization-os-images
项目中作为快照或持久性卷声明(PVC)。
红帽镜像会自动更新。您可以为这些镜像禁用和重新启用自动更新。请参阅管理红帽引导源更新。
集群管理员现在可以在 OpenShift Virtualization web 控制台中为 Red Hat Enterprise Linux (RHEL)虚拟机启用自动订阅。
您可以使用以下方法之一从红帽提供的操作系统镜像创建虚拟机(VM):
不要在默认的 openshift
Galaxy 命名空间中创建虚拟机。相反,创建一个新命名空间或使用没有 openshift
前缀的现有命名空间。
7.1.1.1. 关于金级镜像
金级镜像是虚拟机(VM)的预配置快照,您可以用作部署新虚拟机的资源。例如,您可以使用金级镜像来更加一致地置备相同的系统环境,并更快高效地部署系统。
7.1.1.1.1. 金级镜像如何工作?
通过在参考机器或虚拟机上安装和配置操作系统和软件应用程序来创建金级镜像。这包括设置系统、安装所需的驱动程序、应用补丁和更新以及配置特定选项和首选项。
创建金级镜像后,它会保存为模板或镜像文件,可在多个集群中复制和部署。金级镜像可以通过维护人员定期更新,以纳入必要的软件更新和补丁,确保镜像保持最新且安全,并且新创建的虚拟机基于这个更新的镜像。
7.1.1.1.2. 红帽对金级镜像的实施
对于 Red Hat Enterprise Linux (RHEL) 版本,红帽发布金级镜像作为 registry 中的容器磁盘。容器磁盘是虚拟机镜像,它作为容器镜像 registry 存储在容器镜像 registry 中。安装 OpenShift Virtualization 后,任何发布的镜像将自动在连接的集群中提供。镜像在集群中可用后,可以使用它们创建虚拟机。
7.1.1.2. 关于虚拟机引导源
虚拟机 (VM) 由虚拟机定义以及由数据卷支持的一个或多个磁盘组成。VM 模板允许您使用预定义的规格创建虚拟机。
每个模板都需要一个引导源,它是一个完全配置的磁盘镜像,包括配置的驱动程序。每个模板都包含一个虚拟机定义,其中包含指向引导源的指针。每个引导源都有一个预定义的名称和命名空间。对于某些操作系统,会自动提供一个引导源。如果没有提供,管理员必须准备自定义引导源。
提供的引导源会自动更新至操作系统的最新版本。对于自动更新的引导源,持久性卷声明 (PVC) 和卷快照会使用集群的默认存储类创建。如果在配置后选择了不同的默认存储类,您必须删除使用之前默认存储类配置的集群命名空间中的现有引导源。
7.1.2. 从实例类型创建虚拟机
您可以使用实例类型(无论 OpenShift Container Platform web 控制台或 CLI 创建虚拟机)来简化虚拟机 (VM) 创建。
7.1.2.1. 关于实例类型
实例类型是一种可重复使用的对象,您可以定义应用到新虚拟机的资源和特征。您可以定义自定义实例类型,或使用安装 OpenShift Virtualization 时包括的各种类型。
要创建新实例类型,您必须首先手动创建清单,也可以使用 virtctl
CLI 工具创建清单。然后,您可以通过将清单应用到集群来创建实例类型对象。
OpenShift Virtualization 为配置实例类型提供两个 CRD:
-
命名空间范围对象:
VirtualMachineInstancetype
-
集群范围的对象:
VirtualMachineClusterInstancetype
这些对象使用相同的 VirtualMachineInstancetypeSpec
。
7.1.2.1.1. 所需属性
配置实例类型时,您必须定义 cpu
和 memory
属性。其他属性是可选的。
从实例类型创建虚拟机时,您无法覆盖实例类型中定义的任何参数。
因为实例类型需要定义的 CPU 和内存属性,所以 OpenShift Virtualization 始终会在从实例类型创建虚拟机时拒绝这些资源的额外请求。
您可以手动创建实例类型清单。例如:
带有必填字段的 YAML 文件示例
apiVersion: instancetype.kubevirt.io/v1beta1 kind: VirtualMachineInstancetype metadata: name: example-instancetype spec: cpu: guest: 1 1 memory: guest: 128Mi 2
您可以使用 virtctl
CLI 实用程序创建实例类型清单。例如:
带有必填字段的 virtctl
命令示例
$ virtctl create instancetype --cpu 2 --memory 256Mi
其中:
--cpu <value>
- 指定要分配给客户机的 vCPU 数量。必需。
--memory <value>
- 指定要分配给客户机的内存量。必需。
您可以运行以下命令来立即从新清单中创建对象:
$ virtctl create instancetype --cpu 2 --memory 256Mi | oc apply -f -
7.1.2.1.2. 可选属性
除了所需的 cpu
和 memory
属性外,您还可以在 VirtualMachineInstancetypeSpec
中包含以下可选属性:
annotations
- 列出应用到虚拟机的注解。
gpus
- 列出用于 passthrough 的 vGPU。
hostDevices
- 列出用于透传的主机设备。
ioThreadsPolicy
- 定义用于管理专用磁盘访问的 IO 线程策略。
launchSecurity
- 配置安全加密虚拟化 (SEV)。
nodeSelector
- 指定节点选择器来控制调度此虚拟机的节点。
schedulerName
- 定义用于此虚拟机的自定义调度程序,而不是默认的调度程序。
7.1.2.2. 预定义的实例类型
OpenShift Virtualization 包括一组预定义的实例类型,称为 common-instancetypes
。一些会针对特定工作负载进行定制,另一些则与工作负载无关。
这些实例类型资源根据其系列、版本和大小命名。大小值使用 .
分隔符,范围从 nano
到 8xlarge
。
使用案例 | 系列 | 特性 | vCPU 与内存的比率 | 资源示例 |
---|---|---|---|---|
Universal | U |
| 1:4 |
|
过量使用 | O |
| 1:4 |
|
compute-exclusive | CX |
| 1:2 |
|
NVIDIA GPU | GN |
| 1:4 |
|
内存密集型 | M |
| 1:8 |
|
Network-intensive | N |
| 1:2 |
|
7.1.2.3. 使用 virtctl 工具创建清单
您可使用 virtctl
CLI 实用程序简化为虚拟机、虚拟机实例类型和虚拟机首选项创建清单。如需更多信息,请参阅虚拟机清单创建命令。
如果您有 VirtualMachine
清单,可以从命令行创建虚拟机。
7.1.2.4. 使用 Web 控制台从实例类型创建虚拟机
您可以使用 OpenShift Container Platform web 控制台从实例类型创建虚拟机 (VM)。您还可以通过复制现有快照或克隆虚拟机,来使用 Web 控制台创建虚拟机。
流程
-
在 web 控制台中,进入到 Virtualization
Catalog,再点 InstanceTypes 选项卡。 选择以下选项之一:
选择一个可引导卷。
注意可引导的卷表仅列出
openshift-virtualization-os-images
命名空间中具有instancetype.kubevirt.io/default-preference
标签的卷。- 可选:点星号图标将可引导卷指定为热门卷。不足的可引导卷首先出现在卷列表中。
- 点 Add volume 上传新卷,或使用现有的持久性卷声明 (PVC)、卷快照或数据源。然后点保存。
- 点实例类型标题,然后选择适合您的工作负载的资源大小。
- 如果您还没有在项目中添加公共 SSH 密钥,点 VirtualMachine details 部分中的 Authorized SSH key 旁边的编辑图标。
选择以下选项之一:
- 使用现有 :从 secrets 列表中选择一个 secret。
添加新 :
- 浏览到公共 SSH 密钥文件,或在 key 字段中粘贴文件。
- 输入 secret 名称。
- 可选: 选择 Automatically apply this key to any new VirtualMachine you create in this project。
- 点击 Save。
- 可选:点 View YAML & CLI 查看 YAML 文件。点 CLI 查看 CLI 命令。您还可以下载或复制 YAML 文件内容或 CLI 命令。
- 点 Create VirtualMachine。
创建虚拟机后,您可以在 VirtualMachine 详情页中监控状态。
7.1.3. 从模板创建虚拟机
您可以使用 OpenShift Container Platform web 控制台从红帽模板创建虚拟机 (VM)。
7.1.3.1. 关于虚拟机模板
- 引导源
您可以使用有可用引导源的模板加快虚拟机创建。如果带有引导源的模板没有自定义标签,则会被标记为 Available boot source。
没有引导源的模板被标记为 Boot source required。请参阅从自定义镜像创建虚拟机。
- 自定义
在启动虚拟机前,您可以自定义磁盘源和虚拟机参数:
- 有关磁盘源设置的详情,请参阅存储卷类型和存储字段。
- 有关虚拟机设置的详情,请查看 Overview、YAML 和 Configuration 选项卡文档。
如果您使用所有标签和注解复制虚拟机模板,则当部署新版本的 Scheduling、Scale 和 Performance (SSP) Operator 时,您的模板版本将被标记为已弃用。您可以删除此设计。请参阅使用 Web 控制台自定义虚拟机模板。
- 单节点 OpenShift
-
由于存储行为的区别,一些模板与单节点 OpenShift 不兼容。为确保兼容性,请不要为使用数据卷或存储配置集的模板或虚拟机设置
evictionStrategy
字段。
7.1.3.2. 从模板创建虚拟机
您可以使用 OpenShift Container Platform web 控制台从带有可用引导源的模板创建虚拟机 (VM)。
可选: 在启动虚拟机前,您可以自定义模板或虚拟机参数,如数据源、cloud-init 或 SSH 密钥。
流程
-
在 web 控制台中进入到 Virtualization
Catalog。 点 Boot source available 来使用引导源过滤模板。
目录显示默认模板。点 All Items 查看您的过滤器的所有可用模板。
- 点模板标题查看其详情。
点 Quick create VirtualMachine 从模板创建虚拟机。
可选:自定义模板或虚拟机参数:
- 点 Customize VirtualMachine。
- 展开 Storage 或 Optional 参数,以编辑数据源设置。
点 Customize VirtualMachine 参数。
Customize and create VirtualMachine 窗格显示 Overview, YAML, Scheduling, Environment, Network interfaces, Disks, Scripts, 和 Metadata 标签页。
- 编辑在虚拟机引导前必须设置的参数,如 cloud-init 或静态 SSH 密钥。
点 Create VirtualMachine。
VirtualMachine 详情页面会显示 provisioning 状态。
7.1.3.2.1. 存储卷类型
Type | 描述 |
---|---|
ephemeral | 将网络卷用作只读后备存储的本地写时复制 (COW) 镜像。后备卷必须为 PersistentVolumeClaim。当虚拟机启动并在本地存储所有写入数据时,便会创建临时镜像。当虚拟机停止、重启或删除时,便会丢弃临时镜像。其底层的卷 (PVC) 不会以任何方式发生变化。 |
persistentVolumeClaim | 将可用 PV 附加到虚拟机。附加 PV 可确保虚拟机数据在会话之间保持。 将现有虚拟机导入到 OpenShift Container Platform 中的建议方法是,使用 CDI 将现有虚拟机磁盘导入到 PVC 中,然后将 PVC 附加到虚拟机实例。在 PVC 中使用磁盘需要满足一些要求。 |
dataVolume |
通过导入、克隆或上传操作来管理虚拟机磁盘的准备过程,以此在
指定 |
cloudInitNoCloud | 附加包含所引用的 cloud-init NoCloud 数据源的磁盘,从而向虚拟机提供用户数据和元数据。虚拟机磁盘内部需要安装 cloud-init。 |
containerDisk | 引用容器镜像 registry 中存储的镜像,如虚拟机磁盘。镜像从 registry 中拉取,并在虚拟机启动时作为磁盘附加到虚拟机。
容器镜像 registry 仅支持 RAW 和 QCOW2 格式的磁盘类型。建议使用 QCOW2 格式以减小镜像的大小。 注意
|
emptyDisk | 创建额外的稀疏 QCOW2 磁盘,与虚拟机接口的生命周期相关联。当虚拟机中的客户端初始化重启后,数据保留下来,但当虚拟机停止或从 web 控制台重启时,数据将被丢弃。空磁盘用于存储应用程序依赖项和数据,否则这些依赖项和数据会超出临时磁盘有限的临时文件系统。 此外还必须提供磁盘容量大小。 |
7.1.3.2.2. 存储字段
字段 | 描述 |
---|---|
空白(创建 PVC) | 创建一个空磁盘。 |
通过 URL 导入(创建 PVC) | 通过 URL(HTTP 或 HTTPS 端点)导入内容。 |
使用现有的 PVC | 使用集群中已可用的 PVC。 |
克隆现有的 PVC(创建 PVC) | 选择集群中可用的现有 PVC 并克隆它。 |
通过 Registry 导入(创建 PVC) | 通过容器 registry 导入内容。 |
容器(临时) | 从集群可以访问的 registry 中的容器上传内容。容器磁盘应只用于只读文件系统,如 CD-ROM 或临时虚拟机。 |
名称 |
磁盘的名称。名称可包含小写字母 ( |
Size | GiB 中磁盘的大小。 |
类型 | 磁盘类型。示例:磁盘或光盘 |
Interface | 磁盘设备的类型。支持的接口包括 virtIO、SATA 和 SCSI。 |
Storage class | 用于创建磁盘的存储类。 |
高级存储设置
以下高级存储设置是可选的,对 Blank, Import via URL, and Clone existing PVC 磁盘可用。
如果没有指定这些参数,系统将使用默认存储配置集值。
参数 | 选项 | 参数描述 |
---|---|---|
卷模式 | Filesystem | 在基于文件系统的卷中保存虚拟磁盘。 |
Block |
直接将虚拟磁盘存储在块卷中。只有底层存储支持时才使用 | |
访问模式 | ReadWriteOnce (RWO) | 卷可以被一个节点以读写模式挂载。 |
ReadWriteMany (RWX) | 卷可以被多个节点以读写模式挂载。 注意 实时迁移需要此模式。 |
7.1.3.2.3. 使用 Web 控制台自定义虚拟机模板
在启动虚拟机前,您可以通过修改 VM 或模板参数(如数据源、cloud-init 或 SSH 密钥)来自定义现有虚拟机(VM)模板。如果您通过复制模板并包含其所有标签和注解,则部署新版本的 Scheduling、Scale 和 Performance (SSP) Operator 时,自定义模板将标记为已弃用。
您可以从自定义模板中删除已弃用的设计。
流程
-
在 web 控制台中进入到 Virtualization
Templates。 - 从虚拟机模板列表中,点标记为已弃用的模板。
- 点 Labels 旁边的铅笔图标旁的 Edit。
删除以下两个标签:
-
template.kubevirt.io/type: "base"
-
template.kubevirt.io/version: "version"
-
- 点击 Save。
- 点现有 Annotations 数旁边的铅笔图标。
删除以下注解:
-
template.kubevirt.io/deprecated
-
- 点击 Save。
7.1.4. 从命令行创建虚拟机
您可以通过编辑或创建 VirtualMachine
清单来从命令行创建虚拟机 (VM)。您可以使用虚拟机清单中的实例类型来简化虚拟机配置。
您还可以使用 Web 控制台从实例类型创建虚拟机。
7.1.4.1. 使用 virtctl 工具创建清单
您可使用 virtctl
CLI 实用程序简化为虚拟机、虚拟机实例类型和虚拟机首选项创建清单。如需更多信息,请参阅虚拟机清单创建命令。
7.1.4.2. 从 VirtualMachine 清单创建虚拟机
您可以从 VirtualMachine
清单创建虚拟机(VM)。
流程
编辑虚拟机的
VirtualMachine
清单。以下示例配置 Red Hat Enterprise Linux (RHEL) 虚拟机:注意这个示例清单没有配置虚拟机身份验证。
RHEL 虚拟机的清单示例
apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: name: rhel-9-minimal spec: dataVolumeTemplates: - metadata: name: rhel-9-minimal-volume spec: sourceRef: kind: DataSource name: rhel9 1 namespace: openshift-virtualization-os-images 2 storage: {} instancetype: name: u1.medium 3 preference: name: rhel.9 4 running: true template: spec: domain: devices: {} volumes: - dataVolume: name: rhel-9-minimal-volume name: rootdisk
使用清单文件创建虚拟机:
$ oc create -f <vm_manifest_file>.yaml
可选:启动虚拟机:
$ virtctl start <vm_name> -n <namespace>
后续步骤