可启动卷

可启动卷是可直接使用的启动映像,可用于创建虚拟机。每个可启动卷都是由 PVC 提供支持的 KubeVirt DataSource(cdi.kubevirt.io/v1beta1),CDI 会从导入源或克隆源填充该 PVC。在控制台中,可启动卷作为映像实例进行管理 — 请参阅添加映像实例、管理映像实例和命名空间中的映像实例。本页面从 API 角度介绍可启动卷。

创建虚拟机并选择置备方法 > 映像实例时,选择器会列出共享 kube-public 命名空间中的可启动卷(平台“黄金映像”存放于此),以及虚拟机自身命名空间中的可启动卷。

注意事项

  • 只有当可启动卷的 DataSource 带有下面所述的 virtualization.cpaas.io/* 标签契约(至少包括选择器用于筛选的操作系统和架构),其状态为 Ready,并且 — 对于 PVC 源 — 其 PVC 已绑定且导入成功时,才会提供该可启动卷用于创建虚拟机。不带这些标签的数据源仍会显示在映像实例列表中,但不会在映像实例选择器中提供。
  • 控制台会将导入进度显示为映像实例状态:CDI 填充后端 PVC 时为正在导入,可供使用后为可用;请参阅状态。
  • 本地上传不是控制台中的源;请改用 virtctl 上传(请参阅上传本地映像并创建虚拟机)。

查看可启动卷

可启动卷由 DataSource 对象提供支持,这些对象位于 kube-public 以及存放其自身对象的命名空间中。直接列出这些对象:

kubectl get datasource -A

添加可启动卷

可启动卷支持以下源;控制台中的名称如下:

控制台源功能DataVolume 源
网络 > HTTP(或 HTTP 映像源)从 HTTP(S) URL 导入 qcow2/raw 映像http
网络 > 注册表(或注册表映像源)从容器注册表拉取容器磁盘registry
网络 > 对象存储(S3)(仅限命名空间)使用包含凭证的 Secret 从兼容 S3 的对象存储导入映像s3
磁盘克隆现有 PVCpvc
卷快照从 VolumeSnapshot 恢复snapshot

注意:请在自己的命名空间中创建可启动卷。共享的 kube-public 命名空间包含由集群管理员发布的平台黄金映像 — 用户可以直接使用(克隆并从中启动)kube-public 映像,但在 kube-public 中创建或修改对象需要提升的平台权限。

添加可启动卷会创建两个对象:一个 DataVolume(CDI 将映像导入 PVC),以及一个指向该对象并携带标签契约的 DataSource。示例通过 HTTP 导入映像;控制台将 DataVolume 命名为 <name>-img-<5 random characters>,并使 DataSource 成为其所有者,而手写的一对对象可以共用一个名称,如下所示:

# 1) DataVolume — CDI imports the image into a PVC of the same name.
apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
  name: ubuntu-2204
  namespace: demo
spec:
  source:
    http:
      url: https://images.example.com/ubuntu-22.04.qcow2
      # secretRef: my-pull-secret      # for an authenticated source
      # certConfigMap: image-server-ca # for a server with a private CA
  storage:
    resources:
      requests:
        storage: 20Gi
    storageClassName: sc-ceph-cluster-block
    volumeMode: Block
    accessModes:
      - ReadWriteMany
---
# 2) DataSource — makes the PVC selectable as a bootable volume.
apiVersion: cdi.kubevirt.io/v1beta1
kind: DataSource
metadata:
  name: ubuntu-2204
  namespace: demo
  labels:
    virtualization.cpaas.io/image-instance: "true"
    virtualization.cpaas.io/image-os-type: ubuntu
    virtualization.cpaas.io/image-os-arch: amd64
    virtualization.cpaas.io/size: 20Gi
    virtualization.cpaas.io/storage-class: sc-ceph-cluster-block
    virtualization.cpaas.io/volume-mode: Block
    virtualization.cpaas.io/access-mode: ReadWriteMany
    virtualization.cpaas.io/source-type: address   # image-source | address | disk | volume-snapshot
spec:
  source:
    pvc:
      name: ubuntu-2204
      namespace: demo

选择存储类的 StorageProfile 所提供的卷模式和访问模式;在可用时,建议使用具有 ReadWriteMany 的 Block(请参阅存储设置)。

对于其他源类型,将 DataVolume 中的 spec.source 替换为以下选项之一。

注册表:

source:
  registry:
    url: docker://registry.example.com/library/fedora:40

S3,其中 Secret 包含 accessKeyId 和 secretKey:

source:
  s3:
    url: https://s3.example.com/images/fedora-40.qcow2
    secretRef: s3-images

克隆现有 PVC:

source:
  pvc:
    name: source-pvc
    namespace: demo

从 VolumeSnapshot 恢复:

source:
  snapshot:
    name: source-snapshot
    namespace: demo

应用并监视导入过程:

kubectl apply -f bootable-volume.yaml
kubectl get datavolume ubuntu-2204 -n demo -w

默认实例类型和首选项

可启动卷可以通过其 DataSource 上的标签,声明适合它的实例类型和首选项:

标签值缺少时
instancetype.kubevirt.io/default-instancetype实例类型的名称无默认实例类型
instancetype.kubevirt.io/default-instancetype-kindVirtualMachineClusterInstancetype 或 VirtualMachineInstancetypeVirtualMachineClusterInstancetype
instancetype.kubevirt.io/default-preference首选项的名称无默认首选项
instancetype.kubevirt.io/default-preference-kindVirtualMachineClusterPreference 或 VirtualMachinePreferenceVirtualMachineClusterPreference

创建虚拟机并选择此可启动卷作为镜像实例时,声明的实例类型和首选项会在模型区域中预先选定;你仍可以更改它们。表单还提供跟随镜像选项,该选项会将启动卷写入为引用源;平台会在创建虚拟机时读取一次这些标签(请参阅创建虚拟机)。命名空间范围的实例类型或首选项只能供其所属命名空间中的虚拟机使用。

CDI 会将这些标签从其背后的对象复制到 DataSource 上:这些对象包括 PVC 和同名的 DataVolume,或卷快照;如果 DataVolume 没有任何这些标签,则从导入或克隆它所用的卷复制。因此,仅在 DataSource 上设置的标签,只要这些对象之一声明了其他值,就会被覆盖。在控制台中,对镜像实例使用更新默认规范,即可将所选值写入所有这些对象(请参阅默认规范)。使用 kubectl 时,也要为 PVC、DataVolume 和 DataSource 添加标签:

for obj in pvc/centos-stream9 datavolume/centos-stream9 datasource/centos-stream9; do
  kubectl label -n kube-public "$obj" --overwrite \
    instancetype.kubevirt.io/default-instancetype=u1.medium \
    instancetype.kubevirt.io/default-preference=centos.stream9
done

或者在创建时,在 DataSource(以及 DataVolume)中声明这些标签:

apiVersion: cdi.kubevirt.io/v1beta1
kind: DataSource
metadata:
  name: centos-stream9
  namespace: kube-public
  labels:
    instancetype.kubevirt.io/default-instancetype: u1.medium
    instancetype.kubevirt.io/default-preference: centos.stream9
spec:
  source:
    pvc:
      name: centos-stream9
      namespace: kube-public

之后更改标签只会影响随后创建的虚拟机;现有虚拟机仍使用创建时所用的对象。

从可启动卷创建虚拟机

虚拟机将在其自身的命名空间中创建,并从 kube-public 或同一命名空间中的可启动卷克隆其根磁盘。在底层,虚拟机通过 dataVolumeTemplates 条目引用数据源 — CDI 会将可启动卷克隆到新虚拟机的根磁盘中:

spec:
  dataVolumeTemplates:
    - metadata:
        name: web-01-rootfs
      spec:
        sourceRef:
          kind: DataSource
          name: ubuntu-2204
          # The bootable volume's namespace: kube-public for an
          # administrator-published golden image, or the virtual machine's own.
          namespace: demo
        storage:
          resources:
            requests:
              storage: 20Gi
          storageClassName: sc-ceph-cluster-block
          volumeMode: Block
          accessModes:
            - ReadWriteMany   # the console picks it from the StorageProfile

克隆源命名空间仅限于虚拟机的命名空间和 kube-public。从另一个非公开命名空间克隆可能需要额外的 CDI 克隆权限。

更新或删除可启动卷

在控制台中,对镜像实例使用重新导入和删除;请参阅管理镜像实例。删除由控制台添加的镜像实例会移除其 DataSource,而导入 DataVolume、其 PVC 及其 CA 证书 ConfigMap 会根据所有者引用一并删除。

对于手动编写的可启动卷,请删除 DataSource 和 DataVolume。后备 PVC 由 DataVolume(通过 ownerReferences)拥有,因此在删除 DataVolume 时会自动进行垃圾回收 — 请勿在 DataVolume 仍存在时删除 PVC,否则 CDI 会重新预配它:

kubectl delete datasource ubuntu-2204 -n demo
kubectl delete datavolume ubuntu-2204 -n demo

如果 CDI 已在成功导入后对 DataVolume 进行了垃圾回收,则 kubectl delete datavolume 会返回 NotFound,而 PVC 将不再具有所有者 — 此时请直接删除它:

kubectl delete pvc ubuntu-2204 -n demo