4.12. 使用本地存储的持久性存储


4.12.1. 本地存储概述

您可以使用以下解决方案置备本地存储:

  • HostPath Provisioner (HPP)
  • Local Storage Operator (LSO)
  • Logical Volume Manager (LVM) Storage
警告

这些解决方案只支持置备节点本地存储。工作负载绑定到提供存储的节点。如果节点不可用,工作负载也会变得不可用。要保持工作负载可用性(尽管节点失败),您必须确保通过主动或被动复制机制进行存储数据。

4.12.1.1. HostPath Provisioner 功能概述

您可以使用 HostPath Provisioner (HPP) 执行以下操作:

  • 将主机文件系统路径映射到存储类以进行本地存储。
  • 静态创建存储类,在节点上配置文件系统路径以进行存储消耗。
  • 根据存储类静态置备持久性卷 (PV)。
  • 在了解底层存储拓扑时,创建工作负载和 PersistentVolumeClaims (PVC)。
注意

HPP 在上游 Kubernetes 中提供。但是,不建议使用来自上游 Kubernetes 的 HPP。

4.12.1.2. Local Storage Operator 功能概述

您可以使用 Local Storage Operator (LSO) 执行以下操作:

  • 在不修改设备配置的情况下,将存储设备(磁盘或分区)分配给存储类。
  • 通过配置 LocalVolume 自定义资源 (CR) 以静态置备 PV 和存储类。
  • 在了解底层存储拓扑时创建工作负载和 PVC。
注意

LSO 由红帽开发和交付。

4.12.1.3. LVM 存储功能概述

您可以使用逻辑卷管理器(LVM)存储执行以下操作:

  • 将存储设备(磁盘或分区)配置为 lvm2 卷组,并将卷组公开为存储类。
  • 在不考虑节点拓扑的情况下,使用 PVC 创建工作负载和请求存储。

LVM 存储使用 TopoLVM CSI 驱动程序,将存储空间动态分配给拓扑中的节点,并置备 PV。

注意

LVM 存储由红帽开发和维护。LVM 存储提供的 CSI 驱动程序是上游项目 "topolvm"。

4.12.1.4. LVM 存储、LSO 和 HPP 的比较

以下小节比较 LVM Storage、Local Storage Operator (LSO)和 HostPath Provisioner (HPP) 提供的功能,以置备本地存储。

4.12.1.4.1. 支持存储类型和文件系统的比较

下表比较了对 LVM Storage、Local Storage Operator (LSO)和 HostPath Provisioner (HPP)提供的存储类型和文件系统的支持,以置备本地存储:

表 4.1. 支持存储类型和文件系统的比较
功能LVM 存储LSOHPP

支持块存储

支持文件存储

支持对象存储 [1]

可用文件系统

ext4,xfs

ext4,xfs

支持节点上任何挂载的系统。

  1. 任何解决方案(LVM 存储、LSO 和 HPP)都不支持对象存储。因此,如果要使用对象存储,则需要 S3 对象存储解决方案,如 Red Hat OpenShift Data Foundation 中的 MultiClusterGateway。所有解决方案都可以充当 S3 对象存储解决方案的底层存储供应商。
4.12.1.4.2. 对核心功能的支持比较

下表比较了 LVM Storage、Local Storage Operator (LSO)和 HostPath Provisioner (HPP)支持置备本地存储的核心功能:

表 4.2. 对核心功能的支持比较
功能LVM 存储LSOHPP

支持自动文件系统格式

N/A

支持动态置备

支持使用软件独立磁盘阵列(RAID)阵列

支持 4.15 及更新的版本。

支持透明磁盘加密

在 4.16 及更新的版本中支持。

支持基于卷的磁盘加密

支持断开连接的安装

支持 PVC 扩展

支持卷快照和卷克隆

支持精简配置

默认情况下,设备是精简置备的。

您可以将设备配置为指向精简配置的卷

您可以配置指向精简配置的卷的路径。

支持自动磁盘发现和设置

在安装过程中和运行时提供自动磁盘发现。您还可以在 LVMCluster 自定义资源(CR)中动态添加磁盘,以增加现有存储类的存储容量。

技术预览

在安装过程中提供自动磁盘发现。

4.12.1.4.3. 性能和隔离功能的比较

下表比较了置备本地存储中的 LVM 存储、Local Storage Operator (LSO)和 HostPath Provisioner (HPP)的性能和隔离功能。

表 4.3. 性能和隔离功能的比较
功能LVM 存储LSOHPP

性能

对使用相同存储类的所有工作负载,I/O 速度都是共享的。

块存储允许直接 I/O 操作。

精简配置可能会影响性能。

I/O 依赖于 LSO 配置。

块存储允许直接 I/O 操作。

对使用相同存储类的所有工作负载,I/O 速度都是共享的。

底层文件系统实施的限制可能会影响 I/O 速度。

隔离边界 [1]

LVM 逻辑卷(LV)

与 HPP 相比,它提供了更高级别的隔离。

LVM 逻辑卷(LV)

与 HPP 相比,它提供了更高级别的隔离

文件系统路径

与 LSO 和 LVM 存储相比,它提供了较低级别的隔离。

  1. 隔离边界指的是使用本地存储资源的不同工作负载或应用程序之间的隔离程度。
4.12.1.4.4. 支持额外功能的比较

下表比较了 LVM Storage、Local Storage Operator (LSO)和 HostPath Provisioner (HPP)提供的额外功能,以置备本地存储:

表 4.4. 支持额外功能的比较
功能LVM 存储LSOHPP

支持通用临时卷

支持 CSI 内联临时卷

支持存储拓扑

支持 CSI 节点拓扑

LSO 通过节点容限提供对存储拓扑的部分支持。

支持 ReadWriteMany (RWX) 访问模式 [1]

  1. 所有解决方案 (LVM 存储、LSO 和 HPP) 都有 ReadWriteOnce (RWO) 访问模式。RWO 访问模式允许从同一节点上的多个 pod 访问。

4.12.2. 使用本地卷的持久性存储

OpenShift Container Platform 可以使用本地卷来置备持久性存储。本地持久性卷允许您使用标准持久性卷声明接口访问本地存储设备,如磁盘或分区。

无需手动将 pod 调度到节点即可使用本地卷,因为系统了解卷节点的约束。但是,本地卷仍会受到底层节点可用性的影响,而且并不适用于所有应用程序。

注意

本地卷只能用作静态创建的持久性卷。

4.12.2.1. 安装 Local Storage Operator

默认情况下,OpenShift Container Platform 中不会安装 Local Storage Operator。使用以下流程来安装和配置这个 Operator,从而在集群中启用本地卷。

先决条件

  • 访问 OpenShift Container Platform web 控制台或命令行 (CLI)。

流程

  1. 创建 openshift-local-storage 项目:

    $ oc adm new-project openshift-local-storage
  2. 可选:允许在基础架构节点上创建本地存储。

    您可能希望使用 Local Storage Operator 在基础架构节点上创建卷来支持一些组件,如日志记录和监控。

    您必须调整默认节点选择器,以便 Local Storage Operator 包含基础架构节点,而不只是 worker 节点。

    要阻止 Local Storage Operator 继承集群范围的默认选择器,请输入以下命令:

    $ oc annotate namespace openshift-local-storage openshift.io/node-selector=''
  3. 可选:允许在单节点部署中的 CPU 管理池中运行本地存储。

    在单节点部署中使用 Local Storage Operator,并允许使用属于 management 池的 CPU。在使用管理工作负载分区的单节点安装上执行这个步骤。

    要允许 Local Storage Operator 在管理 CPU 池上运行,请运行以下命令:

    $ oc annotate namespace openshift-local-storage workload.openshift.io/allowed='management'

使用 UI

按照以下步骤,通过 web 控制台安装 Local Storage Operator:

  1. 登陆到 OpenShift Container Platform Web 控制台。
  2. 导航至 Operators OperatorHub
  3. 在过滤器框中键入 Local Storage 以查找 Local Storage Operator。
  4. 点击 Install
  5. Install Operator 页面中,选择 A specific namespace on the cluster。从下拉菜单中选择 openshift-local-storage
  6. Update ChannelApproval Strategy 的值调整为所需的值。
  7. 点击 Install

完成后,Web 控制台的 Installed Operators 部分中会列出 Local Storage Operator。

使用 CLI

  1. 通过 CLI 安装 Local Storage Operator。

    1. 创建对象 YAML 文件,以定义 Local Storage Operator 的 Operator 组和订阅,如 openshift-local-storage.yaml:

      openshift-local-storage.yaml 示例

      apiVersion: operators.coreos.com/v1
      kind: OperatorGroup
      metadata:
        name: local-operator-group
        namespace: openshift-local-storage
      spec:
        targetNamespaces:
          - openshift-local-storage
      ---
      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
        name: local-storage-operator
        namespace: openshift-local-storage
      spec:
        channel: stable
        installPlanApproval: Automatic 1
        name: local-storage-operator
        source: redhat-operators
        sourceNamespace: openshift-marketplace

      1
      安装计划的用户批准策略。
  2. 输入以下命令来创建 Local Storage Operator 对象:

    $ oc apply -f openshift-local-storage.yaml

    在此阶段,Operator Lifecycle Manager (OLM) 已可以了解 Local Storage Operator。Operator 的 ClusterServiceVersion (CSV) 应出现在目标命名空间中,由 Operator 提供的 API 应可用于创建。

  3. 通过检查是否创建了所有 pod 和 Local Storage Operator 来验证本地存储安装:

    1. 检查是否已创建所有必需的 pod:

      $ oc -n openshift-local-storage get pods

      输出示例

      NAME                                      READY   STATUS    RESTARTS   AGE
      local-storage-operator-746bf599c9-vlt5t   1/1     Running   0          19m

    2. 检查 ClusterServiceVersion (CSV) YAML 清单,查看 openshift-local-storage 项目中是否有 Local Storage Operator:

      $ oc get csvs -n openshift-local-storage

      输出示例

      NAME                                         DISPLAY         VERSION               REPLACES   PHASE
      local-storage-operator.4.2.26-202003230335   Local Storage   4.2.26-202003230335              Succeeded

如果通过了所有检查,则代表 Local Storage Operator 已被成功安装。

4.12.2.2. 使用 Local Storage Operator 置备本地卷

无法通过动态置备来创建本地卷。相反,持久性卷可由 Local Storage Operator 创建。本地卷置备程序会在定义的资源中指定的路径上查找任意文件系统或块设备。

先决条件

  • 安装了 Local Storage Operator。
  • 您有一个满足以下条件的本地磁盘:

    • 它附加到一个节点。
    • 它尚未挂载。
    • 它不包含分区。

流程

  1. 创建本地卷资源。此资源必须定义本地卷的节点和路径。

    注意

    不要在同一设备中使用不同的存储类名称。这样做可创建多个持久性卷 (PV)。

    例如:Filesystem

    apiVersion: "local.storage.openshift.io/v1"
    kind: "LocalVolume"
    metadata:
      name: "local-disks"
      namespace: "openshift-local-storage" 1
    spec:
      nodeSelector: 2
        nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - ip-10-0-140-183
              - ip-10-0-158-139
              - ip-10-0-164-33
      storageClassDevices:
        - storageClassName: "local-sc" 3
          forceWipeDevicesAndDestroyAllData: false 4
          volumeMode: Filesystem 5
          fsType: xfs 6
          devicePaths: 7
            - /path/to/device 8

    1
    安装了 Local Storage Operator 的命名空间。
    2
    可选:包含附加了本地存储卷的节点列表的节点选择器。本例使用从 oc get node 获取的节点主机名。如果没有定义值,则 Local Storage Operator 会尝试在所有可用节点上查找匹配的磁盘。
    3
    创建持久性卷对象时使用的存储类的名称。如果不存在,Local Storage Operator 会自动创建存储类。确保使用唯一标识此本地卷的存储类。
    4
    此设置定义是否调用 wipefs,它会删除分区表签名 (magic strings),使磁盘准备好用于 Local Storage Operator (LSO) 置备。除了签名外,没有其它数据会被清除。默认为 "false" (不调用 wipefs )。当在需要重新使用的磁盘中,将 forceWipeDevicesAndDestroyAllData 设置为 "true" 很有用。在这些情况下,将此字段设置为 true 可消除管理员手动擦除磁盘的需要。此类情况可以包括单节点 OpenShift (SNO) 集群环境,其中节点可以多次重新部署,或使用 OpenShift Data Foundation (ODF),其中之前的数据可以保留在计划作为对象存储设备 (OSD) 消耗的磁盘上。
    5
    定义本地卷类型的卷模式,可以是 FilesystemBlock
    注意

    原始块卷 (volumeMode: Block) 不会被格式化为文件系统。仅在 pod 上运行的任何应用程序都可以使用原始块设备时使用此模式。

    6
    第一次挂载本地卷时所创建的文件系统。
    7
    包含要从中选择的本地存储设备列表的路径。
    8
    使用到 LocalVolume 资源 by-id 的实际本地磁盘文件路径(如 /dev/disk/by-id/wwn)替换这个值。当置备程序已被成功部署时,会为这些本地磁盘创建 PV。
    注意

    如果使用 RHEL KVM 运行 OpenShift Container Platform,则必须为虚拟机磁盘分配序列号。否则,重启后无法识别虚拟机磁盘。您可以使用 virsh edit <VM> 命令添加 <serial>mydisk</serial> 定义。

    例如:Block

    apiVersion: "local.storage.openshift.io/v1"
    kind: "LocalVolume"
    metadata:
      name: "local-disks"
      namespace: "openshift-local-storage" 1
    spec:
      nodeSelector: 2
        nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - ip-10-0-136-143
              - ip-10-0-140-255
              - ip-10-0-144-180
      storageClassDevices:
        - storageClassName: "local-sc" 3
          forceWipeDevicesAndDestroyAllData: false 4
          volumeMode: Block 5
          devicePaths: 6
            - /path/to/device 7

    1
    安装了 Local Storage Operator 的命名空间。
    2
    可选:包含附加了本地存储卷的节点列表的节点选择器。本例使用从 oc get node 获取的节点主机名。如果没有定义值,则 Local Storage Operator 会尝试在所有可用节点上查找匹配的磁盘。
    3
    创建持久性卷对象时使用的存储类的名称。
    4
    此设置定义是否调用 wipefs,它会删除分区表签名 (magic strings),使磁盘准备好用于 Local Storage Operator (LSO) 置备。除了签名外,没有其它数据会被清除。默认为 "false" (不调用 wipefs )。当在需要重新使用的磁盘中,将 forceWipeDevicesAndDestroyAllData 设置为 "true" 很有用。在这些情况下,将此字段设置为 true 可消除管理员手动擦除磁盘的需要。此类情况可以包括单节点 OpenShift (SNO) 集群环境,其中节点可以多次重新部署,或使用 OpenShift Data Foundation (ODF),其中之前的数据可以保留在计划作为对象存储设备 (OSD) 消耗的磁盘上。
    5
    定义本地卷类型的卷模式,可以是 FilesystemBlock
    6
    包含要从中选择的本地存储设备列表的路径。
    7
    使用到 LocalVolume 资源 by-id 的实际本地磁盘文件路径(如 dev/disk/by-id/wwn)替换这个值。当置备程序已被成功部署时,会为这些本地磁盘创建 PV。
    注意

    如果使用 RHEL KVM 运行 OpenShift Container Platform,则必须为虚拟机磁盘分配序列号。否则,重启后无法识别虚拟机磁盘。您可以使用 virsh edit <VM> 命令添加 <serial>mydisk</serial> 定义。

  2. 在 OpenShift Container Platform 集群中创建本地卷资源。指定您刚才创建的文件:

    $ oc create -f <local-volume>.yaml
  3. 验证置备程序是否已创建并创建了相应的守护进程集:

    $ oc get all -n openshift-local-storage

    输出示例

    NAME                                          READY   STATUS    RESTARTS   AGE
    pod/diskmaker-manager-9wzms                   1/1     Running   0          5m43s
    pod/diskmaker-manager-jgvjp                   1/1     Running   0          5m43s
    pod/diskmaker-manager-tbdsj                   1/1     Running   0          5m43s
    pod/local-storage-operator-7db4bd9f79-t6k87   1/1     Running   0          14m
    
    NAME                                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
    service/local-storage-operator-metrics   ClusterIP   172.30.135.36   <none>        8383/TCP,8686/TCP   14m
    
    NAME                               DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
    daemonset.apps/diskmaker-manager   3         3         3       3            3           <none>          5m43s
    
    NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/local-storage-operator   1/1     1            1           14m
    
    NAME                                                DESIRED   CURRENT   READY   AGE
    replicaset.apps/local-storage-operator-7db4bd9f79   1         1         1       14m

    注意所需和当前的守护进程设定进程数。所需的数量为 0 表示标签选择器无效。

  4. 验证持久性卷是否已创建:

    $ oc get pv

    输出示例

    NAME                CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
    local-pv-1cec77cf   100Gi      RWO            Delete           Available           local-sc                88m
    local-pv-2ef7cd2a   100Gi      RWO            Delete           Available           local-sc                82m
    local-pv-3fa1c73    100Gi      RWO            Delete           Available           local-sc                48m

重要

编辑 LocalVolume 对象不会更改现有持久性卷的 fsTypevolumeMode,因为这样做可能会导致破坏性操作。

4.12.2.3. 在没有 Local Storage Operator 的情况下置备本地卷

无法通过动态置备来创建本地卷。反之,可以通过在对象定义中定义持久性卷(PV)来创建持久性卷。本地卷置备程序会在定义的资源中指定的路径上查找任意文件系统或块设备。

重要

手动置备 PV 的风险包括在删除 PVC 时,在 PV 间可能会出现数据泄漏的问题。建议在置备本地 PV 时自动执行 Local Storage Operator。

先决条件

  • 本地磁盘已附加到 OpenShift Container Platform 节点。

流程

  1. 定义 PV。使用 PersistentVolume 对象定义创建一个文件,如 example-pv-filesystem.yamlexample-pv-block.yaml。此资源必须定义本地卷的节点和路径。

    注意

    不要在同一设备中使用不同的存储类名称。这将会创建多个 PV。

    example-pv-filesystem.yaml

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: example-pv-filesystem
    spec:
      capacity:
        storage: 100Gi
      volumeMode: Filesystem 1
      accessModes:
      - ReadWriteOnce
      persistentVolumeReclaimPolicy: Delete
      storageClassName: local-sc 2
      local:
        path: /dev/xvdf 3
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - example-node

    1
    定义 PV 类型的卷模式,可以是 FilesystemBlock
    2
    创建 PV 资源时使用的存储类的名称。使用唯一标识此 PV 的存储类。
    3
    包含要从中选择的本地存储设备列表的路径,或一个目录。您只能指定 Filesystem volumeMode 的目录。
    注意

    原始块卷(volumeMode: block)不能以文件系统格式化。仅在 pod 上运行的任何应用程序都可以使用原始块设备时使用此模式。

    example-pv-block.yaml

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: example-pv-block
    spec:
      capacity:
        storage: 100Gi
      volumeMode: Block 1
      accessModes:
      - ReadWriteOnce
      persistentVolumeReclaimPolicy: Delete
      storageClassName: local-sc 2
      local:
        path: /dev/xvdf 3
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - example-node

    1
    定义 PV 类型的卷模式,可以是 FilesystemBlock
    2
    创建 PV 资源时使用的存储类的名称。确保使用唯一标识此 PV 的存储类。
    3
    包含要从中选择的本地存储设备列表的路径。
  2. 在 OpenShift Container Platform 集群中创建 PV 资源。指定您刚才创建的文件:

    $ oc create -f <example-pv>.yaml
  3. 验证是否已创建本地 PV:

    $ oc get pv

    输出示例

    NAME                    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                STORAGECLASS    REASON   AGE
    example-pv-filesystem   100Gi      RWO            Delete           Available                        local-sc            3m47s
    example-pv1             1Gi        RWO            Delete           Bound       local-storage/pvc1   local-sc            12h
    example-pv2             1Gi        RWO            Delete           Bound       local-storage/pvc2   local-sc            12h
    example-pv3             1Gi        RWO            Delete           Bound       local-storage/pvc3   local-sc            12h

4.12.2.4. 创建本地卷持久性卷声明

必须静态创建本地卷作为持久性卷声明(PVC),才能被 pod 访问。

先决条件

  • 持久性卷是使用本地卷置备程序创建的。

流程

  1. 使用对应的存储类创建 PVC:

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: local-pvc-name 1
    spec:
      accessModes:
      - ReadWriteOnce
      volumeMode: Filesystem 2
      resources:
        requests:
          storage: 100Gi 3
      storageClassName: local-sc 4
    1
    PVC 的名称。
    2
    PVC 的类型。默认为 Filesystem
    3
    PVC 可用的存储量。
    4
    声明所需的存储类的名称。
  2. 通过指定您刚才创建的文件,在 OpenShift Container Platform 集群中创建 PVC:

    $ oc create -f <local-pvc>.yaml

4.12.2.5. 附加本地声明

本地卷映射到持久性卷声明后,可在资源内指定。

先决条件

  • 同一命名空间中存在持久性卷声明。

流程

  1. 在资源规格中包含定义的声明。以下示例在 pod 中声明持久性卷声明:

    apiVersion: v1
    kind: Pod
    spec:
    # ...
      containers:
        volumeMounts:
        - name: local-disks 1
          mountPath: /data 2
      volumes:
      - name: local-disks
        persistentVolumeClaim:
          claimName: local-pvc-name 3
    # ...
    1
    要挂载的卷的名称。
    2
    卷在 pod 中的挂载路径。不要挂载到容器 root、/ 或主机和容器中相同的任何路径。如果容器有足够权限,可能会损坏您的主机系统(如主机的 /dev/pts 文件)。使用 /host 挂载主机是安全的。
    3
    要使用的现有持久性卷声明的名称。
  2. 通过指定您刚才创建的文件,在 OpenShift Container Platform 集群中创建资源:

    $ oc create -f <local-pod>.yaml

4.12.2.6. 为本地存储设备自动发现和置备

Local Storage Operator 自动进行本地存储发现和置备。使用此功能,您可以在部署过程中不提供动态置备(如使用裸机、VMware 或带有附加设备的 AWS 存储实例)时简化安装。

重要

自动发现和置备只是一个技术预览功能。技术预览功能不被红帽产品服务等级协议 (SLA) 支持,且可能在功能方面有缺陷。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

重要

在使用内部部署 Red Hat OpenShift Data Foundation 或与平台无关的部署时,完全支持自动发现和置备。

使用以下步骤自动发现本地设备,并为所选设备自动置备本地。

警告

请小心使用 LocalVolumeSet 对象。当您从本地磁盘自动置备持久性卷(PV)时,本地 PV 可能会声明所有匹配的设备。如果使用 LocalVolumeSet 对象,请确保 Local Storage Operator 是管理该节点上本地设备的唯一实体。不支持针对一个节点创建多个 LocalVolumeSet 实例。

先决条件

  • 有集群管理员权限。
  • 已安装 Local Storage Operator。
  • 已将本地磁盘附加到 OpenShift Container Platform 节点。
  • 您可以访问 OpenShift Container Platform web 控制台和 oc 命令行界面(CLI)。

流程

  1. 通过 web 控制台启用本地设备的自动发现:

    1. Operators Installed Operators
    2. openshift-local-storage 命名空间中,点 Local Storage
    3. Local Volume Discovery 选项卡。
    4. Create Local Volume Discovery,然后选择 Form viewYAML view
    5. 配置 LocalVolumeDiscovery 对象参数。
    6. Create

      Local Storage Operator 创建名为 auto-discover-devices 的本地卷发现实例。

  2. 显示节点上持续可用的设备列表:

    1. 登陆到 OpenShift Container Platform Web 控制台。
    2. 进入 Compute Nodes
    3. 点要打开的节点名称。此时会显示 "Node Details" 页面。
    4. 选择 Disks 标签显示所选设备的列表。

      在添加或删除本地磁盘时,设备列表会持续更新。您可以根据名称、状态、类型、型号、容量和模式过滤设备。

  3. 从 web 控制台为发现的设备自动置备本地卷:

    1. 导航到 Operators Installed Operators,再从 Operators 列表中选择 Local Storage
    2. 选择 Local Volume Set Create Local Volume Set
    3. 输入卷集合名称和存储类名称。
    4. 选择 All nodesSelect nodes 以相应地应用过滤器。

      注意

      无论是使用 All nodesSelect nodes 进行过滤,只有 worker 节点可用。

    5. 选择您要应用到本地卷集的磁盘类型、模式、大小和限制,然后点 Create

      几分钟后会显示一条信息,表示 "Operator reconciled successfullyd successfully."

  4. 另外,也可通过 CLI 为发现的设备置备本地卷:

    1. 创建一个对象 YAML 文件来定义本地卷集,如 local-volume-set.yaml,如下例所示:

      apiVersion: local.storage.openshift.io/v1alpha1
      kind: LocalVolumeSet
      metadata:
        name: example-autodetect
      spec:
        nodeSelector:
          nodeSelectorTerms:
            - matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                    - worker-0
                    - worker-1
        storageClassName: local-sc 1
        volumeMode: Filesystem
        fsType: ext4
        maxDeviceCount: 10
        deviceInclusionSpec:
          deviceTypes: 2
            - disk
            - part
          deviceMechanicalProperties:
            - NonRotational
          minSize: 10G
          maxSize: 100G
          models:
            - SAMSUNG
            - Crucial_CT525MX3
          vendors:
            - ATA
            - ST2000LM
      1
      决定为从发现的设备置备的持久性卷创建的存储类。如果不存在,Local Storage Operator 会自动创建存储类。确保使用唯一标识此本地卷的存储类。
      2
      当使用本地卷设置功能时,Local Storage Operator 不支持使用逻辑卷管理(LVM)设备。
    2. 创建本地卷集对象:

      $ oc apply -f local-volume-set.yaml
    3. 根据存储类验证本地持久性卷是否被动态置备:

      $ oc get pv

      输出示例

      NAME                CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
      local-pv-1cec77cf   100Gi      RWO            Delete           Available           local-sc                88m
      local-pv-2ef7cd2a   100Gi      RWO            Delete           Available           local-sc                82m
      local-pv-3fa1c73    100Gi      RWO            Delete           Available           local-sc                48m

注意

结果会在从节点中删除后删除。必须手动删除符号链接。

4.12.2.7. 使用 Local Storage Operator pod 的容限

污点可用于节点,以防止它们运行常规工作负载。要允许 Local Storage Operator 使用污点节点,您必须在 PodDaemonSet 定义中添加容限。这允许在这些污点节点上运行所创建的资源。

您可以通过 LocalVolume 资源把容限应用到 Local Storage Operator pod,通过节点规格把污点应用到一个节点。节点上的污点指示节点排斥所有不容许该污点的 pod。使用一个没有存在于其他 pod 上的特定污点可确保 Local Storage Operator pod 也可以在该节点上运行。

重要

污点与容限由 key、value 和 effect 组成。作为参数,它表示为 key=value:effect。运算符允许您将其中一个参数留空。

先决条件

  • 安装了 Local Storage Operator。
  • 本地磁盘已附加到带有一个污点的 OpenShift Container Platform 节点上。
  • 污点节点可以置备本地存储。

流程

配置本地卷以便在污点节点上调度:

  1. 修改定义 Pod 的 YAML 文件并添加 LocalVolume 规格,如下例所示:

      apiVersion: "local.storage.openshift.io/v1"
      kind: "LocalVolume"
      metadata:
        name: "local-disks"
        namespace: "openshift-local-storage"
      spec:
        tolerations:
          - key: localstorage 1
            operator: Equal 2
            value: "localstorage" 3
        storageClassDevices:
            - storageClassName: "local-sc"
              volumeMode: Block 4
              devicePaths: 5
                - /dev/xvdg
    1
    指定添加到节点的键。
    2
    指定 Equal 运算符,以要求 key/value 参数匹配。如果运算符是 Exists,系统会检查键是否存在并忽略它的值。如果运算符是 Equal,则键和值必须匹配。
    3
    指定污点节点的 local 值。
    4
    定义本地卷类型的卷模式,可以是 FilesystemBlock
    5
    包含要从中选择的本地存储设备列表的路径。
  2. 可选: 要只在污点节点上创建本地持久性卷,修改 YAML 文件并添加 LocalVolume spec,如下例所示:

    spec:
      tolerations:
        - key: node-role.kubernetes.io/master
          operator: Exists

定义的容限度将传递给生成的守护进程集,允许为包含指定污点的节点创建 diskmaker 和 provisioner pod。

4.12.2.8. Local Storage Operator 指标

OpenShift Container Platform 为 Local Storage Operator 提供以下指标:

  • lso_discovery_disk_count:每个节点中发现的设备总数
  • lso_lvset_provisioned_PV_count: LocalVolumeSet 对象创建的 PV 总数
  • lso_lvset_unmatched_disk_count: Local Storage Operator 没有选择进行置备的磁盘总数,因为不匹配条件
  • lso_lvset_orphaned_symlink_count: 使用 PV 的设备数,它们不再与 LocalVolumeSet 对象标准匹配
  • lso_lv_orphaned_symlink_count :包含 PV 的设备数,它们不再符合 LocalVolume 对象标准
  • lso_lv_provisioned_PV_count: LocalVolume置备的 PV 总数

要使用这些指标,请务必:

  • 安装 Local Storage Operator 时启用对监控的支持。
  • 当升级到 OpenShift Container Platform 4.9 或更高版本时,通过将 operator-metering=true 标签添加到命名空间来手动启用指标支持。

有关指标的更多信息,请参阅管理指标

4.12.2.9. 删除 Local Storage Operator 资源

4.12.2.9.1. 删除本地卷或本地卷集

在一些情况下,必须删除本地卷和本地卷集。虽然删除资源中的条目并删除持久性卷通常就足够,但如果您想要重复使用同一设备路径或者使其不同的存储类进行管理,则需要额外的步骤。

注意

以下流程概述了删除本地卷的示例。同样的步骤也可以用于删除本地卷设置自定义资源的符号链接。

先决条件

  • 持久性卷必须处于 ReleasedAvailable 状态。

    警告

    删除仍在使用中的持久性卷可能会导致数据丢失或崩溃。

流程

  1. 编辑之前创建的本地卷以删除所有不需要的磁盘。

    1. 编辑集群资源:

      $ oc edit localvolume <name> -n openshift-local-storage
    2. 找到 devicePaths 下的行,删除所有代表不需要的磁盘的行。
  2. 删除所有创建的持久性卷。

    $ oc delete pv <pv-name>
  3. 删除目录并包含节点上的符号链接。

    警告

    以下步骤涉及以 root 用户身份访问节点。如果在本流程中步骤范围以外修改节点状态,则可能会导致集群不稳定。

    $ oc debug node/<node-name> -- chroot /host rm -rf /mnt/local-storage/<sc-name> 1
    1
    用于创建本地卷的存储类的名称。
4.12.2.9.2. 卸载 Local Storage Operator

要卸载 Local Storage Operator,您必须删除 Operator 以及 openshift-local-storage 项目中创建的所有资源。

警告

当本地存储 PV 仍在使用时,不建议卸载 Local Storage Operator。当 Operator 被移除后 PV 仍然会被保留。但是如果在没有删除 PV 和本地存储资源的情况下重新安装 Operator,则可能会出现不确定的行为。

先决条件

  • 访问 OpenShift Container Platform Web 控制台。

流程

  1. 删除项目中安装的任何本地卷资源,如 localvolumelocalvolumesetlocalvolumediscovery:

    $ oc delete localvolume --all --all-namespaces
    $ oc delete localvolumeset --all --all-namespaces
    $ oc delete localvolumediscovery --all --all-namespaces
  2. 从 Web 控制台卸载 Local Storage Operator。

    1. 登陆到 OpenShift Container Platform Web 控制台。
    2. 导航到 Operators Installed Operators
    3. 在过滤器框中键入 Local Storage 以查找 Local Storage Operator。
    4. 点击 Local Storage Operator 末尾的 Options 菜单 kebab
    5. 点击 Uninstall Operator
    6. 在出现的窗口中点击 Remove
  3. 由 Local Storage Operator 创建的 PV 将保留在集群中,直到被删除为止。这些卷不再使用后,运行以下命令删除它们:

    $ oc delete pv <pv-name>
  4. 删除 openshift-local-storage 项目:

    $ oc delete project openshift-local-storage

4.12.3. 使用 hostPath 的持久性存储

OpenShift Container Platform 集群中的 hostPath 卷将主机节点的文件系统中的文件或目录挂载到 pod 中。大多数 pod 都不需要 hostPath 卷,但是如果应用程序需要它,它会提供一个快速的测试选项。

重要

集群管理员必须将 pod 配置为以特权方式运行。这样可访问同一节点上的 pod。

4.12.3.1. 概述

OpenShift Container Platform 支持在单节点集群中使用 hostPath 挂载用于开发和测试目的。

在用于生产环境的集群中,不要使用 hostPath。集群管理员会置备网络资源,如 GCE Persistent Disk 卷、NFS 共享或 Amazon EBS 卷。网络资源支持使用存储类设置动态置备。

hostPath 卷必须静态置备 。

重要

不要挂载到容器 root、/ 或主机和容器中相同的任何路径。如果容器有足够权限,可能会损坏您的主机系统。使用 /host 挂载主机是安全的。以下示例显示主机中的 / 目录被挂载到位于 /host 的容器中。

apiVersion: v1
kind: Pod
metadata:
  name: test-host-mount
spec:
  containers:
  - image: registry.access.redhat.com/ubi9/ubi
    name: test-container
    command: ['sh', '-c', 'sleep 3600']
    volumeMounts:
    - mountPath: /host
      name: host-slash
  volumes:
   - name: host-slash
     hostPath:
       path: /
       type: ''

4.12.3.2. 静态置备 hostPath 卷

使用 hostPath 卷的 pod 必须通过手动(静态)置备来引用。

流程

  1. 定义持久性卷(PV)的名称。创建包含 PersistentVolume 对象定义的 pv.yaml 文件:

      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: task-pv-volume 1
        labels:
          type: local
      spec:
        storageClassName: manual 2
        capacity:
          storage: 5Gi
        accessModes:
          - ReadWriteOnce 3
        persistentVolumeReclaimPolicy: Retain
        hostPath:
          path: "/mnt/data" 4
    1
    卷的名称。持久性卷声明或 pod 识别它的名称。
    2
    用于将持久性卷声明请求绑定到这个持久性卷。
    3
    这个卷可以被一个单一的节点以 read-write 的形式挂载。
    4
    配置文件指定卷在集群节点的 /mnt/data 中。不要挂载到容器 root、/ 或主机和容器中相同的任何路径。这可能会导致您的主机系统损坏。使用 /host 挂载主机是安全的。
  2. 从该文件创建 PV:

    $ oc create -f pv.yaml
  3. 定义持久性卷声明(PVC)。创建包含 PersistentVolumeClaim 对象定义的 pvc.yaml 文件:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: task-pvc-volume
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
      storageClassName: manual
  4. 从文件创建 PVC:

    $ oc create -f pvc.yaml

4.12.3.3. 在特权 pod 中挂载 hostPath 共享

创建持久性卷声明后,应用程序就可以使用它。以下示例演示了在 pod 中挂载此共享。

先决条件

  • 已存在一个映射到底层 hostPath 共享的持久性卷声明。

流程

  • 创建可挂载现有持久性卷声明的特权 pod:

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-name 1
    spec:
      containers:
        ...
        securityContext:
          privileged: true 2
        volumeMounts:
        - mountPath: /data 3
          name: hostpath-privileged
      ...
      securityContext: {}
      volumes:
        - name: hostpath-privileged
          persistentVolumeClaim:
            claimName: task-pvc-volume 4
    1
    pod 的名称。
    2
    pod 必须以特权运行,才能访问节点的存储。
    3
    在特权 pod 中挂载主机路径共享的路径。不要挂载到容器 root、/ 或主机和容器中相同的任何路径。如果容器有足够权限,可能会损坏您的主机系统(如主机的 /dev/pts 文件)。使用 /host 挂载主机是安全的。
    4
    之前创建的 PersistentVolumeClaim 对象的名称。

4.12.4. 使用逻辑卷管理器存储的持久性存储

逻辑卷管理器 (LVM) 存储通过 TopoLVM CSI 驱动程序使用 LVM2,以便在具有有限资源的集群中动态置备本地存储。

您可以使用 LVM 存储创建卷组、持久性卷声明(PVC)、卷快照和卷克隆。

4.12.4.1. 逻辑卷管理器存储安装

您可以在 OpenShift Container Platform 集群上安装逻辑卷管理器 (LVM) 存储,并将其配置为为您的工作负载动态置备存储。

您可以使用 OpenShift Container Platform CLI (oc)、OpenShift Container Platform Web 控制台或 Red Hat Advanced Cluster Management (RHACM) 安装 LVM 存储。

警告

当在多节点集群中使用 LVM 存储时,LVM 存储只支持置备本地存储。LVM 存储不支持跨节点的存储数据复制机制。您必须通过主动或被动复制机制来确保存储数据复制,以避免出现单点故障。

4.12.4.1.1. 安装 LVM 存储的先决条件

安装 LVM 存储的先决条件如下:

  • 确保至少有 10 milliCPU 和 100 MiB RAM。
  • 确保每个受管集群都有用于置备存储的专用磁盘。LVM 存储只使用那些为空且不包含文件系统签名的磁盘。为确保磁盘为空,且不包含文件系统签名,请在使用磁盘前擦除磁盘。
  • 在私有 CI 环境中安装 LVM 存储前,您可以重复使用您在之前的 LVM 存储安装中配置的存储设备,请确保您已擦除未使用的磁盘。如果您在安装 LVM 存储前没有擦除磁盘,则无法重复使用磁盘,而无需人工干预。

    注意

    您不能擦除正在使用的磁盘。

  • 如果要使用 Red Hat Advanced Cluster Management (RHACM) 安装 LVM 存储,请确保已在 OpenShift Container Platform 集群上安装 RHACM。请参阅"使用 RHACM 安装 LVM 存储"部分。
4.12.4.1.2. 使用 CLI 安装 LVM 存储

作为集群管理员,您可以使用 OpenShift CLI 安装 LVM 存储。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 已以具有 cluster-admin 和 Operator 安装权限的用户身份登录 OpenShift Container Platform。

流程

  1. 使用用于创建命名空间的配置创建 YAML 文件:

    创建命名空间的 YAML 配置示例

    apiVersion: v1
    kind: Namespace
    metadata:
      labels:
        openshift.io/cluster-monitoring: "true"
        pod-security.kubernetes.io/enforce: privileged
        pod-security.kubernetes.io/audit: privileged
        pod-security.kubernetes.io/warn: privileged
      name: openshift-storage

  2. 运行以下命令创建命名空间:

    $ oc create -f <file_name>
  3. 创建 OperatorGroup CR YAML 文件:

    OperatorGroup CR 示例

    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: openshift-storage-operatorgroup
      namespace: openshift-storage
    spec:
      targetNamespaces:
      - openshift-storage

  4. 运行以下命令来创建 OperatorGroup CR:

    $ oc create -f <file_name>
  5. 创建 Subscription CR YAML 文件:

    Subscription CR 示例

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: lvms
      namespace: openshift-storage
    spec:
      installPlanApproval: Automatic
      name: lvms-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace

  6. 运行以下命令来创建 Subscription CR:

    $ oc create -f <file_name>

验证

  1. 要验证 LVM 存储是否已安装,请运行以下命令:

    $ oc get csv -n openshift-storage -o custom-columns=Name:.metadata.name,Phase:.status.phase

    输出示例

    Name                         Phase
    4.13.0-202301261535          Succeeded

4.12.4.1.3. 使用 Web 控制台安装 LVM 存储

您可以使用 OpenShift Container Platform Web 控制台安装 LVM Storage。

先决条件

  • 您可以访问集群。
  • 您可以使用 cluster-admin 和 Operator 安装权限访问 OpenShift Container Platform。

流程

  1. 登陆到 OpenShift Container Platform Web 控制台。
  2. Operators OperatorHub
  3. OperatorHub 页面中的 LVM Storage
  4. Operator 安装页面中设置以下选项 :

    1. 更新频道stable-4.16
    2. Installation ModeA specific namespace on the cluster
    3. Installed NamespaceOperator recommended namespace openshift-storage。如果 openshift-storage 命名空间不存在,它会在 Operator 安装过程中创建。
    4. Update approval 设置为 AutomaticManual

      注意

      如果选择 Automatic 更新,Operator Lifecycle Manager (OLM) 将自动更新 LVM Storage 的运行实例,而无需任何干预。

      如果选择 手动 更新,则 OLM 会创建一个更新请求。作为集群管理员,您必须手动批准更新请求,以便将 LVM 存储更新至更新的版本。

  5. 可选:选择 Enable Operator recommended cluster monitoring on this Namespace 复选框。
  6. Install

验证步骤

  • 验证 LVM 存储是否显示绿色勾号,代表安装成功。
4.12.4.1.4. 在断开连接的环境中安装 LVM 存储

您可以在断开连接的环境中的 OpenShift Container Platform 上安装 LVM 存储。此流程中引用的所有部分都链接到 "Additional resources" 部分。

先决条件

  • 您可以阅读"关于断开连接的安装镜像"部分。
  • 您可以访问 OpenShift Container Platform 镜像存储库。
  • 您创建了镜像 registry。

流程

  1. 按照"创建镜像设置配置"中的步骤操作。要为 LVM Storage 创建 ImageSetConfiguration 自定义资源 (CR),您可以使用以下示例 ImageSetConfiguration CR 配置:

    LVM 存储的 ImageSetConfiguration CR 示例

    kind: ImageSetConfiguration
    apiVersion: mirror.openshift.io/v1alpha2
    archiveSize: 4 1
    storageConfig: 2
      registry:
        imageURL: example.com/mirror/oc-mirror-metadata 3
        skipTLS: false
    mirror:
      platform:
        channels:
        - name: stable-4.16 4
          type: ocp
        graph: true 5
      operators:
      - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.16 6
        packages:
        - name: lvms-operator 7
          channels:
          - name: stable 8
      additionalImages:
      - name: registry.redhat.io/ubi9/ubi:latest 9
      helm: {}

    1
    设置镜像集合中每个文件的最大大小(以 GiB 为单位)。
    2
    指定要保存镜像集的位置。此位置可以是 registry 或本地目录。除非使用技术预览 OCI 功能,否则您必须配置 storageConfig 字段。
    3
    在使用 registry 时指定镜像流的存储 URL。如需更多信息,请参阅为什么使用镜像流
    4
    指定您要从中检索 OpenShift Container Platform 镜像的频道。
    5
    将此字段设置为 true 来生成 OpenShift Update Service (OSUS) 图形镜像。如需更多信息,请参阅关于 OpenShift Update Service
    6
    指定您要从中检索 OpenShift Container Platform 镜像的 Operator 目录。
    7
    指定要包含在镜像集中的 Operator 软件包。如果此字段为空,则检索目录中的所有软件包。
    8
    指定要包含在镜像集中的 Operator 软件包的频道。即使不使用该频道中的捆绑包,还必须包含 Operator 软件包的默认频道。您可以运行以下命令来找到默认频道:$ oc mirror list operators --catalog=<catalog_name> --package=<package_name>.
    9
    指定要在镜像集中包含的任何其他镜像。
  2. 按照"镜像 registry"部分中的步骤操作。
  3. 按照"配置镜像 registry 存储库镜像"部分中的步骤操作。
4.12.4.1.5. 使用 RHACM 安装 LVM 存储

要使用 Red Hat Advanced Cluster Management (RHACM) 在集群中安装 LVM 存储,您必须创建一个 Policy 自定义资源 (CR)。您还可以配置条件来选择您要在其上安装 LVM 存储的集群。

注意

为安装 LVM 存储而创建的 Policy CR 也应用于在创建 Policy CR 后导入或创建的集群。

先决条件

  • 您可以使用具有 cluster-admin 和 Operator 安装权限的账户访问 RHACM 集群。
  • 您有专用磁盘,LVM 存储可在每个集群上使用。
  • 集群必须由 RHACM 管理。

流程

  1. 使用 OpenShift Container Platform 凭证登录到 RHACM CLI。
  2. 创建命名空间。

    $ oc create ns <namespace>
  3. 创建 Policy CR YAML 文件:

    用于安装和配置 LVM 存储的 Policy CR 示例

    apiVersion: apps.open-cluster-management.io/v1
    kind: PlacementRule
    metadata:
      name: placement-install-lvms
    spec:
      clusterConditions:
      - status: "True"
        type: ManagedClusterConditionAvailable
      clusterSelector: 1
        matchExpressions:
        - key: mykey
          operator: In
          values:
          - myvalue
    ---
    apiVersion: policy.open-cluster-management.io/v1
    kind: PlacementBinding
    metadata:
      name: binding-install-lvms
    placementRef:
      apiGroup: apps.open-cluster-management.io
      kind: PlacementRule
      name: placement-install-lvms
    subjects:
    - apiGroup: policy.open-cluster-management.io
      kind: Policy
      name: install-lvms
    ---
    apiVersion: policy.open-cluster-management.io/v1
    kind: Policy
    metadata:
      annotations:
        policy.open-cluster-management.io/categories: CM Configuration Management
        policy.open-cluster-management.io/controls: CM-2 Baseline Configuration
        policy.open-cluster-management.io/standards: NIST SP 800-53
      name: install-lvms
    spec:
      disabled: false
      remediationAction: enforce
      policy-templates:
      - objectDefinition:
          apiVersion: policy.open-cluster-management.io/v1
          kind: ConfigurationPolicy
          metadata:
            name: install-lvms
          spec:
            object-templates:
            - complianceType: musthave
              objectDefinition: 2
                apiVersion: v1
                kind: Namespace
                metadata:
                  labels:
                    openshift.io/cluster-monitoring: "true"
                    pod-security.kubernetes.io/enforce: privileged
                    pod-security.kubernetes.io/audit: privileged
                    pod-security.kubernetes.io/warn: privileged
                  name: openshift-storage
            - complianceType: musthave
              objectDefinition: 3
                apiVersion: operators.coreos.com/v1
                kind: OperatorGroup
                metadata:
                  name: openshift-storage-operatorgroup
                  namespace: openshift-storage
                spec:
                  targetNamespaces:
                  - openshift-storage
            - complianceType: musthave
              objectDefinition: 4
                apiVersion: operators.coreos.com/v1alpha1
                kind: Subscription
                metadata:
                  name: lvms
                  namespace: openshift-storage
                spec:
                  installPlanApproval: Automatic
                  name: lvms-operator
                  source: redhat-operators
                  sourceNamespace: openshift-marketplace
            remediationAction: enforce
            severity: low

    1
    设置 PlacementRule.spec.clusterSelector 中的 key 字段和 values 字段,以匹配您要在其上安装 LVM 存储的集群中配置的标签。
    2
    命名空间配置。
    3
    OperatorGroup CR 配置。
    4
    Subscription CR 配置。
  4. 运行以下命令来创建 Policy CR:

    $ oc create -f <file_name> -n <namespace>

    创建 Policy CR 后,会在与 PlacementRule CR 中配置的选择条件匹配的集群中创建以下自定义资源:

    • Namespace
    • OperatorGroup
    • 订阅

4.12.4.2. 关于 LVMCluster 自定义资源

您可以配置 LVMCluster CR 以执行以下操作:

  • 创建可用于置备持久性卷声明 (PVC) 的 LVM 卷组。
  • 配置您要添加到 LVM 卷组的设备列表。
  • 配置要求以选择要在其上创建 LVM 卷组的节点,以及卷组的精简池配置。
  • 强制擦除所选设备。

安装 LVM 存储后,您必须创建一个 LVMCluster 自定义资源 (CR)。

LVMCluster CR YAML 文件示例

apiVersion: lvm.topolvm.io/v1alpha1
kind: LVMCluster
metadata:
  name: my-lvmcluster
  namespace: openshift-storage
spec:
  tolerations:
  - effect: NoSchedule
    key: xyz
    operator: Equal
    value: "true"
  storage:
    deviceClasses:
    - name: vg1
      fstype: ext4 1
      default: true
      nodeSelector: 2
        nodeSelectorTerms:
        - matchExpressions:
          - key: mykey
            operator: In
            values:
            - ssd
      deviceSelector: 3
        paths:
        - /dev/disk/by-path/pci-0000:87:00.0-nvme-1
        - /dev/disk/by-path/pci-0000:88:00.0-nvme-1
        optionalPaths:
        - /dev/disk/by-path/pci-0000:89:00.0-nvme-1
        - /dev/disk/by-path/pci-0000:90:00.0-nvme-1
        forceWipeDevicesAndDestroyAllData: true
      thinPoolConfig:
        name: thin-pool-1
        sizePercent: 90 4
        overprovisionRatio: 10
        chunkSize: 128Ki 5
        chunkSizeCalculationPolicy: Static 6

1 2 3 4 5 6
可选字段
LVMCluster CR 中的字段解释

LVMCluster CR 字段在下表中描述:

表 4.5. LVMCluster CR 字段
字段类型描述

spec.storage.deviceClasses

数组

包含将本地存储设备分配给 LVM 卷组的配置。

LVM Storage 为您创建的每个设备类创建一个存储类和卷快照类。

deviceClasses.name

string

为 LVM 卷组 (VG) 指定一个名称。

您还可以将此字段配置为重复使用您在之前安装中创建的卷组。如需更多信息,请参阅"使用之前 LVM 存储安装中的卷组"。

deviceClasses.fstype

string

将此字段设置为 ext4xfs。默认情况下,此字段设置为 xfs

deviceClasses.default

布尔值

将此字段设置为 true 以表示设备类是默认值。否则,您可以将其设置为 false。您只能配置单个默认存储类。

deviceClasses.nodeSelector

object

包含要在其上创建 LVM 卷组的节点的配置。如果此字段为空,则会考虑所有没有调度污点的节点。

在 control-plane 节点上,当新节点在集群中变为活跃时,LVM Storage 会检测到新节点并使用额外的 worker 节点。

nodeSelector.nodeSelectorTerms

数组

配置用于选择节点的要求。

deviceClasses.deviceSelector

object

包含执行以下操作的配置:

  • 指定您要添加到 LVM 卷组的设备的路径。
  • 强制擦除添加到 LVM 卷组的设备。

如需更多信息,请参阅"将设备添加到卷组"。

deviceSelector.paths

数组

指定设备路径。

如果此字段中指定的设备路径不存在,或者 LVM Storage 不支持该设备,则 LVMCluster CR 会进入 Failed 状态。

deviceSelector.optionalPaths

数组

指定可选设备路径。

如果此字段中指定的设备路径不存在,或者 LVM Storage 不支持该设备,LVM Storage 会忽略该设备而不造成错误。

deviceSelector. forceWipeDevicesAndDestroyAllData

布尔值

LVM 存储只使用那些为空且不包含文件系统签名的磁盘。为确保磁盘为空,且不包含文件系统签名,请在使用磁盘前擦除磁盘。

要强制擦除所选设备,请将此字段设置为 true。默认情况下,此字段设置为 false

警告

如果此字段设为 true,则 LVM 存储会擦除设备上所有之前的数据。请谨慎使用此功能。

如果满足以下条件,则设备可能会导致数据完整性不一致:

  • 该设备被用作交换空间。
  • 该设备是 RAID 阵列的一部分。
  • 该设备已被挂载。

如果这些条件为 true,请不要强制擦除磁盘。相反,您必须手动擦除磁盘。

deviceClasses.thinPoolConfig

object

包含在 LVM 卷组中创建精简池的配置。

如果您排除此字段,逻辑卷将被置备。

使用 thick-provisioned 存储包括以下限制:

  • 对卷克隆没有写时复制支持。
  • 不支持快照类。
  • 不支持过度配置。因此,置备的 PersistentVolumeClaims (PVC) 的容量会立即从卷组减少。
  • 不支持精简指标。厚置备的设备只支持卷组指标。

thinPoolConfig.name

string

为精简池指定一个名称。

thinPoolConfig.sizePercent

整数

指定 LVM 卷组中空间的百分比,用于创建精简池。

默认情况下,此字段设置为 90。您可以设置的最小值为 10,最大值为 90。

thinPoolConfig.overprovisionRatio

整数

指定您可以根据精简池中可用存储置备额外存储的因素。

例如,如果此字段设置为 10,您可以在精简池中置备可用存储量最多 10 倍。

要禁用过度置备,请将此字段设置为 1。

thinPoolConfig.chunkSize

整数

为精简池指定静态计算的块大小。只有在 ChunkSizeCalculationPolicy 字段设置为 Static 时才会使用此字段。因为 lvm2 的底层限制,此字段的值需要在 64 KiB 到 1 GiB 的范围内。

如果您没有配置此字段,且 ChunkSizeCalculationPolicy 字段被设置为 Static,则默认块大小设置为 128 KiB。

如需更多信息,请参阅"块大小概述"。

thinPoolConfig.chunkSizeCalculationPolicy

string

指定计算基础卷组块大小的策略。您可以将此字段设置为 StaticHost。默认情况下,此字段设置为 Static

如果此字段设置为 Static,则块大小将设置为 chunkSize 字段的值。如果没有配置 chunkSize 字段,则块大小设置为 128 KiB。

如果此字段设置为 Host,则块大小将根据 lvm.conf 文件中的配置计算。

如需更多信息,请参阅"配置 LVM 存储中使用的设备大小的限制"。

4.12.4.2.1. 配置在 LVM 存储中使用的设备大小的限制

使用 LVM 存储配置可用于置备存储的设备大小的限制如下:

  • 您可以置备的总存储大小受底层逻辑卷管理器(LVM)精简池的大小以及过度置备因素的限制。
  • 逻辑卷的大小取决于物理扩展(PE)和逻辑扩展(LE)的大小。

    • 您可以在创建物理和虚拟设备的过程中定义 PE 和 LE 的大小。
    • 默认的 PE 和 LE 大小为 4 MB。
    • 如果增加 PE 的大小,LVM 的最大大小由内核限值和您的磁盘空间决定。

下表描述了静态和主机配置的块大小和卷大小限制:

表 4.6. 测试的配置
参数value

块大小

128 KiB

最大卷大小

32 TiB

表 4.7. 静态配置的理论大小限制
参数最小值最大值

块大小

64 KiB

1 GiB

卷大小

底层 Red Hat Enterprise Linux CoreOS (RHCOS) 系统的最小大小。

底层 RHCOS 系统的最大大小。

表 4.8. 主机配置的理论大小限制
参数value

块大小

这个值基于 lvm.conf 文件中的配置。默认情况下,这个值被设置为 128 KiB。

最大卷大小

等于底层 RHCOS 系统的最大卷大小。

最小卷大小

等于底层 RHCOS 系统的最小卷大小。

4.12.4.2.2. 关于在卷组中添加设备

LVMCluster CR 中的 deviceSelector 字段包含指定您要添加到 LVM 卷组的设备的路径。

您可以在 deviceSelector.paths 字段,或 deviceSelector.optionalPaths 字段,或这两个字段中指定设备路径。如果您没有在 deviceSelector.paths 字段和 deviceSelector.optionalPaths 字段中指定设备路径,LVM Storage 会将支持的未使用的设备添加到卷组 (VG)。

您可以将路径添加到 deviceSelector 字段中的 RAID 阵列,以将 RAID 阵列与 LVM 存储集成。您可以使用 mdadm 工具创建 RAID 阵列。LVM 存储不支持创建软件 RAID。

注意

您只能在 OpenShift Container Platform 安装过程中创建 RAID 阵列。有关创建 RAID 阵列的详情,请查看以下部分:

您还可以将加密设备添加到卷组中。您可以在 OpenShift Container Platform 安装过程中在集群节点上启用磁盘加密。加密设备后,您可以在 deviceSelector 字段中指定 LUKS 加密设备的路径。有关磁盘加密的详情,请参考"关于磁盘加密"和"配置磁盘加密和镜像"。

LVM 存储必须支持您要添加到 VG 的设备。有关不支持的设备的详情,请参考"LVM Storage 不支持的设备"。

只有在满足以下条件时,LVM 存储才会将设备添加到 VG:

  • 设备路径存在。
  • LVM 存储支持该设备。
重要

将设备添加到 VG 后,您无法删除该设备。

LVM 存储支持动态设备发现。如果您没有在 LVMCluster CR 中添加 deviceSelector 字段,LVM Storage 会在设备可用时自动将新设备添加到 VG。

警告

因为以下原因,不建议通过动态设备发现将设备添加到 VG 中:

  • 当您添加了一个您并不希望添加到 VG 的新设备时,LVM 存储会自动通过动态设备发现功能将这个设备添加到 VG。
  • 如果 LVM 存储通过动态设备发现向 VG 添加了设备,LVM 存储不会限制您从节点中删除该设备。删除或更新已添加到 VG 的设备可能会破坏 VG。这也可能导致数据丢失并需要手动节点补救。
4.12.4.2.3. LVM 存储不支持的设备

当在 LVMCluster 自定义资源(CR)的 deviceSelector 字段中添加设备路径时,请确保 LVM Storage 支持设备。如果您在不支持的设备中添加路径,则 LVM 存储会排除设备以避免管理逻辑卷的复杂性。

如果您没有在 deviceSelector 字段中指定任何设备路径,则 LVM Storage 只添加它支持的未使用设备。

注意

要获取有关设备的信息,请运行以下命令:

$ lsblk --paths --json -o \
NAME,ROTA,TYPE,SIZE,MODEL,VENDOR,RO,STATE,KNAME,SERIAL,PARTLABEL,FSTYPE

LVM 存储不支持以下设备:

只读设备
ro 参数设置为 true 的设备。
暂停设备
state 参数设置为 suspended 的设备。
ROM 设备
type 参数设置为 rom 的设备。
LVM 分区设备
type 参数设置为 lvm 的设备。
具有无效分区标签的设备
partlabel 参数设置为 biosbootreserved 的设备。
带无效文件系统的设备

fstype 参数设置为 nullLVM2_member 以外的任何值的设备。

重要

只有在设备不包含子设备时,LVM Storage 才支持将 fstype 参数设置为 LVM2_member 的设备。

属于另一个卷组的设备

要获取该设备的卷组信息,请运行以下命令:

$ pvs <device-name> 1
1
<device-name> 替换为设备名称。
带有绑定挂载的设备

要获取设备的挂载点,请运行以下命令:

$ cat /proc/1/mountinfo | grep <device-name> 1
1
<device-name> 替换为设备名称。
包含子设备的设备
注意

建议您在 LVM 存储中使用该设备前擦除该设备以防止意外行为。

4.12.4.3. 创建 LVMCluster 自定义资源的方法

您可以使用 OpenShift CLI (oc)或 OpenShift Container Platform Web 控制台创建 LVMCluster 自定义资源 (CR)。如果您使用 Red Hat Advanced Cluster Management (RHACM) 安装 LVM 存储,您还可以使用 RHACM 创建 LVMCluster CR。

创建 LVMCluster CR 后,LVM 存储会创建以下系统管理的 CR:

  • 每个设备类的 storageClassvolumeSnapshotClass

    注意

    LVM Storage 配置存储类和卷快照类的名称,格式为 lvms-<device_class_name>,其中 <device_class_name>LVMCluster CR 中的 deviceClasses.name 字段的值。例如,如果 deviceClasses.name 字段设置为 vg1,则存储类的名称和卷快照类为 lvms-vg1

  • LVMVolumeGroup :此 CR 是由 LVM 卷组支持的特定类型的持久性卷 (PV)。它在多个节点中跟踪各个卷组。
  • LVMVolumeGroupNodeStatus :此 CR 跟踪节点上卷组的状态。
4.12.4.3.1. 使用之前 LVM 存储安装中的卷组

您可以重复使用之前 LVM 存储安装中的现有卷组(VG),而不是创建新的 VG。

您只能重复使用 VG,但不能重复利用与 VG 关联的逻辑卷。

重要

您只能在创建 LVMCluster 自定义资源 (CR) 时执行这个步骤。

先决条件

  • 要重复使用的 VG 不得被损坏。
  • 要重复使用的 VG 必须具有 lvms 标签。有关向 LVM 对象添加标签的更多信息,请参阅使用标签对 LVM 对象进行分组

流程

  1. 打开 LVMCluster CR YAML 文件。
  2. 配置 LVMCluster CR 参数,如下例所示:

    LVMCluster CR YAML 文件示例

    apiVersion: lvm.topolvm.io/v1alpha1
    kind: LVMCluster
    metadata:
      name: my-lvmcluster
      namespace: openshift-storage
    spec:
    # ...
      storage:
        deviceClasses:
        - name: vg1  1
          fstype: ext4 2
          default: true
          deviceSelector: 3
    # ...
            forceWipeDevicesAndDestroyAllData: false 4
          thinPoolConfig: 5
    # ...
          nodeSelector: 6
    # ...

    1
    将此字段设置为之前 LVM 存储安装的 VG 的名称。
    2
    将此字段设置为 ext4xfs。默认情况下,此字段设置为 xfs
    3
    您可以通过在 deviceSelector 字段中指定新设备路径,将新设备添加到要重复使用的 VG。如果您不想在 VG 中添加新设备,请确保当前 LVM 存储安装中的 deviceSelector 配置与之前的 LVM 存储安装相同。
    4
    如果此字段设为 true,则 LVM 存储会擦除添加到 VG 的设备中的所有数据。
    5
    要保留您要重复使用的 VG 的 thinPoolConfig 配置,请确保当前 LVM 存储安装中的 thinPoolConfig 配置与之前的 LVM 存储安装相同。否则,您可以根据需要配置 thinPoolConfig 字段。
    6
    配置要求以选择要在其上创建 LVM 卷组的节点。如果此字段为空,则会考虑所有没有调度污点的节点。
  3. 保存 LVMCluster CR YAML 文件。
注意

要查看属于卷组的设备,请运行以下命令:

$ pvs -S vgname=<vg_name> 1
1
<vg_name> 替换为卷组的名称。
4.12.4.3.2. 使用 CLI 创建 LVMCluster CR

您可以使用 OpenShift CLI (oc)在 worker 节点上创建 LVMCluster 自定义资源 (CR)。

重要

您只能在 OpenShift Container Platform 集群中创建 LVMCluster 自定义资源 (CR) 的单一实例。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 已以具有 cluster-admin 权限的用户身份登录 OpenShift Container Platform。
  • 已安装 LVM 存储。
  • 已在集群中安装了 worker 节点。
  • 您可以阅读 "About the LVMCluster 自定义资源" 部分。

流程

  1. 创建 LVMCluster 自定义资源(CR) YAML 文件:

    LVMCluster CR YAML 文件示例

    apiVersion: lvm.topolvm.io/v1alpha1
    kind: LVMCluster
    metadata:
      name: my-lvmcluster
      namespace: openshift-storage
    spec:
    # ...
      storage:
        deviceClasses: 1
    # ...
          nodeSelector: 2
    # ...
          deviceSelector: 3
    # ...
          thinPoolConfig: 4
    # ...

    1
    包含将本地存储设备分配给 LVM 卷组的配置。
    2
    包含要在其上创建 LVM 卷组的节点的配置。如果此字段为空,则会考虑所有没有调度污点的节点。
    3
    包含指定您要添加到 LVM 卷组的设备的路径,并强制擦除添加到 LVM 卷组中的设备。
    4
    包含在 LVM 卷组中创建精简池的配置。如果您排除此字段,逻辑卷将被置备。
  2. 运行以下命令来创建 LVMCluster CR:

    $ oc create -f <file_name>

    输出示例

    lvmcluster/lvmcluster created

验证

  1. 检查 LVMCluster CR 是否处于 Ready 状态:

    $ oc get lvmclusters.lvm.topolvm.io -o jsonpath='{.items[*].status}' -n <namespace>

    输出示例

    {"deviceClassStatuses": 1
    [
      {
        "name": "vg1",
        "nodeStatus": [ 2
            {
                "devices": [ 3
                    "/dev/nvme0n1",
                    "/dev/nvme1n1",
                    "/dev/nvme2n1"
                ],
                "node": "kube-node", 4
                "status": "Ready" 5
            }
        ]
      }
    ]
    "state":"Ready"} 6

    1
    设备类的状态。
    2
    每个节点上的 LVM 卷组状态。
    3
    用于创建 LVM 卷组的设备列表。
    4
    创建设备类的节点。
    5
    节点上的 LVM 卷组状态。
    6
    LVMCluster CR 的状态。
    注意

    如果 LVMCluster CR 处于 Failed 状态,您可以在 status 字段中查看失败的原因。

    带有 failue 原因的 status 字段示例:

    status:
      deviceClassStatuses:
        - name: vg1
          nodeStatus:
            - node: my-node-1.example.com
              reason: no available devices found for volume group
              status: Failed
      state: Failed
  2. 可选: 要查看 LVM Storage 为每个设备类创建的存储类,请运行以下命令:

    $ oc get storageclass

    输出示例

    NAME          PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
    lvms-vg1      topolvm.io           Delete          WaitForFirstConsumer   true                   31m

  3. 可选: 要查看 LVM Storage 为每个设备类创建的卷快照类,请运行以下命令:

    $ oc get volumesnapshotclass

    输出示例

    NAME          DRIVER               DELETIONPOLICY   AGE
    lvms-vg1      topolvm.io           Delete           24h

4.12.4.3.3. 使用 Web 控制台创建 LVMCluster CR

您可以使用 OpenShift Container Platform Web 控制台在 worker 节点上创建 LVMCluster CR。

重要

您只能在 OpenShift Container Platform 集群中创建 LVMCluster 自定义资源 (CR) 的单一实例。

先决条件

  • 您可以使用 cluster-admin 权限访问 OpenShift Container Platform 集群。
  • 已安装 LVM 存储。
  • 已在集群中安装了 worker 节点。
  • 您可以阅读 "About the LVMCluster 自定义资源" 部分。

流程

  1. 登陆到 OpenShift Container Platform Web 控制台。
  2. Operators Installed Operators
  3. openshift-storage 命名空间中,点 LVM Storage
  4. Create LVMCluster 并选择 Form viewYAML view
  5. 配置所需的 LVMCluster CR 参数。
  6. Create
  7. 可选: 如果要编辑 LVMCLuster CR,请执行以下操作:

    1. LVMCluster 选项卡。
    2. Actions 菜单中,选择 Edit LVMCluster
    3. YAML 并编辑所需的 LVMCLuster CR 参数。
    4. 点击 Save

验证

  1. LVMCLuster 页面中,检查 LVMCluster CR 是否处于 Ready 状态。
  2. 可选: 要查看 LVM Storage 为每个设备类创建的可用存储类,请点 Storage StorageClasses
  3. 可选: 要查看 LVM Storage 为每个设备类创建的可用卷快照类,请点 Storage VolumeSnapshotClasses
4.12.4.3.4. 使用 RHACM 创建 LVMCluster CR

使用 RHACM 安装 LVM 存储后,您必须创建一个 LVMCluster 自定义资源(CR)。

先决条件

  • 已使用 RHACM 安装 LVM 存储。
  • 您可以使用具有 cluster-admin 权限的账户访问 RHACM 集群。
  • 您可以阅读 "About the LVMCluster 自定义资源" 部分。

流程

  1. 使用 OpenShift Container Platform 凭证登录到 RHACM CLI。
  2. 使用配置创建 ConfigurationPolicy CR YAML 文件以创建 LVMCluster CR:

    创建 LVMCluster CR 的 ConfigurationPolicy CR YAML 文件示例

    apiVersion: policy.open-cluster-management.io/v1
    kind: ConfigurationPolicy
    metadata:
      name: lvms
      namespace: openshift-storage
    spec:
      object-templates:
      - complianceType: musthave
        objectDefinition:
          apiVersion: lvm.topolvm.io/v1alpha1
          kind: LVMCluster
          metadata:
            name: my-lvmcluster
            namespace: openshift-storage
          spec:
            storage:
              deviceClasses: 1
    # ...
                deviceSelector: 2
    # ...
                thinPoolConfig: 3
    # ...
                nodeSelector: 4
    # ...
      remediationAction: enforce
      severity: low

    1
    包含将本地存储设备分配给 LVM 卷组的配置。
    2
    包含指定您要添加到 LVM 卷组的设备的路径,并强制擦除添加到 LVM 卷组中的设备。
    3
    包含在 LVM 卷组中创建精简池的配置。如果您排除此字段,逻辑卷将被置备。
    4
    包含要在其上创建 LVM 卷组的节点的配置。如果此字段为空,则考虑没有调度污点的所有节点都。
  3. 运行以下命令来创建 ConfigurationPolicy CR:

    $ oc create -f <file_name> -n <cluster_namespace> 1
    1
    安装 LVM 存储的 OpenShift Container Platform 集群的命名空间。

4.12.4.4. 删除 LVMCluster 自定义资源的方法

您可以使用 OpenShift CLI (oc)或 OpenShift Container Platform Web 控制台删除 LVMCluster 自定义资源 (CR)。如果您使用 Red Hat Advanced Cluster Management (RHACM)安装 LVM 存储,您还可以使用 RHACM 删除 LVMCluster CR。

删除 LVMCluster CR 后,LVM Storage 会删除以下 CR:

  • storageClass
  • volumeSnapshotClass
  • LVMVolumeGroup
  • LVMVolumeGroupNodeStatus
4.12.4.4.1. 使用 CLI 删除 LVMCluster CR

您可以使用 OpenShift CLI (oc)删除 LVMCluster 自定义资源(CR)。

先决条件

  • 您可以使用具有 cluster-admin 权限的用户访问 OpenShift Container Platform。
  • 您已删除 LVM 存储置备的持久性卷声明 (PVC)、卷快照和卷克隆。您还已删除了使用这些资源的应用程序。

流程

  1. 登录 OpenShift CLI (oc)。
  2. 运行以下命令来删除 LVMCluster CR:

    $ oc delete lvmcluster <lvmclustername> -n openshift-storage

验证

  • 要验证 LVMCluster CR 已被删除,请运行以下命令:

    $ oc get lvmcluster -n <namespace>

    输出示例

    No resources found in openshift-storage namespace.

4.12.4.4.2. 使用 Web 控制台删除 LVMCluster CR

您可以使用 OpenShift Container Platform Web 控制台删除 LVMCluster 自定义资源 (CR)。

先决条件

  • 您可以使用具有 cluster-admin 权限的用户访问 OpenShift Container Platform。
  • 您已删除 LVM 存储置备的持久性卷声明 (PVC)、卷快照和卷克隆。您还已删除了使用这些资源的应用程序。

流程

  1. 登陆到 OpenShift Container Platform Web 控制台。
  2. Operators Installed Operators 查看所有已安装的 Operator。
  3. openshift-storage 命名空间中的 LVM Storage
  4. LVMCluster 选项卡。
  5. Actions 中,选择 Delete LVMCluster
  6. 点击 Delete

验证

  • LVMCLuster 页面中,检查 LVMCluster CR 已被删除。
4.12.4.4.3. 使用 RHACM 删除 LVMCluster CR

如果您使用 Red Hat Advanced Cluster Management (RHACM) 安装 LVM 存储,您可以使用 RHACM 删除 LVMCluster CR。

先决条件

  • 您可以使用具有 cluster-admin 权限的用户访问 RHACM 集群。
  • 您已删除 LVM 存储置备的持久性卷声明 (PVC)、卷快照和卷克隆。您还已删除了使用这些资源的应用程序。

流程

  1. 使用 OpenShift Container Platform 凭证登录到 RHACM CLI。
  2. 删除为 LVMCluster CR 创建的 ConfigurationPolicy CR YAML 文件:

    $ oc delete -f <file_name> -n <cluster_namespace> 1
    1
    安装 LVM 存储的 OpenShift Container Platform 集群的命名空间。
  3. 创建 Policy CR YAML 文件以删除 LVMCluster CR:

    删除 LVMCluster CR 的 Policy CR 示例

    apiVersion: policy.open-cluster-management.io/v1
    kind: Policy
    metadata:
      name: policy-lvmcluster-delete
      annotations:
        policy.open-cluster-management.io/standards: NIST SP 800-53
        policy.open-cluster-management.io/categories: CM Configuration Management
        policy.open-cluster-management.io/controls: CM-2 Baseline Configuration
    spec:
      remediationAction: enforce
      disabled: false
      policy-templates:
        - objectDefinition:
            apiVersion: policy.open-cluster-management.io/v1
            kind: ConfigurationPolicy
            metadata:
              name: policy-lvmcluster-removal
            spec:
              remediationAction: enforce 1
              severity: low
              object-templates:
                - complianceType: mustnothave
                  objectDefinition:
                    kind: LVMCluster
                    apiVersion: lvm.topolvm.io/v1alpha1
                    metadata:
                      name: my-lvmcluster
                      namespace: openshift-storage 2
    ---
    apiVersion: policy.open-cluster-management.io/v1
    kind: PlacementBinding
    metadata:
      name: binding-policy-lvmcluster-delete
    placementRef:
      apiGroup: apps.open-cluster-management.io
      kind: PlacementRule
      name: placement-policy-lvmcluster-delete
    subjects:
      - apiGroup: policy.open-cluster-management.io
        kind: Policy
        name: policy-lvmcluster-delete
    ---
    apiVersion: apps.open-cluster-management.io/v1
    kind: PlacementRule
    metadata:
      name: placement-policy-lvmcluster-delete
    spec:
      clusterConditions:
        - status: "True"
          type: ManagedClusterConditionAvailable
      clusterSelector: 3
        matchExpressions:
          - key: mykey
            operator: In
            values:
              - myvalue

    1
    policy-template 中的 spec.remediationAction 被以前的 spec.remediationAction 值覆盖。
    2
    namespace 字段必须具有 openshift-storage 值。
    3
    配置选择集群的要求。在与选择条件匹配的集群上卸载 LVM 存储。
  4. 运行以下命令来创建 Policy CR:

    $ oc create -f <file_name> -n <namespace>
  5. 创建 Policy CR YAML 文件来检查 LVMCluster CR 已被删除:

    检查 LVMCluster CR 已被删除的 Policy CR 示例

    apiVersion: policy.open-cluster-management.io/v1
    kind: Policy
    metadata:
      name: policy-lvmcluster-inform
      annotations:
        policy.open-cluster-management.io/standards: NIST SP 800-53
        policy.open-cluster-management.io/categories: CM Configuration Management
        policy.open-cluster-management.io/controls: CM-2 Baseline Configuration
    spec:
      remediationAction: inform
      disabled: false
      policy-templates:
        - objectDefinition:
            apiVersion: policy.open-cluster-management.io/v1
            kind: ConfigurationPolicy
            metadata:
              name: policy-lvmcluster-removal-inform
            spec:
              remediationAction: inform 1
              severity: low
              object-templates:
                - complianceType: mustnothave
                  objectDefinition:
                    kind: LVMCluster
                    apiVersion: lvm.topolvm.io/v1alpha1
                    metadata:
                      name: my-lvmcluster
                      namespace: openshift-storage 2
    ---
    apiVersion: policy.open-cluster-management.io/v1
    kind: PlacementBinding
    metadata:
      name: binding-policy-lvmcluster-check
    placementRef:
      apiGroup: apps.open-cluster-management.io
      kind: PlacementRule
      name: placement-policy-lvmcluster-check
    subjects:
      - apiGroup: policy.open-cluster-management.io
        kind: Policy
        name: policy-lvmcluster-inform
    ---
    apiVersion: apps.open-cluster-management.io/v1
    kind: PlacementRule
    metadata:
      name: placement-policy-lvmcluster-check
    spec:
      clusterConditions:
        - status: "True"
          type: ManagedClusterConditionAvailable
      clusterSelector:
        matchExpressions:
          - key: mykey
            operator: In
            values:
              - myvalue

    1
    policy-template spec.remediationAction 可以通过为 spec.remediationAction 加前缀参数进行覆盖。
    2
    namespace 字段必须具有 openshift-storage 值。
  6. 运行以下命令来创建 Policy CR:

    $ oc create -f <file_name> -n <namespace>

验证

  • 运行以下命令,检查 Policy CR 的状态:

    $ oc get policy -n <namespace>

    输出示例

    NAME                       REMEDIATION ACTION   COMPLIANCE STATE   AGE
    policy-lvmcluster-delete   enforce              Compliant          15m
    policy-lvmcluster-inform   inform               Compliant          15m

    重要

    Policy CR 必须处于 Compliant 状态。

4.12.4.5. 置备存储

使用 LVMCluster 自定义资源(CR) 创建 LVM 卷组后,您可以通过创建持久性卷声明 (PVC) 来置备存储。

以下是您可以为每个文件系统类型请求的最小存储大小:

  • 块设备: 8 MiB
  • XFS: 300 MiB
  • ext4: 32 MiB

要创建 PVC,您必须创建一个 PersistentVolumeClaim 对象。

先决条件

  • 您已创建了 LVMCluster CR。

流程

  1. 登录 OpenShift CLI (oc)。
  2. 创建 PersistentVolumeClaim 对象:

    PersistentVolumeClaim 对象示例

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: lvm-block-1 1
      namespace: default
    spec:
      accessModes:
        - ReadWriteOnce
      volumeMode: Block 2
      resources:
        requests:
          storage: 10Gi 3
        limits:
          storage: 20Gi 4
      storageClassName: lvms-vg1 5

    1
    为 PVC 指定名称。
    2
    要创建块 PVC,请将此字段设置为 Block。要创建文件 PVC,请将此字段设置为 Filesystem
    3
    指定存储大小。如果值小于最小存储大小,则请求的存储大小将舍入到最小存储大小。您可以置备的总存储大小受逻辑卷管理器 (LVM) 精简池的大小和过度置备因素的限制。
    4
    可选:指定存储限制。将此字段设置为大于或等于最小存储大小的值。否则,PVC 创建会失败并显示错误。
    5
    storageClassName 字段的值的格式为 lvms-<device_class_name>,其中 <device_class_name>LVMCluster CR 中的 deviceClasses.name 字段的值。例如,如果 deviceClasses.name 字段设置为 vg1,您必须将 storageClassName 字段设置为 lvms-vg1
    注意

    存储类的 volumeBindingMode 字段设置为 WaitForFirstConsumer

  3. 运行以下命令来创建 PVC:

    # oc create -f <file_name> -n <application_namespace>
    注意

    在部署使用它们的 pod 之前,创建的 PVC 会一直处于 Pending 状态。

验证

  • 要验证 PVC 是否已创建,请运行以下命令:

    $ oc get pvc -n <namespace>

    输出示例

    NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    lvm-block-1   Bound    pvc-e90169a8-fd71-4eea-93b8-817155f60e47   1Gi        RWO            lvms-vg1       5s

4.12.4.6. 扩展集群存储的方法

OpenShift Container Platform 为裸机用户置备的基础架构上的集群支持额外的 worker 节点。您可以通过添加带有可用存储的新 worker 节点或向现有 worker 节点添加新设备来扩展集群的存储。

当节点处于活动状态时,逻辑卷管理器 (LVM) 存储会检测并使用额外的 worker 节点。

要在集群中的现有 worker 节点中添加新设备,您必须在 LVMCluster 自定义资源(CR)的 deviceSelector 字段中向新设备添加路径。

重要

您只能在创建 LVMCluster CR 时在 LVMCluster CR 中添加 deviceSelector 字段。如果您在创建 LVMCluster CR 时没有添加 deviceSelector 字段,您必须删除 LVMCluster CR 并创建一个包含 deviceSelector 字段的新 LVMCluster CR。

如果您没有在 LVMCluster CR 中添加 deviceSelector 字段,LVM Storage 会在设备可用时自动添加新设备。

注意

LVM 存储只添加支持的设备。有关不支持的设备的详情,请参考"LVM Storage 不支持的设备"。

4.12.4.6.1. 使用 CLI 扩展集群存储

您可以使用 OpenShift CLI (oc)扩展集群中的 worker 节点的存储容量。

先决条件

  • 每个集群中都有额外的未使用的设备,供逻辑卷管理器(LVM)存储使用。
  • 已安装 OpenShift CLI(oc)。
  • 您已创建了 LVMCluster 自定义资源 (CR)。

流程

  1. 运行以下命令来编辑 LVMCluster CR:

    $ oc edit <lvmcluster_file_name> -n <namespace>
  2. deviceSelector 字段中添加新设备的路径。

    LVMCluster CR 示例

    apiVersion: lvm.topolvm.io/v1alpha1
    kind: LVMCluster
    metadata:
      name: my-lvmcluster
    spec:
      storage:
        deviceClasses:
    # ...
          deviceSelector: 1
            paths: 2
            - /dev/disk/by-path/pci-0000:87:00.0-nvme-1
            - /dev/disk/by-path/pci-0000:88:00.0-nvme-1
            optionalPaths: 3
            - /dev/disk/by-path/pci-0000:89:00.0-nvme-1
            - /dev/disk/by-path/pci-0000:90:00.0-nvme-1
    # ...

    1
    包含指定您要添加到 LVM 卷组的设备的路径。您可以在 paths 字段,optionalPaths 字段会这两个字段中指定设备路径。如果您没有在 pathsoptionalPaths 中指定设备路径,则逻辑卷管理器 (LVM) 存储会将支持的未使用的设备添加到 LVM 卷组。只有在满足以下条件时,LVM 存储才会将设备添加到 LVM 卷组中:
    • 设备路径存在。
    • LVM 存储支持该设备。有关不支持的设备的详情,请参考"LVM Storage 不支持的设备"。
    2
    指定设备路径。如果此字段中指定的设备路径不存在,或者 LVM Storage 不支持该设备,则 LVMCluster CR 会进入 Failed 状态。
    3
    指定可选设备路径。如果此字段中指定的设备路径不存在,或者 LVM Storage 不支持该设备,LVM Storage 会忽略该设备而不造成错误。
    重要

    将设备添加到 LVM 卷组后,无法删除它。

  3. 保存 LVMCluster CR。
4.12.4.6.2. 使用 Web 控制台扩展集群存储

您可以使用 OpenShift Container Platform Web 控制台扩展集群中的 worker 节点的存储容量。

先决条件

  • 每个集群中都有额外的未使用的设备,供逻辑卷管理器(LVM)存储使用。
  • 您已创建了 LVMCluster 自定义资源 (CR)。

流程

  1. 登陆到 OpenShift Container Platform Web 控制台。
  2. Operators Installed Operators
  3. openshift-storage 命名空间中的 LVM Storage
  4. LVMCluster 选项卡查看在集群中创建的 LVMCluster CR。
  5. Actions 菜单中,选择 Edit LVMCluster
  6. YAML 标签。
  7. 编辑 LVMCluster CR,在 deviceSelector 字段中添加新设备路径:

    LVMCluster CR 示例

    apiVersion: lvm.topolvm.io/v1alpha1
    kind: LVMCluster
    metadata:
      name: my-lvmcluster
    spec:
      storage:
        deviceClasses:
    # ...
          deviceSelector: 1
            paths: 2
            - /dev/disk/by-path/pci-0000:87:00.0-nvme-1
            - /dev/disk/by-path/pci-0000:88:00.0-nvme-1
            optionalPaths: 3
            - /dev/disk/by-path/pci-0000:89:00.0-nvme-1
            - /dev/disk/by-path/pci-0000:90:00.0-nvme-1
    # ...

    1
    包含指定您要添加到 LVM 卷组的设备的路径。您可以在 paths 字段,optionalPaths 字段会这两个字段中指定设备路径。如果您没有在 pathsoptionalPaths 中指定设备路径,则逻辑卷管理器 (LVM) 存储会将支持的未使用的设备添加到 LVM 卷组。只有在满足以下条件时,LVM 存储才会将设备添加到 LVM 卷组中:
    • 设备路径存在。
    • LVM 存储支持该设备。有关不支持的设备的详情,请参考"LVM Storage 不支持的设备"。
    2
    指定设备路径。如果此字段中指定的设备路径不存在,或者 LVM Storage 不支持该设备,则 LVMCluster CR 会进入 Failed 状态。
    3
    指定可选设备路径。如果此字段中指定的设备路径不存在,或者 LVM Storage 不支持该设备,LVM Storage 会忽略该设备而不造成错误。
    重要

    将设备添加到 LVM 卷组后,无法删除它。

  8. 点击 Save
4.12.4.6.3. 使用 RHACM 扩展集群存储

您可以使用 RHACM 扩展集群中的 worker 节点的存储容量。

先决条件

  • 您可以使用具有 cluster-admin 特权的帐户访问 RHACM 集群。
  • 已使用 RHACM 创建 LVMCluster 自定义资源 (CR)。
  • 每个集群中都有额外的未使用的设备,供逻辑卷管理器(LVM)存储使用。

流程

  1. 使用 OpenShift Container Platform 凭证登录到 RHACM CLI。
  2. 运行以下命令,编辑使用 RHACM 创建的 LVMCluster CR:

    $ oc edit -f <file_name> -ns <namespace> 1
    1
    <file_name> 替换为 LVMCluster CR 的名称。
  3. LVMCluster CR 中,在 deviceSelector 字段中向新设备添加路径。

    LVMCluster CR 示例

    apiVersion: policy.open-cluster-management.io/v1
          kind: ConfigurationPolicy
          metadata:
            name: lvms
          spec:
            object-templates:
               - complianceType: musthave
                 objectDefinition:
                   apiVersion: lvm.topolvm.io/v1alpha1
                   kind: LVMCluster
                   metadata:
                     name: my-lvmcluster
                     namespace: openshift-storage
                   spec:
                     storage:
                       deviceClasses:
    # ...
                         deviceSelector: 1
                           paths: 2
                           - /dev/disk/by-path/pci-0000:87:00.0-nvme-1
                           optionalPaths: 3
                           - /dev/disk/by-path/pci-0000:89:00.0-nvme-1
    # ...

    1
    包含指定您要添加到 LVM 卷组的设备的路径。您可以在 paths 字段,optionalPaths 字段会这两个字段中指定设备路径。如果您没有在 pathsoptionalPaths 中指定设备路径,则逻辑卷管理器 (LVM) 存储会将支持的未使用的设备添加到 LVM 卷组。只有在满足以下条件时,LVM 存储才会将设备添加到 LVM 卷组中:
    • 设备路径存在。
    • LVM 存储支持该设备。有关不支持的设备的详情,请参考"LVM Storage 不支持的设备"。
    2
    指定设备路径。如果此字段中指定的设备路径不存在,或者 LVM Storage 不支持该设备,则 LVMCluster CR 会进入 Failed 状态。
    3
    指定可选设备路径。如果此字段中指定的设备路径不存在,或者 LVM Storage 不支持该设备,LVM Storage 会忽略该设备而不造成错误。
    重要

    将设备添加到 LVM 卷组后,无法删除它。

  4. 保存 LVMCluster CR。

4.12.4.7. 扩展持久性卷声明

扩展集群的存储后,您可以扩展现有持久性卷声明 (PVC)。

要扩展 PVC,您必须更新 PVC 中的 storage 字段。

先决条件

  • 使用动态置备。
  • 与 PVC 关联的 StorageClass 对象将 allowVolumeExpansion 字段设置为 true

流程

  1. 登录 OpenShift CLI (oc)。
  2. 运行以下命令,将 spec.resources.requests.storage 字段的值更新为大于当前值的值:

    $ oc patch <pvc_name> -n <application_namespace> -p \ 1
    '{ "spec": { "resources": { "requests": { "storage": "<desired_size>" }}}} --type=merge' 2
    1
    <pvc_name> 替换为您要扩展的 PVC 名称。
    2
    <desired_size> 替换为新大小来扩展 PVC。

验证

  • 要验证大小是否已完成,请运行以下命令:

    $ oc get pvc <pvc_name> -n <application_namespace> -o=jsonpath={.status.capacity.storage}

    LVM 存储在扩展过程中为 PVC 添加 Resizing 条件。它在 PVC 扩展后删除 Resizing 条件。

4.12.4.8. 删除持久性卷声明

您可以使用 OpenShift CLI (oc)删除持久性卷声明 (PVC)。

先决条件

  • 您可以使用具有 cluster-admin 权限的用户访问 OpenShift Container Platform。

流程

  1. 登录 OpenShift CLI (oc)。
  2. 运行以下命令来删除 PVC:

    $ oc delete pvc <pvc_name> -n <namespace>

验证

  • 要验证 PVC 已被删除,请运行以下命令:

    $ oc get pvc -n <namespace>

    此命令的输出中不能存在已删除的 PVC。

4.12.4.9. 关于卷快照

您可以创建由 LVM Storage 置备的持久性卷声明(PVC) 的快照。

您可以使用卷快照执行以下操作:

  • 备份应用程序数据。

    重要

    卷快照位于与原始数据相同的设备上。要将卷快照用作备份,您必须将快照移到安全位置。您可以使用 OpenShift API 进行数据保护 (OADP)备份和恢复解决方案。有关 OADP 的详情,请参考 "OADP features"。

  • 恢复到进行卷快照时的状态。
注意

您还可以创建卷克隆的卷快照。

4.12.4.9.1. 在多节点拓扑中创建卷快照的限制

LVM 存储在多节点拓扑中创建卷快照有以下限制:

  • 创建卷快照基于 LVM 精简池功能。
  • 创建卷快照后,节点必须具有额外的存储空间才能进一步更新原始数据源。
  • 您只能在部署原始数据源的节点上创建卷快照。
  • 依赖于使用快照数据的 PVC 的 Pod 只能调度到部署原始数据源的节点。

其他资源

4.12.4.9.2. 创建卷快照

您可以根据精简池的可用容量和过度置备限制创建卷快照。要创建卷快照,您必须创建一个 VolumeSnapshotClass 对象。

先决条件

  • 您可以使用具有 cluster-admin 权限的用户访问 OpenShift Container Platform。
  • 确保持久性卷声明(PVC)处于 Bound 状态。对于快照的一致性,这是必需的。
  • 您已停止所有到 PVC 的 I/O。

流程

  1. 登录 OpenShift CLI (oc)。
  2. 创建 VolumeSnapshot 对象:

    VolumeSnapshot 对象示例

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: lvm-block-1-snap 1
    spec:
      source:
        persistentVolumeClaimName: lvm-block-1 2
      volumeSnapshotClassName: lvms-vg1 3

    1
    为卷快照指定一个名称。
    2
    指定源 PVC 的名称。LVM Storage 会创建这个 PVC 的快照。
    3
    将此字段设置为卷快照类的名称。
    注意

    要获取可用卷快照类列表,请运行以下命令:

    $ oc get volumesnapshotclass
  3. 运行以下命令,在创建源 PVC 的命名空间中创建卷快照:

    $ oc create -f <file_name> -n <namespace>

    LVM 存储会创建一个 PVC 的只读副本作为卷快照。

验证

  • 要验证卷快照是否已创建,请运行以下命令:

    $ oc get volumesnapshot -n <namespace>

    输出示例

    NAME               READYTOUSE   SOURCEPVC     SOURCESNAPSHOTCONTENT   RESTORESIZE   SNAPSHOTCLASS   SNAPSHOTCONTENT                                    CREATIONTIME   AGE
    lvm-block-1-snap   true         lvms-test-1                           1Gi           lvms-vg1        snapcontent-af409f97-55fc-40cf-975f-71e44fa2ca91   19s            19s

    您创建的卷快照的 READYTOUSE 字段的值必须是 true

4.12.4.9.3. 恢复卷快照

要恢复卷快照,您必须创建一个 PVC,并将 dataSource.name 字段设置为卷快照的名称。

恢复的 PVC 独立于卷快照和源 PVC。

先决条件

  • 您可以使用具有 cluster-admin 权限的用户访问 OpenShift Container Platform。
  • 您已创建了卷快照。

流程

  1. 登录 OpenShift CLI (oc)。
  2. 使用配置创建 PersistentVolumeClaim 对象来恢复卷快照:

    恢复卷快照的 PersistentVolumeClaim 对象示例

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: lvm-block-1-restore
    spec:
      accessModes:
      - ReadWriteOnce
      volumeMode: Block
      Resources:
        Requests:
          storage: 2Gi 1
      storageClassName: lvms-vg1 2
      dataSource:
        name: lvm-block-1-snap 3
        kind: VolumeSnapshot
        apiGroup: snapshot.storage.k8s.io

    1
    指定恢复的 PVC 的存储大小。请求的 PVC 的存储大小必须大于或等于您要恢复的卷快照的大小。如果需要较大的 PVC,也可以在恢复卷快照后重新定义 PVC 的大小。
    2
    将此字段设置为您要恢复的卷快照的源 PVC 中的 storageClassName 字段的值。
    3
    将此字段设置为您要恢复的卷快照的名称。
  3. 运行以下命令,在您创建卷快照的命名空间中创建 PVC:

    $ oc create -f <file_name> -n <namespace>

验证

  • 要验证卷快照是否已恢复,请运行以下命令:

    $ oc get pvc -n <namespace>

    输出示例

    NAME                  STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    lvm-block-1-restore   Bound    pvc-e90169a8-fd71-4eea-93b8-817155f60e47   1Gi        RWO            lvms-vg1       5s

4.12.4.9.4. 删除卷快照

您可以删除持久性卷声明 (PVC) 的卷快照。

重要

当您删除持久性卷声明 (PVC) 时,LVM Storage 只删除 PVC,而不是删除 PVC 的快照。

先决条件

  • 您可以使用具有 cluster-admin 权限的用户访问 OpenShift Container Platform。
  • 您已确保没有删除的卷 snpashot。

流程

  1. 登录 OpenShift CLI (oc)。
  2. 运行以下命令来删除卷快照:

    $ oc delete volumesnapshot <volume_snapshot_name> -n <namespace>

验证

  • 要验证卷快照是否已删除,请运行以下命令:

    $ oc get volumesnapshot -n <namespace>

    此命令的输出中不能存在删除的卷快照。

4.12.4.10. 关于卷克隆

卷克隆是现有持久性卷声明 (PVC) 的副本。您可以创建一个卷克隆来复制数据的时间点副本。

4.12.4.10.1. 在多节点拓扑中创建卷克隆的限制

LVM 存储在多节点拓扑中创建卷克隆有以下限制:

  • 创建卷克隆基于 LVM 精简池功能。
  • 在创建卷克隆后,节点必须有额外的存储才能进一步更新原始数据源。
  • 您只能在部署原始数据源的节点上创建卷克隆。
  • 依赖于使用克隆数据的 PVC 的 Pod 只能调度到部署原始数据源的节点。
4.12.4.10.2. 创建卷克隆

要创建持久性卷声明 (PVC) 的克隆,您必须在创建源 PVC 的命名空间中创建 PersistentVolumeClaim 对象。

重要

克隆的 PVC 具有写入访问权限。

先决条件

  • 确保源 PVC 处于 Bound 状态。这是一致的克隆所必需的。

流程

  1. 登录 OpenShift CLI (oc)。
  2. 创建 PersistentVolumeClaim 对象:

    用于创建卷克隆的 PersistentVolumeClaim 对象示例

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: lvm-pvc-clone
    spec:
      accessModes:
      - ReadWriteOnce
      storageClassName: lvms-vg1 1
      volumeMode: Filesystem 2
      dataSource:
        kind: PersistentVolumeClaim
        name: lvm-pvc 3
      resources:
        requests:
          storage: 1Gi 4

    1
    将此字段设置为源 PVC 中的 storageClassName 字段的值。
    2
    将此字段设置为源 PVC 中的 volumeMode 字段。
    3
    指定源 PVC 的名称。
    4
    指定克隆的 PVC 的存储大小。克隆的 PVC 的存储大小必须大于或等于源 PVC 的存储大小。
  3. 运行以下命令,在创建源 PVC 的命名空间中创建 PVC:

    $ oc create -f <file_name> -n <namespace>

验证

  • 要验证卷克隆是否已创建,请运行以下命令:

    $ oc get pvc -n <namespace>

    输出示例

    NAME                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    lvm-block-1-clone   Bound    pvc-e90169a8-fd71-4eea-93b8-817155f60e47   1Gi        RWO            lvms-vg1       5s

4.12.4.10.3. 删除卷克隆

您可以删除卷克隆。

重要

当您删除持久性卷声明 (PVC) 时,LVM Storage 只删除源持久性卷声明 (PVC),而不是删除 PVC 的克隆。

先决条件

  • 您可以使用具有 cluster-admin 权限的用户访问 OpenShift Container Platform。

流程

  1. 登录 OpenShift CLI (oc)。
  2. 运行以下命令来删除克隆的 PVC:

    # oc delete pvc <clone_pvc_name> -n <namespace>

验证

  • 要验证卷克隆是否已删除,请运行以下命令:

    $ oc get pvc -n <namespace>

    此命令的输出中不能存在删除的卷克隆。

4.12.4.11. 更新 LVM 存储

您可以更新 LVM Storage 以确保与 OpenShift Container Platform 版本兼容。

先决条件

  • 您已更新了 OpenShift Container Platform 集群。
  • 已安装以前的 LVM 存储版本。
  • 已安装 OpenShift CLI(oc)。
  • 您可以使用具有 cluster-admin 权限的账户访问集群。

流程

  1. 登录 OpenShift CLI (oc)。
  2. 运行以下命令,更新安装 LVM 存储时创建的 Subscription 自定义资源 (CR):

    $ oc patch subscription lvms-operator -n openshift-storage --type merge --patch '{"spec":{"channel":"<update_channel>"}}' 1
    1
    <update_channel> 替换为您要安装的 LVM 存储版本。例如,stable-4.16
  3. 运行以下命令,查看更新事件以检查安装是否已完成:

    $ oc get events -n openshift-storage

    输出示例

    ...
    8m13s       Normal    RequirementsUnknown   clusterserviceversion/lvms-operator.v4.16   requirements not yet checked
    8m11s       Normal    RequirementsNotMet    clusterserviceversion/lvms-operator.v4.16   one or more requirements couldn't be found
    7m50s       Normal    AllRequirementsMet    clusterserviceversion/lvms-operator.v4.16   all requirements found, attempting install
    7m50s       Normal    InstallSucceeded      clusterserviceversion/lvms-operator.v4.16   waiting for install components to report healthy
    7m49s       Normal    InstallWaiting        clusterserviceversion/lvms-operator.v4.16   installing: waiting for deployment lvms-operator to become ready: deployment "lvms-operator" waiting for 1 outdated replica(s) to be terminated
    7m39s       Normal    InstallSucceeded      clusterserviceversion/lvms-operator.v4.16   install strategy completed with no errors
    ...

验证

  • 运行以下命令验证 LVM 存储版本:

    $ oc get subscription lvms-operator -n openshift-storage -o jsonpath='{.status.installedCSV}'

    输出示例

    lvms-operator.v4.16

4.12.4.12. 监控 LVM 存储

要启用集群监控,您必须在安装 LVM 存储的命名空间中添加以下标签:

openshift.io/cluster-monitoring=true
重要

有关在 RHACM 中启用集群监控的详情,请参考 观察性添加自定义指标

4.12.4.12.1. 指标

您可以通过查看指标来监控 LVM 存储。

下表描述了 topolvm 指标:

表 4.9. topolvm 指标
警报描述

topolvm_thinpool_data_percent

表示 LVM thinpool 中使用的数据空间百分比。

topolvm_thinpool_metadata_percent

表示 LVM thinpool 中使用的元数据空间百分比。

topolvm_thinpool_size_bytes

表示 LVM 精简池的大小(以字节为单位)。

topolvm_volumegroup_available_bytes

表示 LVM 卷组中的可用空间(以字节为单位)。

topolvm_volumegroup_size_bytes

表示 LVM 卷组的大小(以字节为单位)。

topolvm_thinpool_overprovisioned_available

表示 LVM 精简池的可用过度置备大小(以字节为单位)。

注意

指标每 10 分钟更新一次,或者在精简池中有变化(如创建新逻辑卷)时更新。

4.12.4.12.2. 警报

当精简池和卷组达到最大存储容量时,进一步的操作会失败。这会导致数据丢失。

当使用精简池和卷组超过特定值时,LVM 存储会发送以下警报:

表 4.10. LVM 存储警报
警报描述

VolumeGroupUsageAtThresholdNearFull

当卷组和精简池用量超过节点上的 75% 时,会触发此警报。需要删除数据或卷组扩展。

VolumeGroupUsageAtThresholdCritical

当卷组和精简池使用超过节点上的 85% 时,会触发此警报。在这种情况下,卷组几乎已满。需要删除数据或卷组扩展。

ThinPoolDataUsageAtThresholdNearFull

当卷组中的精简池数据 uusage 超过节点上的 75% 时,会触发此警报。需要删除数据或精简池扩展。

ThinPoolDataUsageAtThresholdCritical

当卷组中的精简池数据使用量超过节点上的 85% 时,会触发此警报。需要删除数据或精简池扩展。

ThinPoolMetaDataUsageAtThresholdNearFull

当卷组中的精简池元数据使用量超过节点上的 75% 时,会触发此警报。需要删除数据或精简池扩展。

ThinPoolMetaDataUsageAtThresholdCritical

当卷组中的精简池元数据使用量超过节点上的 85% 时,会触发此警报。需要删除数据或精简池扩展。

4.12.4.13. 使用 CLI 卸载 LVM 存储

您可以使用 OpenShift CLI (oc)卸载 LVM Storage。

先决条件

  • 已以具有 cluster-admin 权限的用户身份登录 oc
  • 已删除由 LVM Storage 置备的持久性卷声明 (PVC)、卷快照和卷克隆。您还已删除了使用这些资源的应用程序。
  • 已删除 LVMCluster 自定义资源 (CR)。

流程

  1. 运行以下命令,获取 LVM Storage Operator 的 currentCSV 值:

    $ oc get subscription.operators.coreos.com lvms-operator -n <namespace> -o yaml | grep currentCSV

    输出示例

    currentCSV: lvms-operator.v4.15.3

  2. 运行以下命令来删除订阅:

    $ oc delete subscription.operators.coreos.com lvms-operator -n <namespace>

    输出示例

    subscription.operators.coreos.com "lvms-operator" deleted

  3. 运行以下命令,删除目标命名空间中 LVM Storage Operator 的 CSV:

    $ oc delete clusterserviceversion <currentCSV> -n <namespace> 1
    1
    <currentCSV> 替换为 LVM Storage Operator 的 currentCSV 值。

    输出示例

    clusterserviceversion.operators.coreos.com "lvms-operator.v4.15.3" deleted

验证

  • 要验证 LVM Storage Operator 是否已卸载,请运行以下命令:

    $ oc get csv -n <namespace>

    如果 LVM Storage Operator 已被成功卸载,则不会出现在这个命令的输出中。

4.12.4.14. 使用 Web 控制台卸载 LVM 存储

您可以使用 OpenShift Container Platform Web 控制台卸载 LVM Storage。

先决条件

  • 您可以使用具有 cluster-admin 权限的用户访问 OpenShift Container Platform。
  • 您已删除 LVM 存储置备的持久性卷声明 (PVC)、卷快照和卷克隆。您还已删除了使用这些资源的应用程序。
  • 您已删除 LVMCluster 自定义资源 (CR)。

流程

  1. 登陆到 OpenShift Container Platform Web 控制台。
  2. Operators Installed Operators
  3. openshift-storage 命名空间中的 LVM Storage
  4. Details 标签页。
  5. Actions 菜单中,选择 Uninstall Operator
  6. 可选:在提示时,选择 Delete all operand instances for this operator 复选框来删除 LVM Storage 的操作对象实例。
  7. Uninstall

4.12.4.15. 卸载使用 RHACM 安装的 LVM 存储

要卸载使用 RHACM 安装的 LVM 存储,您必须删除为安装和配置 LVM 存储而创建的 RHACM Policy 自定义资源 (CR)。

先决条件

  • 您可以使用具有 cluster-admin 权限的用户访问 RHACM 集群。
  • 您已删除 LVM 存储置备的持久性卷声明 (PVC)、卷快照和卷克隆。您还已删除了使用这些资源的应用程序。
  • 您已删除使用 RHACM 创建的 LVMCluster CR。

流程

  1. 登录 OpenShift CLI (oc)。
  2. 使用以下命令删除为安装和配置 LVM 存储而创建的 RHACM Policy CR:

    $ oc delete -f <policy> -n <namespace> 1
    1
    <policy> 替换为 Policy CR YAML 文件的名称。
  3. 使用配置创建 Policy CR YAML 文件来卸载 LVM 存储:

    卸载 LVM 存储的 Policy CR 示例

    apiVersion: apps.open-cluster-management.io/v1
    kind: PlacementRule
    metadata:
      name: placement-uninstall-lvms
    spec:
      clusterConditions:
      - status: "True"
        type: ManagedClusterConditionAvailable
      clusterSelector:
        matchExpressions:
        - key: mykey
          operator: In
          values:
          - myvalue
    ---
    apiVersion: policy.open-cluster-management.io/v1
    kind: PlacementBinding
    metadata:
      name: binding-uninstall-lvms
    placementRef:
      apiGroup: apps.open-cluster-management.io
      kind: PlacementRule
      name: placement-uninstall-lvms
    subjects:
    - apiGroup: policy.open-cluster-management.io
      kind: Policy
      name: uninstall-lvms
    ---
    apiVersion: policy.open-cluster-management.io/v1
    kind: Policy
    metadata:
      annotations:
        policy.open-cluster-management.io/categories: CM Configuration Management
        policy.open-cluster-management.io/controls: CM-2 Baseline Configuration
        policy.open-cluster-management.io/standards: NIST SP 800-53
      name: uninstall-lvms
    spec:
      disabled: false
      policy-templates:
      - objectDefinition:
          apiVersion: policy.open-cluster-management.io/v1
          kind: ConfigurationPolicy
          metadata:
            name: uninstall-lvms
          spec:
            object-templates:
            - complianceType: mustnothave
              objectDefinition:
                apiVersion: v1
                kind: Namespace
                metadata:
                  name: openshift-storage
            - complianceType: mustnothave
              objectDefinition:
                apiVersion: operators.coreos.com/v1
                kind: OperatorGroup
                metadata:
                  name: openshift-storage-operatorgroup
                  namespace: openshift-storage
                spec:
                  targetNamespaces:
                  - openshift-storage
            - complianceType: mustnothave
              objectDefinition:
                apiVersion: operators.coreos.com/v1alpha1
                kind: Subscription
                metadata:
                  name: lvms-operator
                  namespace: openshift-storage
            remediationAction: enforce
            severity: low
      - objectDefinition:
          apiVersion: policy.open-cluster-management.io/v1
          kind: ConfigurationPolicy
          metadata:
            name: policy-remove-lvms-crds
          spec:
            object-templates:
            - complianceType: mustnothave
              objectDefinition:
                apiVersion: apiextensions.k8s.io/v1
                kind: CustomResourceDefinition
                metadata:
                  name: logicalvolumes.topolvm.io
            - complianceType: mustnothave
              objectDefinition:
                apiVersion: apiextensions.k8s.io/v1
                kind: CustomResourceDefinition
                metadata:
                  name: lvmclusters.lvm.topolvm.io
            - complianceType: mustnothave
              objectDefinition:
                apiVersion: apiextensions.k8s.io/v1
                kind: CustomResourceDefinition
                metadata:
                  name: lvmvolumegroupnodestatuses.lvm.topolvm.io
            - complianceType: mustnothave
              objectDefinition:
                apiVersion: apiextensions.k8s.io/v1
                kind: CustomResourceDefinition
                metadata:
                  name: lvmvolumegroups.lvm.topolvm.io
            remediationAction: enforce
            severity: high

  4. 运行以下命令来创建 Policy CR:

    $ oc create -f <policy> -ns <namespace>

4.12.4.16. 使用 must-gather 下载日志文件和诊断信息

如果 LVM 存储无法自动解决问题,请使用 must-gather 工具收集日志文件和诊断信息,以便您或红帽支持可以查看问题并确定解决方案。

流程

  • 从连接到 LVM 存储集群的客户端运行 must-gather 命令:

    $ oc adm must-gather --image=registry.redhat.io/lvms4/lvms-must-gather-rhel9:v4.16 --dest-dir=<directory_name>

4.12.4.17. 持久性存储故障排除

在使用逻辑卷管理器 (LVM) 存储配置持久性存储时,您可能会遇到一些需要故障排除的问题。

4.12.4.17.1. 检查 PVC 处于 Pending 状态

持久性卷声明 (PVC) 可能会因为以下原因处于 Pending 状态:

  • 计算资源不足。
  • 网络问题。
  • 不匹配的存储类或节点选择器。
  • 没有可用的持久性卷 (PV)。
  • 具有 PV 的节点处于 Not Ready 状态。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 您已以具有 cluster-admin 权限的用户身份登录到 OpenShift CLI (oc)。

流程

  1. 运行以下命令来检索 PVC 列表:

    $ oc get pvc

    输出示例

    NAME        STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    lvms-test   Pending                                      lvms-vg1       11s

  2. 运行以下命令,检查与 PVC 关联的事件处于 Pending 状态:

    $ oc describe pvc <pvc_name> 1
    1
    <pvc_name> 替换为 PVC 的名称。例如:lvms-vg1

    输出示例

    Type     Reason              Age               From                         Message
    ----     ------              ----              ----                         -------
    Warning  ProvisioningFailed  4s (x2 over 17s)  persistentvolume-controller  storageclass.storage.k8s.io "lvms-vg1" not found

4.12.4.17.2. 从缺少的存储类中恢复

如果出现 storage class not found 错误,检查 LVMCluster 自定义资源 (CR),并确保所有逻辑卷管理器 (LVM)存储 pod 都处于 Running 状态。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 您已以具有 cluster-admin 权限的用户身份登录到 OpenShift CLI (oc)。

流程

  1. 运行以下命令验证 LVMCluster CR 是否存在:

    $ oc get lvmcluster -n openshift-storage

    输出示例

    NAME            AGE
    my-lvmcluster   65m

  2. 如果 LVMCluster CR 不存在,请创建一个 LVMCluster CR。如需更多信息,请参阅"创建 LVMCluster 自定义资源"。
  3. openshift-storage 命名空间中,运行以下命令来检查所有 LVM 存储 pod 是否都处于 Running 状态:

    $ oc get pods -n openshift-storage

    输出示例

    NAME                                  READY   STATUS    RESTARTS      AGE
    lvms-operator-7b9fb858cb-6nsml        3/3     Running   0             70m
    topolvm-controller-5dd9cf78b5-7wwr2   5/5     Running   0             66m
    topolvm-node-dr26h                    4/4     Running   0             66m
    vg-manager-r6zdv                      1/1     Running   0             66m

    此命令的输出必须包含以下 pod 的运行实例:

    • lvms-operator
    • vg-manager

      如果在加载配置文件时 vg-manager pod 处于卡住状态,这是因为它无法找到可用磁盘以供 LVM 存储使用。要检索必要的信息来排除此问题,请运行以下命令来查看 vg-manager pod 的日志:

      $ oc logs -l app.kubernetes.io/component=vg-manager -n openshift-storage
4.12.4.17.3. 从节点故障中恢复

由于集群中的节点故障,持久性卷声明 (PVC) 可能会处于 Pending 状态。

要识别出现故障的节点,您可以检查 topolvm-node pod 的重启计数。增加了重启计数表示底层节点的潜在问题,这可能需要进一步调查和故障排除。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 您已以具有 cluster-admin 权限的用户身份登录到 OpenShift CLI (oc)。

流程

  • 运行以下命令,检查 topolvm-node pod 实例的重启计数:

    $ oc get pods -n openshift-storage

    输出示例

    NAME                                  READY   STATUS    RESTARTS      AGE
    lvms-operator-7b9fb858cb-6nsml        3/3     Running   0             70m
    topolvm-controller-5dd9cf78b5-7wwr2   5/5     Running   0             66m
    topolvm-node-dr26h                    4/4     Running   0             66m
    topolvm-node-54as8                    4/4     Running   0             66m
    topolvm-node-78fft                    4/4     Running   17 (8s ago)   66m
    vg-manager-r6zdv                      1/1     Running   0             66m
    vg-manager-990ut                      1/1     Running   0             66m
    vg-manager-an118                      1/1     Running   0             66m

后续步骤

  • 如果 PVC 处于 Pending 状态,即使您解决了与节点相关的问题后,您必须执行强制清理。如需更多信息,请参阅"通知强制清理"。

其他资源

4.12.4.17.4. 从磁盘失败中恢复

如果您在检查与持久性卷声明 (PVC) 关联的事件时看到失败信息,则可能代表底层卷或磁盘存在问题。

磁盘和卷置备问题会导致通用错误消息,如 Failed to provision volume with storage class <storage_class_name>。常规错误消息后带有特定的卷失败错误消息。

下表描述了卷故障错误消息:

表 4.11. 卷故障错误消息
错误消息描述

检查卷是否存在失败

指明验证卷是否已存在的问题。卷验证失败可能是由网络连接问题或其他故障造成的。

绑定卷失败

如果可用持久性卷 (PV) 与 PVC 的要求不匹配,则无法绑定卷。

FailedMountFailedAttachVolume

此错误表示试图将卷挂载到节点时出现问题。如果磁盘失败,pod 尝试使用 PVC 时可能会出现这个错误。

FailedUnMount

此错误表示尝试从节点卸载卷时出现问题。如果磁盘失败,pod 尝试使用 PVC 时可能会出现这个错误。

卷已专门附加到一个节点,不能附加到另一个节点

这个错误可能会出现不支持 ReadWriteMany 访问模式的存储解决方案。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 您已以具有 cluster-admin 权限的用户身份登录到 OpenShift CLI (oc)。

流程

  1. 运行以下命令,检查与 PVC 关联的事件:

    $ oc describe pvc <pvc_name> 1
    1
    <pvc_name> 替换为 PVC 的名称。
  2. 建立到发生问题的主机的直接连接。
  3. 解决磁盘问题。

后续步骤

  • 如果卷失败消息在磁盘解决了这个问题后仍然保留或递归,您必须执行强制清理。如需更多信息,请参阅"通知强制清理"。

其他资源

4.12.4.17.5. 执行强制清理

如果在完成故障排除过程后仍存在磁盘或节点相关的问题,您必须执行强制清理。强制清理用于解决永久问题并确保逻辑卷管理器(LVM)存储正常工作。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 您已以具有 cluster-admin 权限的用户身份登录到 OpenShift CLI (oc)。
  • 您已删除所有使用 LVM 存储创建的持久性卷声明(PVC)。
  • 您已停止使用 LVM 存储创建的 PVC 的 pod。

流程

  1. 运行以下命令切换到 openshift-storage 命名空间:

    $ oc project openshift-storage
  2. 运行以下命令,检查 LogicalVolume 自定义资源 (CR) 是否存在:

    $ oc get logicalvolume
    1. 如果存在 LogicalVolume CR,请运行以下命令删除它们:

      $ oc delete logicalvolume <name> 1
      1
      <name> 替换为 LogicalVolume CR 的名称。
    2. 删除 LogicalVolume CR 后,运行以下命令来删除其终结器:

      $ oc patch logicalvolume <name> -p '{"metadata":{"finalizers":[]}}' --type=merge 1
      1
      <name> 替换为 LogicalVolume CR 的名称。
  3. 运行以下命令,检查 LVMVolumeGroup CR 是否存在:

    $ oc get lvmvolumegroup
    1. 如果存在 LVMVolumeGroup CR,请运行以下命令删除它们:

      $ oc delete lvmvolumegroup <name> 1
      1
      <name> 替换为 LVMVolumeGroup CR 的名称。
    2. 删除 LVMVolumeGroup CR 后,运行以下命令来删除其终结器:

      $ oc patch lvmvolumegroup <name> -p '{"metadata":{"finalizers":[]}}' --type=merge 1
      1
      <name> 替换为 LVMVolumeGroup CR 的名称。
  4. 运行以下命令来删除任何 LVMVolumeGroupNodeStatus CR:

    $ oc delete lvmvolumegroupnodestatus --all
  5. 运行以下命令来删除 LVMCluster CR:

    $ oc delete lvmcluster --all
    1. 删除 LVMCluster CR 后,运行以下命令来删除其终结器:

      $ oc patch lvmcluster <name> -p '{"metadata":{"finalizers":[]}}' --type=merge 1
      1
      <name> 替换为 LVMCluster CR 的名称。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.