11.7. 管理自动引导源更新
管理自动引导源更新。
11.7.1. 关于自动引导源更新
通过引导源,可让虚拟机 (VM) 的创建更容易和高效。如果启用了自动引导源更新,Containerized Data Importer (CDI) 导入、轮询和更新镜像,以便为新虚拟机克隆它们。默认情况下,CDI 自动更新 OpenShift Virtualization 提供的系统定义的引导源。
您可以通过禁用 enableCommonBootImageImport
功能门,选择对所有系统定义的引导源的自动更新。如果您禁用这个功能门,则所有 DataImportCron
对象都会被删除。这不会删除之前导入的 PersistentVolumeClaim
(PVC) 对象来存储操作系统镜像,但管理员可以手动删除它们。
当禁用 enableCommonBootImageImport
功能门时,DataSource
对象会被重置,以便它们不再指向原始 PVC。管理员可以通过为 DataSource
对象创建新 PVC,并使用操作系统镜像填充 PVC 来手动提供引导源。
不是由 OpenShift Virtualization 提供的自定义引导源不受功能门控制。您必须通过编辑 HyperConverged
自定义资源 (CR) 来单独管理它们。您还可以使用此方法管理各个系统定义的引导源。
11.7.2. 为所有系统引导源启用或禁用自动更新
使用功能门控制所有系统定义的引导源的自动更新。
11.7.2.1. 为所有系统定义的引导源管理自动更新
禁用自动引导源导入和更新可能会降低资源使用量。在断开连接的环境中,禁用自动引导源更新可防止 CDIDataImportCronOutdated
警报填满日志。
要禁用所有系统定义的引导源的自动更新,请通过将值设为 false
来关闭 enableCommonBootImageImport
功能门。将此值设置为 true
可重新启用功能门并重新打开自动更新。
自定义引导源不受此设置的影响。
流程
通过编辑
HyperConverged
自定义资源 (CR) 为自动引导源更新切换功能门。要禁用自动引导源更新,请将
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}]'
要重新启用自动引导源更新,请将
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}]'
11.7.3. 为自定义引导源启用自动更新
确保集群具有默认存储类。然后,为自定义引导源启用自动更新。
11.7.3.1. 为自定义引导源更新配置存储类
在 HyperConverged
自定义资源 (CR) 中指定新的默认存储类。
引导源使用默认存储类从存储创建。如果您的集群没有默认存储类,则必须在为自定义引导源配置自动更新前定义一个。
流程
运行以下命令,在默认编辑器中打开
HyperConverged
CR:$ oc edit hco -n openshift-cnv kubevirt-hyperconverged
通过在
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 #...
- 1
- 定义存储类。
从当前的默认存储类中删除
storageclass.kubernetes.io/is-default-class
注解。运行以下命令,检索当前默认存储类的名称:
$ oc get sc
输出示例
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
值。
11.7.3.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 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
删除数据卷和数据源。
- 保存该文件。
11.7.4. 禁用特定引导源的自动更新
禁用单个引导源的自动更新。
11.7.4.1. 为单个引导源禁用自动更新
您可以通过编辑 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 # ...
- 保存该文件。
11.7.5. 验证引导源的状态
您可以通过查看 HyperConverged
自定义资源(CR)来确定引导源是否为系统定义或自定义。
流程
运行以下命令,查看
HyperConverged
CR 的内容:$ oc get hco -n openshift-cnv kubevirt-hyperconverged -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
字段的值为{}
,则它是一个自定义引导源。
-
如果字段包含