11.3. 管理自动引导源更新
您可以为以下引导源管理自动更新:
通过引导源,可让虚拟机 (VM) 的创建更容易和高效。如果启用了自动引导源更新,Containerized Data Importer (CDI) 导入、轮询和更新镜像,以便为新虚拟机克隆它们。默认情况下,CDI 自动更新红帽引导源。
11.3.1. 管理红帽引导源更新 复制链接链接已复制到粘贴板!
您可以通过将 enableCommonBootImageImport 字段设置为 false 来选择不使用所有系统定义的引导源的自动更新。如果将值设为 false,则所有 DataImportCron 对象都会被删除。但是,这不会删除之前导入存储操作系统镜像的引导源对象,但管理员可以手动删除它们。
当 enableCommonBootImageImport 字段值设置为 false 时,会重置DataSource 对象,以便它们不再指向原始引导源。管理员可以通过为 DataSource 对象创建新的持久性卷声明(PVC)或卷快照来手动提供引导源,然后使用操作系统镜像填充它。
11.3.1.1. 为所有系统定义的引导源管理自动更新 复制链接链接已复制到粘贴板!
禁用自动引导源导入和更新可能会降低资源使用量。在断开连接的环境中,禁用自动引导源更新可防止 CDIDataImportCronOutdated 警报填满日志。
要禁用所有系统定义的引导源的自动更新,请将 enableCommonBootImageImport 字段设置为 false。将此值设置为 true 可重新打开自动更新。
自定义引导源不受此设置的影响。
先决条件
-
已安装 OpenShift CLI(
oc)。
流程
通过编辑
HyperConverged自定义资源(CR)来启用或禁用自动引导源更新。要禁用自动引导源更新,请将
HyperConvergedCR 中的spec.enableCommonBootImageImport字段设置为false。例如:$ oc patch hyperconverged kubevirt-hyperconverged -n openshift-cnv \ --type json -p '[{"op": "replace", "path": \ "/spec/enableCommonBootImageImport", \ "value": false}]'要重新启用自动引导源更新,请将
HyperConvergedCR 中的spec.enableCommonBootImageImport字段设置为true。例如:$ oc patch hyperconverged kubevirt-hyperconverged -n openshift-cnv \ --type json -p '[{"op": "replace", "path": \ "/spec/enableCommonBootImageImport", \ "value": true}]'
11.3.2. 管理自定义引导源更新 复制链接链接已复制到粘贴板!
不是由 OpenShift Virtualization 提供的自定义引导源不受功能门控制。您必须通过编辑 HyperConverged 自定义资源 (CR) 来单独管理它们。
您必须配置存储类。否则,集群无法接收自定义引导源的自动更新。详情请参阅定义存储类。
11.3.2.1. 配置默认和 virt-default 存储类 复制链接链接已复制到粘贴板!
存储类决定了如何为工作负载置备持久性存储。在 OpenShift Virtualization 中,virt-default 存储类优先于集群默认存储类,用于虚拟化工作负载。
在一个时间点上,仅一个存储类应被设置为 virt-default 或 cluster default。如果多个存储类被标记为默认,virt-default 存储类会覆盖集群默认。为确保一致的行为,请仅配置一个存储类作为虚拟化工作负载的默认值。
引导源使用默认存储类创建。当默认存储类更改时,会使用新的默认存储类自动更新旧的引导源。如果您的集群没有默认存储类,则必须定义一个。
如果引导源镜像存储为卷快照,并且集群默认和 virt-default 存储类都未设置,则会清理卷快照,并创建新的数据卷。但是,在设置了默认存储类前,新创建的数据卷不会开始导入。
先决条件
-
已安装 OpenShift CLI(
oc)。
流程
将当前的 virt-default 或集群默认存储类进行补丁为 false:
运行以下命令,识别当前标记为 virt-default 的所有存储类:
$ oc get sc -o json| jq '.items[].metadata|select(.annotations."storageclass.kubevirt.io/is-default-virt-class"=="true")|.name'对于返回的每个存储类,运行以下命令来删除 virt-default 注解:
$ oc patch storageclass <storage_class_name> -p '{"metadata": {"annotations": {"storageclass.kubevirt.io/is-default-virt-class": "false"}}}'运行以下命令,识别当前标记为集群默认的所有存储类:
$ oc get sc -o json| jq '.items[].metadata|select(.annotations."storageclass.kubernetes.io/is-default-class"=="true")|.name'对于返回的每个存储类,运行以下命令来删除集群默认注解:
$ oc patch storageclass <storage_class_name> -p '{"metadata": {"annotations": {"storageclass.kubernetes.io/is-default-class": "false"}}}'
设置新的默认存储类:
运行以下命令,将 virt-default 角色分配给存储类:
$ oc patch storageclass <storage_class_name> -p '{"metadata": {"annotations": {"storageclass.kubevirt.io/is-default-virt-class": "true"}}}'或者,运行以下命令将集群默认角色分配给存储类:
$ oc patch storageclass <storage_class_name> -p '{"metadata": {"annotations": {"storageclass.kubernetes.io/is-default-class": "true"}}}'
11.3.2.2. 为引导源镜像配置存储类 复制链接链接已复制到粘贴板!
您可以在 HyperConverged 资源中配置特定的存储类。
为确保稳定的行为并避免不必要的重新导入,您可以在 HyperConverged 资源的 dataImportCronTemplates 部分中指定 storageClassName。
先决条件
-
已安装 OpenShift CLI(
oc)。
流程
运行以下命令,在默认编辑器中打开
HyperConvergedCR:$ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv将
dataImportCronTemplate添加到HyperConverged资源的 spec 部分,并设置storageClassName:apiVersion: hco.kubevirt.io/v1beta1 kind: HyperConverged metadata: name: kubevirt-hyperconverged spec: dataImportCronTemplates: - metadata: name: rhel9-image-cron spec: template: spec: storage: storageClassName: <storage_class>1 schedule: "0 */12 * * *"2 managedDataSource: <data_source>3 # ...For the custom image to be detected as an available boot source, the value of the `spec.dataVolumeTemplates.spec.sourceRef.name` parameter in the VM template must match this value.- 等待 HyperConverged Operator (HCO)和 Scheduling、Scale 和 Performance (SSP)资源完成协调。
运行以下命令,从
openshift-virtualization-os-images命名空间中删除所有过时的DataVolume和VolumeSnapshot对象。$ oc delete DataVolume,VolumeSnapshot -n openshift-virtualization-os-images --selector=cdi.kubevirt.io/dataImportCron等待所有
DataSource对象都变为 "Ready - True" 状态。数据源可以引用 PersistentVolumeClaim (PVC) 或 VolumeSnapshot。要检查预期的源格式,请运行以下命令:$ oc get storageprofile <storage_class_name> -o json | jq .status.dataImportCronSourceFormat
11.3.2.3. 为自定义引导源启用自动更新 复制链接链接已复制到粘贴板!
OpenShift Virtualization 默认自动更新系统定义的引导源,但不会自动更新自定义引导源。您必须通过编辑 HyperConverged 自定义资源 (CR) 手动启用自动更新。
先决条件
- 集群有一个默认存储类。
-
已安装 OpenShift CLI(
oc)。
流程
运行以下命令,在默认编辑器中打开
HyperConvergedCR:$ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv编辑
HyperConvergedCR,在dataImportCronTemplates部分添加适当的模板和引导源。例如:apiVersion: hco.kubevirt.io/v1beta1 kind: HyperConverged metadata: name: kubevirt-hyperconverged spec: dataImportCronTemplates: - metadata: name: centos-stream9-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-stream:9 storage: resources: requests: storage: 30Gi garbageCollect: Outdated managedDataSource: centos-stream94 - 1
- 对于将
volumeBindingMode设置为WaitForFirstConsumer的存储类来说,这个注解是必需的。 - 2
- 以 cron 格式指定的作业调度计划。
- 3
- 用于从 registry 源创建数据卷。使用默认
podpullMethod而不是节点pullMethod,这基于节点docker 缓存。当 registry 镜像通过Container.Image可用时,节点docker 缓存很有用,但 CDI 导入程序没有授权访问它。 - 4
- 要使自定义镜像被检测到为可用的引导源,镜像的
managedDataSource的名称必须与模板的DataSource的名称匹配,它在 VM 模板 YAML 文件中的spec.dataVolumeTemplates.spec.sourceRef.name下找到。
- 保存该文件。
11.3.2.4. 启用卷快照引导源 复制链接链接已复制到粘贴板!
您可以通过在与存储操作系统基础镜像的存储类关联的 StorageProfile 中设置参数来启用卷快照引导源。
虽然 DataImportCron 最初被设计为只维护 PVC 源,但 VolumeSnapshot 源会比特定存储类型的 PVC 源更好地扩展。
从单个快照克隆时,在存储配置文件中使用卷快照可以更好地扩展。
先决条件
- 您必须有权访问带有操作系统镜像的卷快照。
- 存储必须支持快照。
-
已安装 OpenShift CLI(
oc)。
流程
运行以下命令,打开与用于置备引导源的存储类对应的存储配置集对象:
$ oc edit storageprofile <storage_class>-
查看
StorageProfile的dataImportCronSourceFormat规格,以确认虚拟机是否默认使用 PVC 或卷快照。 如果需要,通过将
dataImportCronSourceFormat规格更新为snapshot来编辑存储配置文件。存储配置集示例:
apiVersion: cdi.kubevirt.io/v1beta1 kind: StorageProfile metadata: # ... spec: dataImportCronSourceFormat: snapshot
验证
打开与用于置备引导源的存储类对应的存储配置集对象。
$ oc get storageprofile <storage_class> -oyaml-
确认
StorageProfile的dataImportCronSourceFormat规格已设置为 'snapshot',DataImportCron指向的任何DataSource对象现在引用卷快照。
现在,您可以使用这些引导源来创建虚拟机。
11.3.3. 为单个引导源禁用自动更新 复制链接链接已复制到粘贴板!
您可以通过编辑 HyperConverged 自定义资源 (CR) 禁用单个引导源的自动更新,无论是自定义还是系统定义。
先决条件
-
已安装 OpenShift CLI(
oc)。
流程
运行以下命令,在默认编辑器中打开
HyperConvergedCR:$ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv通过编辑
spec.dataImportCronTemplates字段来禁用单个引导源的自动更新。- 自定义引导源
-
从
spec.dataImportCronTemplates字段删除引导源。在默认情况下,自定义引导源禁用了自动更新。
-
从
- 系统定义的引导源
将引导源添加到
spec.dataImportCronTemplates。注意对于系统定义的引导源,默认启用自动更新,但除非添加它们,否则这些引导源不会在 CR 中列出。
将
dataimportcrontemplate.kubevirt.io/enable注解的值设置为'false'。例如:
apiVersion: hco.kubevirt.io/v1beta1 kind: HyperConverged metadata: name: kubevirt-hyperconverged spec: dataImportCronTemplates: - metadata: annotations: dataimportcrontemplate.kubevirt.io/enable: 'false' name: rhel8-image-cron # ...
- 保存该文件。
11.3.4. 验证引导源的状态 复制链接链接已复制到粘贴板!
您可以通过查看 HyperConverged 自定义资源(CR)来确定引导源是否为系统定义或自定义。
先决条件
-
已安装 OpenShift CLI(
oc)。
流程
运行以下命令,查看
HyperConvergedCR 的内容:$ oc get hyperconverged kubevirt-hyperconverged -n openshift-cnv -o yaml输出示例:
apiVersion: hco.kubevirt.io/v1beta1 kind: HyperConverged metadata: name: kubevirt-hyperconverged spec: # ... status: # ... dataImportCronTemplates: - metadata: annotations: cdi.kubevirt.io/storage.bind.immediate.requested: "true" name: centos-9-image-cron spec: garbageCollect: Outdated managedDataSource: centos-stream9 schedule: 55 8/12 * * * template: metadata: {} spec: source: registry: url: docker://quay.io/containerdisks/centos-stream:9 storage: resources: requests: storage: 30Gi status: {} status: commonTemplate: true1 # ... - metadata: annotations: cdi.kubevirt.io/storage.bind.immediate.requested: "true" name: user-defined-dic spec: garbageCollect: Outdated managedDataSource: user-defined-centos-stream9 schedule: 55 8/12 * * * template: metadata: {} spec: source: registry: pullMethod: node url: docker://quay.io/containerdisks/centos-stream:9 storage: resources: requests: storage: 30Gi status: {} status: {}2 # ...通过查看
status.dataImportCronTemplates.status字段来验证引导源的状态。-
如果字段包含
commonTemplate: true,则它是一个系统定义的引导源。 -
如果
status.dataImportCronTemplates.status字段的值为{},则它是一个自定义引导源。
-
如果字段包含