×

您可以管理以下启动源的自动更新

启动源可以使虚拟机 (VM) 的创建对用户更易于访问和更高效。如果启用了自动启动源更新,容器化数据导入器 (CDI) 将导入、轮询和更新镜像,以便它们准备好克隆到新的虚拟机中。默认情况下,CDI 会自动更新 Red Hat 启动源。

管理 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) 来覆盖默认存储类。

启动源使用默认存储类从存储创建。如果您的集群没有默认存储类,则必须在为自定义启动源配置自动更新之前定义一个。

步骤
  1. 通过运行以下命令在默认编辑器中打开HyperConverged CR:

    $ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv
  2. 通过在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.
  3. 从当前默认存储类中删除storageclass.kubernetes.io/is-default-class注释。

    1. 通过运行以下命令检索当前默认存储类的名称:

      $ 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
    2. 通过运行以下命令从当前默认存储类中删除注释:

      $ oc patch storageclass <current_default_storage_class> -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}' (1)
      1 <current_default_storage_class>替换为默认存储类的storageClassName值。
  4. 通过运行以下命令将新的存储类设置为默认存储类:

    $ 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) 来手动启用自动更新。

先决条件
  • 集群具有默认存储类。

步骤
  1. 通过运行以下命令在默认编辑器中打开HyperConverged CR:

    $ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv
  2. 编辑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下。
  3. 保存文件。

启用卷快照启动源

通过设置与存储操作系统基本镜像的存储类关联的StorageProfile中的参数来启用卷快照启动源。尽管DataImportCron最初设计为仅维护PVC源,但对于某些存储类型,VolumeSnapshot源比PVC源更具可扩展性。

在已证明从单个快照克隆时更具可扩展性的存储配置文件上使用卷快照。

先决条件
  • 您必须具有访问包含操作系统镜像的卷快照的权限。

  • 存储必须支持快照。

步骤
  1. 通过运行以下命令打开与用于预配启动源的存储类对应的存储配置文件对象:

    $ oc edit storageprofile <storage_class>
  2. 查看StorageProfiledataImportCronSourceFormat规范,以确认VM默认情况下是使用PVC还是卷快照。

  3. 如有需要,请更新dataImportCronSourceFormat规范为snapshot来编辑存储配置文件。

    存储配置文件示例
    apiVersion: cdi.kubevirt.io/v1beta1
    kind: StorageProfile
    metadata:
    # ...
    spec:
      dataImportCronSourceFormat: snapshot
验证
  1. 打开与用于配置启动源的存储类对应的存储配置文件对象。

    $ oc get storageprofile <storage_class>  -oyaml
  2. 确认StorageProfiledataImportCronSourceFormat规范设置为“snapshot”,并且DataImportCron指向的任何DataSource对象现在都引用卷快照。

您现在可以使用这些启动源来创建虚拟机。

禁用单个启动源的自动更新

您可以通过编辑HyperConverged自定义资源 (CR) 来禁用单个启动源(无论是自定义的还是系统定义的)的自动更新。

步骤
  1. 通过运行以下命令在默认编辑器中打开HyperConverged CR:

    $ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv
  2. 通过编辑spec.dataImportCronTemplates字段来禁用单个启动源的自动更新。

    自定义启动源
    • spec.dataImportCronTemplates字段中删除启动源。默认情况下,自定义启动源的自动更新已禁用。

    系统定义的启动源
    1. 将启动源添加到spec.dataImportCronTemplates

      系统定义的启动源默认情况下启用自动更新,但除非您添加它们,否则这些启动源不会列在 CR 中。

    2. 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
      # ...
  3. 保存文件。

验证启动源的状态

您可以通过查看HyperConverged自定义资源 (CR) 来确定启动源是系统定义的还是自定义的。

步骤
  1. 运行以下命令查看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 表示自定义启动源。
  2. 通过查看status.dataImportCronTemplates.status字段来验证启动源的状态。

    • 如果该字段包含commonTemplate: true,则它是系统定义的启动源。

    • 如果status.dataImportCronTemplates.status字段的值为{},则它是自定义启动源。