$ 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
您可以使用从操作系统镜像构建的容器磁盘创建虚拟机 (VM)。
您可以为您的容器磁盘启用自动更新。详情请参见 管理自动启动源更新。
如果容器磁盘很大,I/O流量可能会增加并导致工作节点不可用。您可以修剪 |
您可以通过执行以下步骤从容器磁盘创建虚拟机
如果您的容器注册表没有TLS,配置您的环境以禁用注册表的TLS。
您必须在从非Red Hat提供的操作系统镜像创建的虚拟机上安装 QEMU客户机代理。 |
您可以将虚拟机 (VM) 镜像构建到容器磁盘并将其上传到注册表。
容器磁盘的大小受托管容器磁盘的注册表的最大层大小限制。
对于 Red Hat Quay,您可以通过编辑首次部署 Red Hat Quay 时创建的 YAML 配置文件来更改最大层大小。 |
您必须安装podman
。
您必须拥有 QCOW2 或 RAW 镜像文件。
创建一个 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。 |
构建并标记容器
$ podman build -t <registry>/<container_disk_name>:latest .
将容器镜像推送到注册表
$ podman push <registry>/<container_disk_name>:latest
您可以通过编辑HyperConverged
自定义资源的insecureRegistries
字段来禁用一个或多个容器注册表的TLS(传输层安全)。
通过运行以下命令在默认编辑器中打开HyperConverged
CR:
$ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv
将不安全注册表的列表添加到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 | 请将此列表中的示例替换为有效的注册表主机名。 |
您可以使用 Red Hat OpenShift Service on AWS Web 控制台从容器注册表导入容器磁盘来创建虚拟机 (VM)。
在Web控制台中导航到**虚拟化** → **目录**。
单击没有可用启动源的模板图块。
单击**自定义虚拟机**。
在**自定义模板参数**页面上,展开**存储**并从**磁盘源**列表中选择**注册表(创建 PVC)**。
输入容器镜像 URL。示例:https://mirror.arizona.edu/fedora/linux/releases/38/Cloud/x86_64/images/Fedora-Cloud-Base-38-1.6.x86_64.qcow2
设置磁盘大小。
单击**下一步**。
单击**创建虚拟机**。
您可以使用命令行从容器磁盘创建虚拟机 (VM)。
创建虚拟机 (VM) 时,包含容器磁盘的数据卷将导入到持久性存储中。
您必须具有包含容器磁盘的容器注册表的访问凭据。
编辑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的资源大小。 |
运行以下命令创建VM:
$ oc create -f vm-rhel-datavolume.yaml
oc create
命令创建数据卷和VM。CDI控制器创建一个具有正确注释的底层PVC,并开始导入过程。导入完成后,数据卷状态将更改为Succeeded
。您可以启动VM。
数据卷预配在后台进行,因此无需监控此过程。
导入程序 Pod 将从指定的 URL 下载容器磁盘并将其存储在已预配的持久卷上。通过运行以下命令查看导入程序 Pod 的状态:
$ oc get pods
运行以下命令监控数据卷,直到其状态为Succeeded
:
$ oc describe dv rhel-dv (1)
1 | 指定您在VirtualMachine 清单中定义的数据卷名称。 |
通过访问其串行控制台,验证预配是否已完成以及VM是否已启动。
$ virtctl console vm-rhel-datavolume