×

您可以使用 hostpath provisioner (HPP) 为虚拟机配置本地存储。

安装 OpenShift Virtualization Operator 时,会自动安装 Hostpath Provisioner Operator。HPP 是 Hostpath Provisioner Operator 创建的、专为 OpenShift Virtualization 设计的本地存储供应程序。要使用 HPP,您可以创建一个包含基本存储池的 HPP 自定义资源 (CR)。

创建具有基本存储池的 hostpath provisioner

您可以通过创建一个包含 storagePools 部分的 HPP 自定义资源 (CR) 来配置具有基本存储池的 hostpath provisioner (HPP)。存储池指定 CSI 驱动程序使用的名称和路径。

请勿在与操作系统相同的分区中创建存储池。否则,操作系统分区可能会被填满,从而影响性能或导致节点变得不稳定或不可用。

先决条件
  • spec.storagePools.path 中指定的目录必须具有读/写访问权限。

步骤
  1. 创建一个包含如下示例中所示 storagePools 部分的 hpp_cr.yaml 文件

    apiVersion: hostpathprovisioner.kubevirt.io/v1beta1
    kind: HostPathProvisioner
    metadata:
      name: hostpath-provisioner
    spec:
      imagePullPolicy: IfNotPresent
      storagePools: (1)
      - name: any_name
        path: "/var/myvolumes" (2)
    workload:
      nodeSelector:
        kubernetes.io/os: linux
    1 storagePools 部分是一个数组,您可以向其中添加多个条目。
    2 在此节点路径下指定存储池目录。
  2. 保存文件并退出。

  3. 运行以下命令创建 HPP

    $ oc create -f hpp_cr.yaml

关于创建存储类

创建存储类时,您设置的参数会影响属于该存储类的持久卷 (PV) 的动态供应。创建 StorageClass 对象后,您无法更新其参数。

要使用 hostpath provisioner (HPP),必须为包含 storagePools 部分的 CSI 驱动程序创建一个关联的存储类。

虚拟机使用基于本地 PV 的数据卷。本地 PV 绑定到特定节点。在为虚拟机准备磁盘映像以供使用时,虚拟机可能无法调度到先前已固定本地存储 PV 的节点上。

要解决此问题,请使用 Kubernetes Pod 调度程序将持久卷声明 (PVC) 绑定到正确节点上的 PV。通过使用将 volumeBindingMode 参数设置为 WaitForFirstConsumerStorageClass 值,PV 的绑定和供应将延迟到使用 PVC 创建 Pod 之后。

为包含 storagePools 部分的 CSI 驱动程序创建存储类

要使用 hostpath provisioner (HPP),必须为容器存储接口 (CSI) 驱动程序创建一个关联的存储类。

创建存储类时,您设置的参数会影响属于该存储类的持久卷 (PV) 的动态供应。创建 StorageClass 对象后,您无法更新其参数。

虚拟机使用基于本地 PV 的数据卷。本地 PV 绑定到特定节点。在为虚拟机准备磁盘映像以供使用时,虚拟机可能无法调度到先前已固定本地存储 PV 的节点上。

要解决此问题,请使用 Kubernetes Pod 调度程序将持久卷声明 (PVC) 绑定到正确节点上的 PV。通过使用将 volumeBindingMode 参数设置为 WaitForFirstConsumerStorageClass 值,PV 的绑定和供应将延迟到使用 PVC 创建 Pod 之后。

步骤
  1. 创建一个 storageclass_csi.yaml 文件来定义存储类

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: hostpath-csi
    provisioner: kubevirt.io.hostpath-provisioner
    reclaimPolicy: Delete (1)
    volumeBindingMode: WaitForFirstConsumer (2)
    parameters:
      storagePool: my-storage-pool (3)
    1 两个可能的 reclaimPolicy 值是 DeleteRetain。如果未指定值,则默认值为 Delete
    2 volumeBindingMode 参数决定动态供应和卷绑定何时发生。指定 WaitForFirstConsumer 可将持久卷 (PV) 的绑定和供应延迟到创建使用持久卷声明 (PVC) 的 Pod 之后。这确保 PV 满足 Pod 的调度要求。
    3 指定在 HPP CR 中定义的存储池的名称。
  2. 保存文件并退出。

  3. 运行以下命令创建 StorageClass 对象

    $ oc create -f storageclass_csi.yaml

关于使用 PVC 模板创建的存储池

如果您只有一个大型持久卷 (PV),则可以通过在 hostpath provisioner (HPP) 自定义资源 (CR) 中定义 PVC 模板来创建存储池。

使用 PVC 模板创建的存储池可以包含多个 HPP 卷。将 PV 分割成较小的卷可以提高数据分配的灵活性。

PVC 模板基于 PersistentVolumeClaim 对象的 spec 部分

PersistentVolumeClaim 对象示例
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: iso-pvc
spec:
  volumeMode: Block (1)
  storageClassName: my-storage-class
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
1 此值仅对于块卷模式 PV 而言是必需的。

您可以使用 HPP CR 中的 pvcTemplate 规范定义存储池。Operator 会根据 pvcTemplate 规范为包含 HPP CSI 驱动程序的每个节点创建一个 PVC。从 PVC 模板创建的 PVC 使用大型 PV,允许 HPP 创建较小的动态卷。

您可以将基本存储池与从 PVC 模板创建的存储池结合使用。

创建具有 PVC 模板的存储池

您可以通过在 HPP 自定义资源 (CR) 中指定 PVC 模板来为多个 hostpath provisioner (HPP) 卷创建一个存储池。

请勿在与操作系统相同的分区中创建存储池。否则,操作系统分区可能会被填满,从而影响性能或导致节点变得不稳定或不可用。

先决条件
  • spec.storagePools.path 中指定的目录必须具有读/写访问权限。

步骤
  1. 创建一个 hpp_pvc_template_pool.yaml 文件,用于指定 storagePools 部分中持久卷 (PVC) 模板的 HPP CR,如下例所示

    apiVersion: hostpathprovisioner.kubevirt.io/v1beta1
    kind: HostPathProvisioner
    metadata:
      name: hostpath-provisioner
    spec:
      imagePullPolicy: IfNotPresent
      storagePools: (1)
      - name: my-storage-pool
        path: "/var/myvolumes" (2)
        pvcTemplate:
          volumeMode: Block (3)
          storageClassName: my-storage-class (4)
          accessModes:
          - ReadWriteOnce
          resources:
            requests:
              storage: 5Gi (5)
      workload:
        nodeSelector:
          kubernetes.io/os: linux
    1 storagePools 部分是一个数组,可以包含基本存储池和 PVC 模板存储池。
    2 在此节点路径下指定存储池目录。
    3 可选:volumeMode 参数可以是 BlockFilesystem,只要它与已供应的卷格式匹配即可。如果未指定值,则默认为 Filesystem。如果 volumeModeBlock,则安装 Pod 会在安装块卷之前在其上创建一个 XFS 文件系统。
    4 如果省略 storageClassName 参数,则使用默认存储类来创建 PVC。如果省略 storageClassName,请确保 HPP 存储类不是默认存储类。
    5 您可以指定静态或动态供应的存储。无论哪种情况,请确保请求的存储大小适合您要虚拟划分的卷,否则 PVC 无法绑定到大型 PV。如果您使用的存储类使用动态供应的存储,请选择与典型请求大小匹配的分配大小。
  2. 保存文件并退出。

  3. 运行以下命令创建具有存储池的 HPP

    $ oc create -f hpp_pvc_template_pool.yaml