9.3. 管理自动引导源更新
您可以为以下引导源管理自动更新:
通过引导源,可让虚拟机 (VM) 的创建更容易和高效。如果启用了自动引导源更新,Containerized Data Importer (CDI) 导入、轮询和更新镜像,以便为新虚拟机克隆它们。默认情况下,CDI 自动更新红帽引导源。
9.3.1. 管理红帽引导源更新
您可以通过禁用 enableCommonBootImageImport
功能门,选择对所有系统定义的引导源的自动更新。如果您禁用这个功能门,则所有 DataImportCron
对象都会被删除。这不会删除之前导入存储操作系统镜像的引导源对象,但管理员可以手动删除它们。
当禁用 enableCommonBootImageImport
功能门时,DataSource
对象会被重置,以便它们不再指向原始引导源。管理员可以通过为 DataSource
对象创建新的持久性卷声明(PVC)或卷快照来手动提供引导源,然后使用操作系统镜像填充它。
9.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}]'
9.3.2. 管理自定义引导源更新
不是由 OpenShift Virtualization 提供的自定义引导源不受功能门控制。您必须通过编辑 HyperConverged
自定义资源 (CR) 来单独管理它们。
您必须配置存储类。否则,集群无法接收自定义引导源的自动更新。详情请参阅定义一个存储类。
9.3.2.1. 为自定义引导源更新配置存储类
您可以通过编辑 HyperConverged
自定义资源 (CR) 来覆盖默认存储类。
引导源使用默认存储类从存储创建。如果您的集群没有默认存储类,则必须在为自定义引导源配置自动更新前定义一个。
流程
运行以下命令,在默认编辑器中打开
HyperConverged
CR:$ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv
通过在
storageClassName
字段中输入值来定义新的存储类:apiVersion: hco.kubevirt.io/v1beta1 kind: HyperConverged metadata: name: kubevirt-hyperconverged spec: dataImportCronTemplates: - metadata: name: rhel8-image-cron spec: template: spec: storageClassName: <new_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.
从当前的默认存储类中删除
storageclass.kubernetes.io/is-default-class
注解。运行以下命令,检索当前默认存储类的名称:
$ oc get storageclass
输出示例
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE csi-manila-ceph manila.csi.openstack.org Delete Immediate false 11d hostpath-csi-basic (default) kubevirt.io.hostpath-provisioner Delete WaitForFirstConsumer false 11d 1
- 1
- 在本例中,当前的默认存储类名为
hostpath-csi-basic
。
运行以下命令,从当前默认存储类中删除注解:
$ oc patch storageclass <current_default_storage_class> -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}' 1
- 1
- 将
<current_default_storage_class>
替换为默认存储类的storageClassName
值。
运行以下命令,将新存储类设置为默认值:
$ oc patch storageclass <new_storage_class> -p '{"metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' 1
- 1
- 将
<new_storage_class>
替换为添加到HyperConverged
CR 中的storageClassName
值。
9.3.2.2. 为自定义引导源启用自动更新
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: centos7-image-cron annotations: cdi.kubevirt.io/storage.bind.immediate.requested: "true" 1 labels: instancetype.kubevirt.io/default-preference: centos.7 instancetype.kubevirt.io/default-instancetype: u1.medium spec: schedule: "0 */12 * * *" 2 template: spec: source: registry: 3 url: docker://quay.io/containerdisks/centos:7-2009 storage: resources: requests: storage: 30Gi garbageCollect: Outdated managedDataSource: centos7 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
下找到。
- 保存该文件。
9.3.2.3. 启用卷快照引导源
通过在与存储操作系统基础镜像的存储类关联的 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
对象现在引用卷快照。
现在,您可以使用这些引导源来创建虚拟机。
9.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 # ...
- 保存该文件。
9.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-7-image-cron spec: garbageCollect: Outdated managedDataSource: centos7 schedule: 55 8/12 * * * template: metadata: {} spec: source: registry: url: docker://quay.io/containerdisks/centos:7-2009 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-stream8 schedule: 55 8/12 * * * template: metadata: {} spec: source: registry: pullMethod: node url: docker://quay.io/containerdisks/centos-stream:8 storage: resources: requests: storage: 30Gi status: {} status: {} 2 # ...
通过查看
status.dataImportCronTemplates.status
字段来验证引导源的状态。-
如果字段包含
commonTemplate: true
,则它是一个系统定义的引导源。 -
如果
status.dataImportCronTemplates.status
字段的值为{}
,则它是一个自定义引导源。
-
如果字段包含