$ oc patch hyperconverged kubevirt-hyperconverged -n openshift-cnv \
--type json -p '[{"op": "replace", "path": \
"/spec/featureGates/enableCommonBootImageImport", \
"value": false}]'
您可以管理以下启动源的自动更新
启动源可以使虚拟机 (VM) 的创建对用户更易于访问和更高效。如果启用了自动启动源更新,容器化数据导入器 (CDI) 将导入、轮询和更新镜像,以便它们准备好克隆到新的虚拟机中。默认情况下,CDI 会自动更新 Red Hat 启动源。
您可以通过禁用enableCommonBootImageImport
特性门来选择退出所有系统定义的启动源的自动更新。如果您禁用此特性门,所有DataImportCron
对象都将被删除。但这不会删除存储操作系统镜像的先前导入的启动源对象,尽管管理员可以手动删除它们。
当enableCommonBootImageImport
特性门被禁用时,DataSource
对象将被重置,以便它们不再指向原始启动源。管理员可以通过为DataSource
对象创建一个新的持久卷声明 (PVC) 或卷快照,然后用操作系统镜像填充它来手动提供启动源。
禁用自动启动源导入和更新可以降低资源使用率。在断开连接的环境中,禁用自动启动源更新可以防止CDIDataImportCronOutdated
警报填满日志。
要禁用所有系统定义的启动源的自动更新,请将enableCommonBootImageImport
特性门的数值设置为false
。将其值设置为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}]'
自定义启动源(非OpenShift Virtualization提供)不受特性门控制。您必须通过编辑HyperConverged
自定义资源 (CR) 来单独管理它们。
您必须配置存储配置文件。否则,集群将无法接收自定义启动源的自动更新。有关详细信息,请参阅配置存储配置文件。 |
您可以通过编辑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)
# ...
1 | 定义存储类。 |
2 | 必需:以 cron 格式指定的作业调度。 |
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 值。 |
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 | 用于从注册表源创建数据卷。使用默认的pod pullMethod ,而不是基于node docker 缓存的node pullMethod 。当注册表镜像可通过Container.Image 获得,但CDI导入器无权访问它时,node docker缓存非常有用。 |
4 | 为了将自定义镜像检测为可用的启动源,镜像的managedDataSource 名称必须与模板的DataSource 名称匹配,该名称位于VM模板YAML文件中的spec.dataVolumeTemplates.spec.sourceRef.name 下。 |
保存文件。
通过设置与存储操作系统基本镜像的存储类关联的StorageProfile
中的参数来启用卷快照启动源。尽管DataImportCron
最初设计为仅维护PVC源,但对于某些存储类型,VolumeSnapshot
源比PVC源更具可扩展性。
在已证明从单个快照克隆时更具可扩展性的存储配置文件上使用卷快照。 |
您必须具有访问包含操作系统镜像的卷快照的权限。
存储必须支持快照。
通过运行以下命令打开与用于预配启动源的存储类对应的存储配置文件对象:
$ oc edit storageprofile <storage_class>
查看StorageProfile
的dataImportCronSourceFormat
规范,以确认VM默认情况下是使用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
对象现在都引用卷快照。
您现在可以使用这些启动源来创建虚拟机。
您可以通过编辑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
# ...
保存文件。
您可以通过查看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)
# ...
1 | 表示系统定义的启动源。 |
2 | 表示自定义启动源。 |
通过查看status.dataImportCronTemplates.status
字段来验证启动源的状态。
如果该字段包含commonTemplate: true
,则它是系统定义的启动源。
如果status.dataImportCronTemplates.status
字段的值为{}
,则它是自定义启动源。