×

您可以使用从操作系统镜像构建的容器磁盘创建虚拟机 (VM)。

您可以为您的容器磁盘启用自动更新。详情请参见 管理自动启动源更新

如果容器磁盘很大,I/O流量可能会增加并导致工作节点不可用。您可以修剪DeploymentConfig对象来解决此问题。

您可以通过执行以下步骤从容器磁盘创建虚拟机

  1. 将操作系统镜像构建到容器磁盘并将其上传到您的容器注册表.

  2. 如果您的容器注册表没有TLS,配置您的环境以禁用注册表的TLS

  3. 使用 Web控制台命令行 创建一个使用容器磁盘作为磁盘源的虚拟机。

您必须在从非Red Hat提供的操作系统镜像创建的虚拟机上安装 QEMU客户机代理

构建和上传容器磁盘

您可以将虚拟机 (VM) 镜像构建到容器磁盘并将其上传到注册表。

容器磁盘的大小受托管容器磁盘的注册表的最大层大小限制。

对于 Red Hat Quay,您可以通过编辑首次部署 Red Hat Quay 时创建的 YAML 配置文件来更改最大层大小。

先决条件
  • 您必须安装podman

  • 您必须拥有 QCOW2 或 RAW 镜像文件。

步骤
  1. 创建一个 Dockerfile 将 VM 镜像构建到容器镜像中。VM 镜像必须由 QEMU 拥有(UID 为107),并放置在容器内的/disk/目录中。然后必须将/disk/目录的权限设置为0440

    以下示例使用 Red Hat 通用基础镜像 (UBI) 在第一阶段处理这些配置更改,并在第二阶段使用最小的scratch镜像来存储结果。

    $ cat > Dockerfile << EOF
    FROM registry.access.redhat.com/ubi8/ubi:latest AS builder
    ADD --chown=107:107 <vm_image>.qcow2 /disk/ (1)
    RUN chmod 0440 /disk/*
    
    FROM scratch
    COPY --from=builder /disk/* /disk/
    EOF
    1 其中<vm_image> 是 QCOW2 或 RAW 格式的镜像。如果您使用远程镜像,请将<vm_image>.qcow2替换为完整 URL。
  2. 构建并标记容器

    $ podman build -t <registry>/<container_disk_name>:latest .
  3. 将容器镜像推送到注册表

    $ podman push <registry>/<container_disk_name>:latest

禁用容器注册表的TLS

您可以通过编辑HyperConverged自定义资源的insecureRegistries字段来禁用一个或多个容器注册表的TLS(传输层安全)。

先决条件
  1. 通过运行以下命令在默认编辑器中打开HyperConverged CR:

    $ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv
  2. 将不安全注册表的列表添加到spec.storageImport.insecureRegistries字段。

    HyperConverged自定义资源示例
    apiVersion: hco.kubevirt.io/v1beta1
    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
      namespace: openshift-cnv
    spec:
      storageImport:
        insecureRegistries: (1)
          - "private-registry-example-1:5000"
          - "private-registry-example-2:5000"
    1 请将此列表中的示例替换为有效的注册表主机名。

使用Web控制台从容器磁盘创建虚拟机

您可以使用 Red Hat OpenShift Service on AWS Web 控制台从容器注册表导入容器磁盘来创建虚拟机 (VM)。

步骤
  1. 在Web控制台中导航到**虚拟化** → **目录**。

  2. 单击没有可用启动源的模板图块。

  3. 单击**自定义虚拟机**。

  4. 在**自定义模板参数**页面上,展开**存储**并从**磁盘源**列表中选择**注册表(创建 PVC)**。

  5. 输入容器镜像 URL。示例:https://mirror.arizona.edu/fedora/linux/releases/38/Cloud/x86_64/images/Fedora-Cloud-Base-38-1.6.x86_64.qcow2

  6. 设置磁盘大小。

  7. 单击**下一步**。

  8. 单击**创建虚拟机**。

使用命令行从容器磁盘创建虚拟机

您可以使用命令行从容器磁盘创建虚拟机 (VM)。

创建虚拟机 (VM) 时,包含容器磁盘的数据卷将导入到持久性存储中。

先决条件
  • 您必须具有包含容器磁盘的容器注册表的访问凭据。

步骤
  1. 编辑VirtualMachine清单并将其保存为vm-rhel-datavolume.yaml文件。

    详情
    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      creationTimestamp: null
      name: vm-rhel-datavolume (1)
      labels:
        kubevirt.io/vm: vm-rhel-datavolume
    spec:
      dataVolumeTemplates:
      - metadata:
          creationTimestamp: null
          name: rhel-dv (2)
        spec:
          sourceRef:
            kind: DataSource
            name: rhel9
            namespace: openshift-virtualization-os-images
          storage:
            resources:
              requests:
                storage: 10Gi (3)
      instancetype:
        name: u1.small (4)
      preference:
        inferFromVolume: datavolumedisk1
      runStrategy: Always
      template:
        metadata:
          creationTimestamp: null
          labels:
            kubevirt.io/vm: vm-rhel-datavolume
        spec:
          domain:
            devices: {}
            resources: {}
          terminationGracePeriodSeconds: 180
          volumes:
          - dataVolume:
              name: rhel-dv
            name: datavolumedisk1
    status: {}
    1 指定VM的名称。
    2 指定数据卷的名称。
    3 指定为数据卷请求的存储大小。
    4 可选:指定要使用的实例类型以控制VM的资源大小。
  2. 运行以下命令创建VM:

    $ oc create -f vm-rhel-datavolume.yaml

    oc create命令创建数据卷和VM。CDI控制器创建一个具有正确注释的底层PVC,并开始导入过程。导入完成后,数据卷状态将更改为Succeeded。您可以启动VM。

    数据卷预配在后台进行,因此无需监控此过程。

验证
  1. 导入程序 Pod 将从指定的 URL 下载容器磁盘并将其存储在已预配的持久卷上。通过运行以下命令查看导入程序 Pod 的状态:

    $ oc get pods
  2. 运行以下命令监控数据卷,直到其状态为Succeeded

    $ oc describe dv rhel-dv (1)
    1 指定您在VirtualMachine清单中定义的数据卷名称。
  3. 通过访问其串行控制台,验证预配是否已完成以及VM是否已启动。

    $ virtctl console vm-rhel-datavolume