8.5. 使用 hostpath 置备程序配置本地存储
您可以使用 hostpath 置备程序(HPP)为虚拟机配置本地存储。
安装 OpenShift Virtualization Operator 时,会自动安装 Hostpath Provisioner Operator。HPP 是一个本地存储置备程序,用于由 Hostpath Provisioner Operator 创建的 OpenShift Virtualization。要使用 HPP,您可以使用基本存储池创建 HPP 自定义资源(CR)。
8.5.1. 使用基本存储池创建 hostpath 置备程序
您可以使用 storagePools
小节创建 HPP 自定义资源(CR),以使用基本存储池配置 hostpath 置备程序(HPP)。存储池指定 CSI 驱动程序使用的名称和路径。
不要在与操作系统相同的分区中创建存储池。否则,操作系统分区可能会被填充到容量中,这会影响性能或导致节点不稳定或不可用。
先决条件
-
在
spec.storagePools.path
中指定的目录必须具有读/写访问权限。
流程
使用
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
- 保存文件并退出。
运行以下命令来创建 HPP:
$ oc create -f hpp_cr.yaml
8.5.1.1. 关于创建存储类
当您创建存储类时,您将设置参数,它们会影响属于该存储类的持久性卷(PV)的动态置备。您不能在创建 StorageClass
对象后更新其参数。
要使用 hostpath 置备程序(HPP),您必须使用 storagePools
小节为 CSI 驱动程序创建关联的存储类。
虚拟机使用基于本地 PV 的数据卷。本地 PV 与特定节点绑定。虽然磁盘镜像准备供虚拟机消耗,但可能不会将虚拟机调度到之前固定本地存储 PV 的节点。
要解决这个问题,使用 Kubernetes pod 调度程序将持久性卷声明(PVC)绑定到正确的节点上的 PV。通过使用 volumeBindingMode
参数设置为 WaitForFirstConsumer
的 StorageClass
值,PV 的绑定和置备会延迟到 pod 使用 PVC。
8.5.1.2. 使用 storagePools 小节为 CSI 驱动程序创建存储类
要使用 hostpath 置备程序 (HPP),您必须为 Container Storage Interface (CSI) 驱动程序创建关联的存储类。
当您创建存储类时,您将设置参数,它们会影响属于该存储类的持久性卷(PV)的动态置备。您不能在创建 StorageClass
对象后更新其参数。
虚拟机使用基于本地 PV 的数据卷。本地 PV 与特定节点绑定。虽然磁盘镜像准备供虚拟机消耗,但可能不会将虚拟机调度到之前固定本地存储 PV 的节点。
要解决这个问题,使用 Kubernetes pod 调度程序将持久性卷声明(PVC)绑定到正确的节点上的 PV。通过使用 volumeBindingMode
参数设置为 WaitForFirstConsumer
的 StorageClass
值,PV 的绑定和置备会延迟到 pod 使用 PVC。
先决条件
-
以具有
cluster-admin
特权的用户身份登录。
流程
创建
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
- 保存文件并退出。
运行以下命令来创建
StorageClass
对象:$ oc create -f storageclass_csi.yaml
8.5.2. 关于使用 PVC 模板创建的存储池
如果您有单个大持久性卷(PV),可以通过在 hostpath 置备程序(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 驱动程序的每个节点中创建一个 PVC。从 PVC 模板创建的 PVC 使用单个大 PV,允许 HPP 创建较小的动态卷。
您可以将基本存储池与从 PVC 模板中创建的存储池合并。
8.5.2.1. 使用 PVC 模板创建存储池
您可以通过在 HPP 自定义资源(CR)中指定 PVC 模板,为多个 hostpath 置备程序(HPP)卷创建存储池。
不要在与操作系统相同的分区中创建存储池。否则,操作系统分区可能会被填充到容量中,这会影响性能或导致节点不稳定或不可用。
先决条件
-
在
spec.storagePools.path
中指定的目录必须具有读/写访问权限。
流程
为 HPP CR 创建
hpp_pvc_template_pool.yaml
文件,该文件指定storagePools
小节中的持久性卷(PVC)模板,如下例所示: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。如果您使用的存储类使用动态置备的存储,请选择与典型请求大小匹配的分配大小。
- 保存文件并退出。
运行以下命令,使用存储池创建 HPP:
$ oc create -f hpp_pvc_template_pool.yaml