10.3. 管理自动引导源更新
您可以为以下引导源管理自动更新:
通过引导源,可让虚拟机 (VM) 的创建更容易和高效。如果启用了自动引导源更新,Containerized Data Importer (CDI) 导入、轮询和更新镜像,以便为新虚拟机克隆它们。默认情况下,CDI 自动更新红帽引导源。
10.3.1. 管理红帽引导源更新
您可以通过禁用 enableCommonBootImageImport
功能门,选择对所有系统定义的引导源的自动更新。如果您禁用这个功能门,则所有 DataImportCron
对象都会被删除。这不会删除之前导入存储操作系统镜像的引导源对象,但管理员可以手动删除它们。
当禁用 enableCommonBootImageImport
功能门时,DataSource
对象会被重置,以便它们不再指向原始引导源。管理员可以通过为 DataSource
对象创建新的持久性卷声明(PVC)或卷快照来手动提供引导源,然后使用操作系统镜像填充它。
10.3.1.1. 为所有系统定义的引导源管理自动更新
禁用自动引导源导入和更新可能会降低资源使用量。在断开连接的环境中,禁用自动引导源更新可防止 CDIDataImportCronOutdated
警报填满日志。
要禁用所有系统定义的引导源的自动更新,请通过将值设为 false
来关闭 enableCommonBootImageImport
功能门。将此值设置为 true
可重新启用功能门并重新打开自动更新。
自定义引导源不受此设置的影响。
流程
通过编辑
HyperConverged
自定义资源 (CR) 为自动引导源更新切换功能门。要禁用自动引导源更新,请将
HyperConverged
CR 中的spec.featureGates.enableCommonBootImageImport
字段设置为false
。例如:$ oc patch hyperconverged kubevirt-hyperconverged -n openshift-cnv \ --type json -p '[{"op": "replace", "path": \ "/spec/featureGates/enableCommonBootImageImport", \ "value": false}]'
要重新启用自动引导源更新,请将
HyperConverged
CR 中的spec.featureGates.enableCommonBootImageImport
字段设置为true
。例如:$ oc patch hyperconverged kubevirt-hyperconverged -n openshift-cnv \ --type json -p '[{"op": "replace", "path": \ "/spec/featureGates/enableCommonBootImageImport", \ "value": true}]'
10.3.2. 管理自定义引导源更新
不是由 OpenShift Virtualization 提供的自定义引导源不受功能门控制。您必须通过编辑 HyperConverged
自定义资源 (CR) 来单独管理它们。
您必须配置存储配置集。否则,集群无法接收自定义引导源的自动更新。详情请参阅 配置存储配置文件。
10.3.2.1. 配置默认和 virt-default 存储类
存储类决定了如何为工作负载置备持久性存储。在 OpenShift Virtualization 中,virt-default 存储类优先于集群默认存储类,用于虚拟化工作负载。一次仅应将一个存储类设置为 virt-default 或 cluster default。如果多个存储类被标记为默认值,virt-default 存储类会覆盖集群默认存储类。为确保一致的行为,请仅配置一个存储类作为虚拟化工作负载的默认值。
引导源使用默认存储类创建。当默认存储类更改时,会使用新的默认存储类自动更新旧的引导源。如果您的集群没有默认存储类,则必须定义一个。
如果引导源镜像存储为卷快照,并且集群默认和 virt-default 存储类都未设置,则会清理卷快照,并创建新的数据卷。但是,在设置了默认存储类前,新创建的数据卷不会开始导入。
流程
将当前的 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"}}}'
10.3.2.2. 为引导源镜像配置存储类
您可以在 HyperConverged
资源中配置特定的存储类。
为确保稳定的行为并避免不必要的重新导入,您可以在 HyperConverged
资源的 dataImportCronTemplates
部分中指定 storageClassName
。
流程
运行以下命令,在默认编辑器中打开
HyperConverged
CR:$ 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
10.3.2.3. 为自定义引导源启用自动更新
OpenShift Virtualization 默认自动更新系统定义的引导源,但不会自动更新自定义引导源。您必须通过编辑 HyperConverged
自定义资源 (CR) 手动启用自动更新。
先决条件
- 集群有一个默认存储类。
流程
运行以下命令,在默认编辑器中打开
HyperConverged
CR:$ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv
编辑
HyperConverged
CR,在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-stream9 4
- 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
下找到。
- 保存该文件。
10.3.2.4. 启用卷快照引导源
通过在与存储操作系统基础镜像的存储类关联的 StorageProfile
中设置参数来启用卷快照引导源。虽然 DataImportCron
最初被设计为只维护 PVC 源,但 VolumeSnapshot
源会比特定存储类型的 PVC 源更好地扩展。
从单个快照克隆时,在存储配置文件中使用卷快照可以更好地扩展。
先决条件
- 您必须有权访问带有操作系统镜像的卷快照。
- 存储必须支持快照。
流程
运行以下命令,打开与用于置备引导源的存储类对应的存储配置集对象:
$ 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
对象现在引用卷快照。
现在,您可以使用这些引导源来创建虚拟机。
10.3.3. 为单个引导源禁用自动更新
您可以通过编辑 HyperConverged
自定义资源 (CR) 禁用单个引导源的自动更新,无论是自定义还是系统定义。
流程
运行以下命令,在默认编辑器中打开
HyperConverged
CR:$ 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 # ...
- 保存该文件。
10.3.4. 验证引导源的状态
您可以通过查看 HyperConverged
自定义资源(CR)来确定引导源是否为系统定义或自定义。
流程
运行以下命令,查看
HyperConverged
CR 的内容:$ 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: true 1 # ... - 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
字段的值为{}
,则它是一个自定义引导源。
-
如果字段包含