×

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

安装 OpenShift Virtualization Operator 时,会自动安装 Hostpath Provisioner Operator。HPP 是专为 OpenShift Virtualization 设计的本地存储供应程序,由 Hostpath Provisioner Operator 创建。要使用 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 之后。

先决条件
  • 以具有cluster-admin 权限的用户身份登录。

步骤
  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 为包含 HPP CSI 驱动程序的每个节点从pvcTemplate 规范创建 PVC。从 PVC 模板创建的 PVC 使用单个大型 PV,允许 HPP 创建较小的动态卷。

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

使用 PVC 模板创建存储池

您可以通过在 HPP 自定义资源 (CR) 中指定 PVC 模板来为多个主机路径供应程序 (HPP) 卷创建存储池。

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

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

步骤
  1. 为指定了 `storagePools` 节中持久卷 (PVC) 模板的 HPP CR 创建一个 `hpp_pvc_template_pool.yaml` 文件,如下例所示。

    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` 参数可以是 `Block` 或 `Filesystem`,只要它与已配置卷的格式匹配即可。如果未指定值,则默认为 `Filesystem`。如果 `volumeMode` 为 `Block`,则挂载 Pod 会在挂载块卷之前在其上创建一个 XFS 文件系统。
    4 如果省略 `storageClassName` 参数,则使用默认存储类来创建 PVC。如果您省略 `storageClassName`,请确保 HPP 存储类不是默认存储类。
    5 您可以指定静态或动态配置的存储。无论哪种情况,请确保请求的存储大小适合您要虚拟划分的卷,否则 PVC 无法绑定到大型 PV。如果您使用的存储类使用动态配置的存储,请选择与典型请求大小相匹配的分配大小。
  2. 保存文件并退出。

  3. 通过运行以下命令来创建带有存储池的 HPP:

    $ oc create -f hpp_pvc_template_pool.yaml