6.12. 虚拟机磁盘。

6.12.1. 为虚拟机配置本地存储

您可以使用 hostpath 置备程序功能为您的虚拟机配置本地存储。

6.12.1.1. 关于 hostpath 置备程序

hostpath 置备程序是设计用于容器原生虚拟化的本地存储置备程序。如果要为虚拟机配置本地存储,您必须首先启用 hostpath 置备程序。

安装容器原生虚拟化 Operator 时,会自动安装 hostpath 置备程序 Operator。要使用它,您必须:

  • 配置 SELinux:

    • 如果您使用 Red Hat Enterprise Linux CoreOS 8 worker,您必须在每个节点上创建一个 MachineConfig 对象。
    • 否则,将 SELinux 标签 container_file_t 应用到每个节点上的由 PersistentVolume (PV) 支持的目录中。
  • 创建 HostPathProvisioner 自定义资源。
  • 为 hostpath 置备程序创建 StorageClass 对象。

在创建自定义资源时,hostpath 置备程序 Operator 将部署置备程序作为每个节点上的 DaemonSet。在自定义资源文件中,您将指定 hostpath 置备程序创建的 PersistentVolume 的后备目录。

6.12.1.2. 在 Red Hat Enterprise Linux CoreOS 8 中为 hostpath 置备程序配置 SELinux

在创建 HostPathProvisioner 自定义资源前,您必须配置 SELinux。要在 Red Hat Enterprise Linux CoreOS 8 worker 中配置 SELinux,您必须在每个节点上创建一个 MachineConfig 对象。

注意

如果您不使用 Red Hat Enterprise Linux CoreOS worker,请跳过该流程。

先决条件

  • 在每个节点上为 hostpath 置备程序创建的 PersistentVolume (PV) 创建后备目录。
警告

如果选择了与您的操作系统共享空间的目录,您将有可能耗尽分区中的空间,从而导致节点无法正常工作。要避免这个问题,请创建独立分区并将 hostpath 置备程序指向那个目录。

流程

  1. 创建 MachineConfig 文件。例如:

    $ touch machineconfig.yaml
  2. 编辑该文件,确保包含希望 hostpath 置备程序在其中创建 PV 的目录。例如:

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      name: 50-set-selinux-for-hostpath-provisioner
      labels:
        machineconfiguration.openshift.io/role: worker
    spec:
      config:
        ignition:
          version: 2.2.0
        systemd:
          units:
            - contents: |
                [Unit]
                Description=Set SELinux chcon for hostpath provisioner
                Before=kubelet.service
    
                [Service]
                ExecStart=/usr/bin/chcon -Rt container_file_t <path/to/backing/directory> 1
    
                [Install]
                WantedBy=multi-user.target
              enabled: true
              name: hostpath-provisioner.service
    1
    指定希望置备程序在其中创建 PV 的后备目录。
  3. 创建 MachineConfig 对象:

    $ oc create -f machineconfig.yaml -n <namespace>

6.12.1.3. 使用 hostpath 置备程序启用本地存储

要部署 hostpath 置备程序并使虚拟机能够使用本地存储,请首先创建一个 HostPathProvisioner 自定义资源。

先决条件

  • 在每个节点上为 hostpath 置备程序创建的 PersistentVolume (PV) 创建后备目录。
警告

如果选择了与您的操作系统共享空间的目录,您将有可能耗尽分区中的空间,从而导致节点无法正常工作。要避免这个问题,请创建独立分区并将 hostpath 置备程序指向那个目录。

  • 将 SELinux 上下文 container_file_t 应用到每个节点上的 PV 后备目录。例如:

    $ sudo chcon -t container_file_t -R </path/to/backing/directory>
    注意

    如果您使用 Red Hat Enterprise Linux CoreOS 8 worker,您必须改用 MachineConfig 清单来配置 SELinux。

流程

  1. 创建 HostPathProvisioner 自定义资源文件。例如:

    $ touch hostpathprovisioner_cr.yaml
  2. 编辑该文件,确保 spec.pathConfig.path 值是您希望 hostpath 置备程序在其中创建 PV 的目录。例如:

    apiVersion: hostpathprovisioner.kubevirt.io/v1alpha1
    kind: HostPathProvisioner
    metadata:
      name: hostpath-provisioner
    spec:
      imagePullPolicy: IfNotPresent
      pathConfig:
        path: "</path/to/backing/directory>" 1
        useNamingPrefix: "false" 2
    1
    指定希望置备程序在其中创建 PV 的后备目录。
    2
    如果要使用绑定到所创建的 PV 的 PersistentVolumeClaim (PVC) 名称作为目录名的前缀,请将该值更改为 true
    注意

    如果您没有创建后备目录,则置备程序会尝试为您创建该目录。如果您没有应用 container_file_t SELinux 上下文,这会导致 Permission denied

  3. openshift-cnv 命名空间中创建自定义资源:

    $ oc create -f hostpathprovisioner_cr.yaml -n openshift-cnv

6.12.1.4. 创建 StorageClass 对象

当您创建 StorageClass 对象时,您将设置参数,它们会影响属于该存储类的 PersistentVolume (PV) 的动态置备。

注意

您无法在创建 StorageClass 对象后更新其参数。

流程

  1. 创建用于定义存储类的 YAML 文件。例如:

    $ touch storageclass.yaml
  2. 编辑该文件。例如:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: hostpath-provisioner 1
    provisioner: kubevirt.io/hostpath-provisioner
    reclaimPolicy: Delete 2
    volumeBindingMode: WaitForFirstConsumer 3
    1
    您可以通过更改此值来选择性地重命名存储类。
    2
    两个可能的 reclaimPolicy 值为 DeleteRetain。如果您没有指定值,则存储类默认为 Delete
    3
    volumeBindingMode 值决定何时发生动态置备和卷绑定。指定 WaitForFirstConsumer,将 PV 的绑定和置备延迟到创建使用 PersistentVolumeClaim (PVC) 的 Pod 后。这样可确保 PV 满足 Pod 的调度要求。
  3. 创建 StorageClass 对象:

    $ oc create -f storageclass.yaml

其他信息

6.12.2. 使用 virtctl 工具上传本地磁盘镜像

您可使用 virtctl 命令行实用程序上传本地存储的磁盘镜像。

6.12.2.1. 先决条件

6.12.2.2. CDI 支持的操作列表

此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。

内容类型HTTPHTTPSHTTP 基本身份验证Registry上传

KubeVirt(QCOW2)

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2**
✓ GZ*
✓ XZ*

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2*
□ GZ
□ XZ

✓ QCOW2*
✓ GZ*
✓ XZ*

KubeVirt (RAW)

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW*
□ GZ
□ XZ

✓ RAW*
✓ GZ*
✓ XZ*

Archive+

✓ TAR

✓ TAR

✓ TAR

□ TAR

□ TAR

✓ 支持的操作

□ 不支持的操作

* 需要涂销空间

** 如果需要自定义证书颁发机构,则需要涂销空间

+ 存档不支持块模式 DV

6.12.2.3. 上传本地磁盘镜像至新 PersistentVolumeClaim

您可使用 virtctl CLI 实用程序将虚拟机磁盘镜像从客户端机器上传至集群。上传磁盘镜像可创建一个 PersistentVolumeClaim (PVC),您可将其与虚拟机关联。

先决条件

  • 具有 RAW、ISO 或 QCOW2 格式的虚拟机磁盘镜像,可选择使用 xzgz 进行压缩。
  • kubevirt-virtctl 软件包必须安装在客户端机器上。
  • 客户端机器必须配置为信任 OpenShift Container Platform 路由器的证书。

流程

  1. 确定以下各项:

    • 要上传的虚拟机磁盘镜像的文件位置
    • 生成 PVC 的名称和大小
  2. 运行 virtctl image-upload 命令以上传您的虚拟机镜像。您必须指定 PVC 名称、PVC 大小以及文件位置。例如:

    $ virtctl image-upload --pvc-name=<upload-fedora-pvc> --pvc-size=<2Gi> --image-path=</images/fedora.qcow2>
    警告

    若要在使用 HTTPS 时允许不安全的服务器连接,请使用 --insecure 参数。注意,在使用 --insecure 标志时,不会验证上传端点的真实性。

  3. 要验证 PVC 是否已创建,请查看所有 PVC 对象:

    $ oc get pvc

6.12.3. 上传本地磁盘镜像至块存储 DataVolume

您可使用 virtctl 命令行实用程序上传本地磁盘镜像至块 DataVolume 中。

在此工作流中,您会创建一个本地块设备用作 PersistentVolume,将此块卷与 upload DataVolume 关联,并使用 virtctl 将本地磁盘镜像上传至 DataVolume 中。

6.12.3.1. 先决条件

6.12.3.2. 关于 DataVolume

DataVolume 对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层 PersistentVolumeClaim (PVC) 关联的导入、克隆和上传操作。DataVolume 与 KubeVirt 集成,它们可在 PVC 准备好前阻止虚拟机启动。

6.12.3.3. 关于块 PersistentVolume

块 PersistentVolume (PV) 是一个受原始块设备支持的 PV。这些卷没有文件系统。对于可以直接写入磁盘或者实现其自己的存储服务的虚拟机来说,使用它可以获得性能优势。

原始块卷可以通过在 PV 和 PersistentVolumeClaim (PVC) 规格中指定 volumeMode: Block 来置备。

6.12.3.4. 创建本地块 PersistentVolume

通过填充文件并将其挂载为循环设备,在节点上创建本地块 PersistentVolume (PV)。然后您可以在 PV 配置中将该循环设备引用为 Block 卷,并将其用作虚拟机镜像的块设备。

流程

  1. root 身份登录节点,在其上创建本地 PV。本流程以 node01 为例。
  2. 创建一个文件并用空字符填充,以便可将其用作块设备。以下示例创建 loop10 文件,大小为 2Gb(20,100 Mb 块):

    $ dd if=/dev/zero of=<loop10> bs=100M count=20
  3. loop10 文件挂载为 loop 设备。

    $ losetup </dev/loop10>d3 <loop10> 1 2
    1
    挂载 loop 设备的文件路径。
    2
    上一步中创建的文件,挂载为 loop 设备。
  4. 创建引用所挂载 loop 设备的 PersistentVolume 配置。

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: <local-block-pv10>
      annotations:
    spec:
      local:
        path: </dev/loop10> 1
      capacity:
        storage: <2Gi>
      volumeMode: Block 2
      storageClassName: local 3
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Delete
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - <node01> 4
    1
    节点上的 loop 设备路径。
    2
    将其指定为块 PV。
    3
    可选:为 PV 设置一个 StorageClass。如果省略此项,将使用默认集群。
    4
    挂载块设备的节点。
  5. 创建块 PV。

    # oc create -f <local-block-pv10.yaml>1
    1
    上一步中创建的 PersistentVolume 的文件名。

6.12.3.5. 创建上传 DataVolume

使用 upload 数据源创建 DataVolume,用于上传本地磁盘镜像。

流程

  1. 创建 DataVolume 配置,用于指定 spec: source: upload{}

    apiVersion: cdi.kubevirt.io/v1alpha1
    kind: DataVolume
    metadata:
      name: <upload-datavolume> 1
    spec:
      source:
          upload: {}
      pvc:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: <2Gi> 2
    1
    DataVolume 的名称
    2
    DataVolume 的大小
  2. 创建 DataVolume:

    $ oc create -f <upload-datavolume>.yaml

6.12.3.6. 上传本地磁盘镜像至新 DataVolume

您可使用 virtctl CLI 实用程序将虚拟机磁盘镜像从客户端机器上传至集群中的 DataVolume (DV)。上传镜像后,您可将其添加到虚拟机中。

先决条件

  • 具有 RAW、ISO 或 QCOW2 格式的虚拟机磁盘镜像,可选择使用 xzgz 进行压缩。
  • kubevirt-virtctl 软件包必须安装在客户端机器上。
  • 客户端机器必须配置为信任 OpenShift Container Platform 路由器的证书。
  • 具有一个大小不低于您要上传的磁盘的备用 DataVolume。

流程

  1. 确定以下各项:

    • 要上传的虚拟机磁盘镜像的文件位置
    • DataVolume 的名称
  2. 运行 virtctl image-upload 命令以上传您的磁盘镜像。您必须指定 DV 名称以及文件位置。例如:

    $ virtctl image-upload --dv-name=<upload-datavolume> --image-path=</images/fedora.qcow2> 1 2
    1
    正在创建的 DataVolume 的名称。
    2
    正在上传的虚拟机磁盘镜像的文件路径。
    警告

    若要在使用 HTTPS 时允许不安全的服务器连接,请使用 --insecure 参数。注意,在使用 --insecure 标志时,不会验证上传端点的真实性。

  3. 要验证 DV 是否已创建,请查看所有 DV 对象:

    $ oc get dvs

6.12.3.7. CDI 支持的操作列表

此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。

内容类型HTTPHTTPSHTTP 基本身份验证Registry上传

KubeVirt(QCOW2)

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2**
✓ GZ*
✓ XZ*

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2*
□ GZ
□ XZ

✓ QCOW2*
✓ GZ*
✓ XZ*

KubeVirt (RAW)

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW*
□ GZ
□ XZ

✓ RAW*
✓ GZ*
✓ XZ*

Archive+

✓ TAR

✓ TAR

✓ TAR

□ TAR

□ TAR

✓ 支持的操作

□ 不支持的操作

* 需要涂销空间

** 如果需要自定义证书颁发机构,则需要涂销空间

+ 存档不支持块模式 DV

6.12.4. 将本地虚拟机磁盘移动到不同的节点中

使用本地卷存储的虚拟机可被移动,以便在特定节点中运行。

因为以下原因,您可能想要将该虚拟机移动到特定的节点上:

  • 当前节点对本地存储配置有限制。
  • 新节点对那个虚拟机的工作负载进行了更好的优化。

要移动使用本地存储的虚拟机,您必须使用 DataVolume 克隆基础卷。克隆操作完成后,您可以 编辑虚拟机配置,以便使用新 DataVolume,或 将新 DataVolume 添加到其他虚拟机

注意

没有 cluster-admin 角色的用户需要 额外的用户权限 才能在命名空间间克隆卷。

6.12.4.1. 克隆本地卷到另一个节点

您可以通过克隆底层 PersistentVolumeClaim (PVC),移动虚拟机磁盘使其在特定节点上运行。

要确保虚拟机磁盘克隆到正确的节点,您必须创建新的 PersistentVolume (PV) 或在正确的节点上识别它。对 PV 应用一个唯一标签,以便 DataVolume 能够引用它。

注意

目标 PV 的大小不得小于源 PVC。如果目标 PV 小于源 PVC,克隆操作会失败。

先决条件

  • 虚拟机不能正在运行。在克隆虚拟机磁盘前关闭虚拟机。

流程

  1. 在节点上创建新本地 PV,或使用已有的本地 PV:

    • 创建包含 nodeAffinity.nodeSelectorTerms 参数的本地 PV。以下 manifest 在 node01 上创建了一个 10Gi 的本地 PV

      kind: PersistentVolume
      apiVersion: v1
      metadata:
        name: <destination-pv> 1
        annotations:
      spec:
        accessModes:
        - ReadWriteOnce
        capacity:
          storage: 10Gi 2
        local:
          path: /mnt/local-storage/local/disk1 3
        nodeAffinity:
          required:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: In
                values:
                - node01 4
        persistentVolumeReclaimPolicy: Delete
        storageClassName: local
        volumeMode: Filesystem
      1
      PV 的名称。
      2
      PV 的大小。您必须分配足够空间,否则克隆操作会失败。其大小不得低于源 PVC。
      3
      节点上的挂载路径。
      4
      要创建 PV 的节点的名称。
    • 已存在于节点上的一个 PV。您可以通过查看其配置中的 nodeAffinity 字段来标识置备 PV 的节点:

      $ oc get pv <destination-pv> -o yaml

      以下输出显示 PV 位于 node01:

      ...
      spec:
        nodeAffinity:
          required:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname 1
                operator: In
                values:
                - node01 2
      ...
      1
      Kubernetes.io/hostname 使用节点主机名来选择节点。
      2
      节点的主机名称。
  2. 为 PV 添加唯一标签:

    $ oc label pv <destination-pv> node=node01
  3. 创建 DataVolume 清单来引用以下内容:

    • 虚拟机的 PVC 名称和命名空间。
    • 应用上一步中的 PV 标签。
    • 目标 PV 的大小。

      apiVersion: cdi.kubevirt.io/v1alpha1
      kind: DataVolume
      metadata:
        name: <clone-datavolume> 1
      spec:
        source:
          pvc:
            name: "<source-vm-disk>" 2
            namespace: "<source-namespace>" 3
        pvc:
          accessModes:
            - ReadWriteOnce
          selector:
            matchLabels:
              node: node01 4
          resources:
            requests:
              storage: <10Gi> 5
      1
      新 DataVolume 的名称。
      2
      源 PVC 的名称。如果您不知道 PVC 名称,您可以在虚拟机配置中找到它: spec.volumes.persistentVolumeClaim.claimName
      3
      源 PVC 所在的命名空间。
      4
      应用于上一步中 PV 的标签。
      5
      目标 PV 的大小。
  4. 通过将 DataVolume 清单应用到集群来开始克隆操作:

    $ oc apply -f <clone-datavolume.yaml>

DataVolume 将虚拟机的 PVC 克隆到特定节点上的 PV 中。

6.12.5. 通过添加空白磁盘镜像扩展虚拟存储

您可向容器原生虚拟化添加空白磁盘镜像来提高存储容量或创建新数据分区。

6.12.5.1. 关于 DataVolume

DataVolume 对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层 PersistentVolumeClaim (PVC) 关联的导入、克隆和上传操作。DataVolume 与 KubeVirt 集成,它们可在 PVC 准备好前阻止虚拟机启动。

6.12.5.2. 使用 DataVolume 创建空白磁盘镜像

您可通过自定义和部署 DataVolume 配置文件在 PersistentVolumeClaim 中创建新空白磁盘镜像。

先决条件

  • 至少一个可用 PersistentVolume。
  • 安装 OpenShift CLI(oc)。

流程

  1. 编辑 DataVolume 配置文件:

    apiVersion: cdi.kubevirt.io/v1alpha1
    kind: DataVolume
    metadata:
      name: blank-image-datavolume
    spec:
      source:
          blank: {}
      pvc:
        # Optional: Set the storage class or omit to accept the default
        # storageClassName: "hostpath"
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 500Mi
  2. 运行以下命令,创建空白磁盘镜像:

    $ oc create -f <blank-image-datavolume>.yaml

6.12.5.3. 模板:适用于空白磁盘镜像的 DataVolume 配置文件

blank-image-datavolume.yaml

apiVersion: cdi.kubevirt.io/v1alpha1
kind: DataVolume
metadata:
  name: blank-image-datavolume
spec:
  source:
      blank: {}
  pvc:
    # Optional: Set the storage class or omit to accept the default
    # storageClassName: "hostpath"
    accessModes:
      - ReadWriteOnce
    resources:
      requests:
        storage: 500Mi

6.12.6. DataVolume 的存储默认值

kubevirt-storage-class-defaults ConfigMap 为 DataVolumes 提供了默认的访问模式卷模式。您可以编辑或添加 ConfigMap 的默认存储类,以便在 Web 控制台中创建与基础存储更加匹配的 DataVolume。

6.12.6.1. 关于 DataVolume 的存储设置

DataVolume 要求在 web 控制台中创建定义的 访问模式卷模式。这些存储设置默认使用 ReadWriteOnce 访问模式和 Filesystem 卷模式进行配置。

您可以通过编辑 openshift-cnv 命名空间中的 kubevirt-storage-class-defaults ConfigMap 来修改这些设置。您还可以为其他存储类添加设置,以便在 Web 控制台中为不同的存储类型创建 DataVolume。

注意

您必须配置底层存储支持的存储设置。

在 Web 控制台中创建的所有 DataVolume 都使用默认存储设置,除非您指定了在 ConfigMap 中也定义的存储类。

6.12.6.1.1. 访问模式

DataVolume 支持以下访问模式:

  • ReadWriteOnce:这个卷可以被一个单一的节点以读写模式挂载。ReadWriteOnce 具有更大的灵活性,它是默认设置。
  • ReadWriteMany:卷可以被多个节点以读写模式挂载。对于一些功能(如虚拟机在节点间实时迁移),ReadWriteMany 是必需的。

如果底层存储支持,则建议使用 ReadWriteMany

6.12.6.1.2. 卷模式

卷模式定义了卷是否要与格式化的文件系统一起使用,或者保持在原始块状态。DataVolume 支持以下卷模式:

  • Filesystem: 在 DataVolume 中创建文件系统。这是默认的设置。
  • Block: 创建块 DataVolume。只有底层存储支持时才使用 Block

6.12.6.2. 在 web 控制台中编辑 kubevirt-storage-class-defaults ConfigMap

通过编辑 openshift-cnv 命名空间中的 kubevirt-storage-class-defaults ConfigMap 来修改 DataVolume 的存储设置。您还可以为其他存储类添加设置,以便在 Web 控制台中为不同的存储类型创建 DataVolume。

注意

您必须配置底层存储支持的存储设置。

流程

  1. 从侧边菜单中点 WorkloadsConfig Maps
  2. Project 列表中,选择 openshift-cnv
  3. 点击 kubevirt-storage-class-defaults 打开 Config Map Overview
  4. 点击 YAML 选项卡以显示可编辑的配置。
  5. 使用适合您的底层存储的存储配置更新 data 值:

    ...
    data:
      accessMode: ReadWriteOnce 1
      volumeMode: Filesystem 2
      <new>.accessMode: ReadWriteMany 3
      <new>.volumeMode: Block 4
    1
    默认 accessMode 是 ReadWriteOnce
    2
    默认 volumeMode 是 Filesystem
    3
    如果您为存储类添加一个访问模式,请将参数的 <new> 部分替换为存储类名称。
    4
    如果您为存储类添加一个卷模式,请将参数的 <new> 部分替换为存储类名称。
  6. Save 以更新 ConfigMap。

6.12.6.3. 在 CLI 中编辑 kubevirt-storage-class-defaults ConfigMap

通过编辑 openshift-cnv 命名空间中的 kubevirt-storage-class-defaults ConfigMap 来修改 DataVolume 的存储设置。您还可以为其他存储类添加设置,以便在 Web 控制台中为不同的存储类型创建 DataVolume。

注意

您必须配置底层存储支持的存储设置。

流程

  1. 使用 oc edit 编辑 ConfigMap:

    $ oc edit configmap kubevirt-storage-class-defaults -n openshift-cnv
  2. 更新 ConfigMap 的 data 值:

    ...
    data:
      accessMode: ReadWriteOnce 1
      volumeMode: Filesystem 2
      <new>.accessMode: ReadWriteMany 3
      <new>.volumeMode: Block 4
    1
    默认 accessMode 是 ReadWriteOnce
    2
    默认 volumeMode 是 Filesystem
    3
    如果为存储类添加了访问模式,需要将参数的 <new> 部分替换为存储类名称。
    4
    如果您为存储类添加一个卷模式,请将参数的 <new> 部分替换为存储类名称。
  3. 保存并退出编辑器以更新 ConfigMap。

6.12.6.4. 多个存储类默认设置示例

以下 YAML 文件是一个 kubevirt-storage-class-defaults ConfigMap 示例,它为两个存储类( migrationblock)配置了存储设置。

在更新 ConfigMap 前,请确保您的底层存储支持所有设置。

kind: ConfigMap
apiVersion: v1
metadata:
  name: kubevirt-storage-class-defaults
  namespace: openshift-cnv
...
data:
  accessMode: ReadWriteOnce
  volumeMode: Filesystem
  nfs-sc.accessMode: ReadWriteMany
  nfs-sc.volumeMode: Filesystem
  block-sc.accessMode: ReadWriteMany
  block-sc.volumeMode: Block

6.12.7. 准备 CDI 涂销空间

6.12.7.1. 关于 DataVolume

DataVolume 对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层 PersistentVolumeClaim (PVC) 关联的导入、克隆和上传操作。DataVolume 与 KubeVirt 集成,它们可在 PVC 准备好前阻止虚拟机启动。

6.12.7.2. 了解涂销空间

Containerized Data Importer (CDI) 需要涂销空间(临时存储)来完成一些操作,如导入和上传虚拟机镜像。在此过程中,CDI 会提供一个与支持目标 DataVolume (DV) 的 PVC 大小相等的涂销空间 PVC。该涂销空间 PVC 将在操作完成或中止后删除。

该 CDIConfig 对象可用于通过设置 CDIConfig 对象的 spec: 部分中的 scratchSpaceStorageClass 来定义使用哪个 StorageClass 绑定涂销空间 PVC。

如果定义的 StorageClass 与集群中的 StorageClass 不匹配,则会使用为集群定义的默认 StorageClass。如果没有在集群中定义默认 StorageClass,则会使用置备原始 DV 或 PVC 时使用的 StorageClass。

注意

CDI 需要通过 file 卷模式来请求涂销空间,与支持原始 DataVolume 的 PVC 无关。如果 block 卷模式支持原始 PVC,则您必须定义一个能够置备 file 卷模式 PVC 的 StorageClass。

手动调配

如果没有存储类,CDI 则会使用项目中与镜像的大小要求匹配的任何 PVC。如果没有与这些要求匹配的 PVC,则 CDI 导入 Pod 将保持 Pending 状态,直至有适当的 PVC 可用或直至超时功能关闭 Pod。

6.12.7.3. 需要涂销空间的 CDI 操作

类型原因

registry 导入

CDI 必须下载镜像至涂销空间,并对层进行提取,以查找镜像文件。然后镜像文件传递至 QEMU-IMG 以转换成原始磁盘。

上传镜像

QEMU-IMG 不接受来自 STDIN 的输入。相反,要上传的镜像保存到涂销空间中,然后才可传递至 QEMU-IMG 进行转换。

存档镜像的 HTTP 导入

QEMU-IMG 不知道如何处理 CDI 支持的存档格式。相反,镜像取消存档并保存到涂销空间中,然后再传递至 QEMU-IMG。

经过身份验证的镜像的 HTTP 导入

QEMU-IMG 未充分处理身份验证。相反,镜像保存到涂销空间中并进行身份验证,然后再传递至 QEMU-IMG。

自定义证书的 HTTP 导入

QEMU-IMG 未充分处理 HTTPS 端点的自定义证书。相反,CDI 下载镜像到涂销空间,然后再将文件传递至 QEMU-IMG。

6.12.7.4. 在 CDI 配置中定义 StorageClass

在 CDI 配置中定义 StorageClass,为 CDI 操作动态置备涂销空间。

流程

  • 使用 oc 客户端来编辑 cdiconfig/config 并添加或编辑 spec: scratchSpaceStorageClass,以便与集群中的 StorageClass 匹配。

    $ oc edit cdiconfig/config
    API Version:  cdi.kubevirt.io/v1alpha1
    kind: CDIConfig
    metadata:
      name: config
    ...
    spec:
      scratchSpaceStorageClass: "<storage_class>"
    ...

6.12.7.5. CDI 支持的操作列表

此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。

内容类型HTTPHTTPSHTTP 基本身份验证Registry上传

KubeVirt(QCOW2)

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2**
✓ GZ*
✓ XZ*

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2*
□ GZ
□ XZ

✓ QCOW2*
✓ GZ*
✓ XZ*

KubeVirt (RAW)

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW*
□ GZ
□ XZ

✓ RAW*
✓ GZ*
✓ XZ*

Archive+

✓ TAR

✓ TAR

✓ TAR

□ TAR

□ TAR

✓ 支持的操作

□ 不支持的操作

* 需要涂销空间

** 如果需要自定义证书颁发机构,则需要涂销空间

+ 存档不支持块模式 DV

其他资源

  • 有关 StorageClass 以及如何在集群中对其进行定义的更多信息,请参阅动态置备小节。