5.19. VMware vSphere CSI Driver Operator

5.19.1. 概述

OpenShift Container Platform 可以使用 Container Storage Interface(CSI)VMDK(VMDK)卷的 VMware vSphere 驱动程序来置备持久性卷(PV)。

在使用 CSI Operator 和驱动程序时,建议先熟悉 持久性存储配置 CSI 卷

要创建挂载到 vSphere 存储资产中的 CSI 置备持久性卷(PV),OpenShift Container Platform 在 openshift-cluster-csi-drivers 命名空间中默认安装 vSphere CSI Driver Operator 和 vSphere CSI 驱动程序。

  • vSphere CSI Driver Operator :Operator 提供了一个称为 thin-csi 的存储类,您可以使用它来创建持久性卷声明(PVC)。vSphere CSI Driver Operator 支持动态卷置备,允许按需创建存储卷,使集群管理员无需预置备存储。
  • vSphere CSI driver:这个驱动程序可让您创建并挂载 vSphere PV。在 OpenShift Container Platform 4.12.21 及更高版本中,驱动程序版本为 2.7.1。在早于 4.12.21 的 OpenShift Container Platform 4.12 版本中,这个版本为 2.6.1。vSphere CSI 驱动程序支持底层红帽核心操作系统发行版本支持的所有文件系统,包括 XFS 和 Ext4。有关支持的文件系统的更多信息,请参阅可用文件系统概述
重要

OpenShift Container Platform 默认使用 in-tree (非 CSI)插件来置备 vSphere 存储。

在以后的 OpenShift Container Platform 版本中,计划使用现有树内插件置备的卷迁移到对应的 CSI 驱动程序。CSI 自动迁移应该可以无缝进行。迁移不会改变您使用所有现有 API 对象的方式,如持久性卷、持久性卷声明和存储类。有关迁移的更多信息,请参阅 CSI 自动迁移

完全迁移后,未来的 OpenShift Container Platform 版本将最终删除树内插件。

注意

vSphere CSI 驱动程序支持动态和静态置备。当在 PV 规格中使用静态置备时,请不要在 csi.volumeAttributes 中使用键 storage.kubernetes.io/csiProvisionerIdentity,因为这个键代表动态置备的 PV。

5.19.2. 关于 CSI

在过去,存储厂商一般会把存储驱动作为 Kubernetes 的一个部分提供。随着容器存储接口 (CSI) 的实现,第三方供应商可以使用标准接口来提供存储插件,而无需更改核心 Kubernetes 代码。

CSI Operators 为 OpenShift Container Platform 用户提供了存储选项,如卷快照,它无法通过 in-tree 卷插件实现。

5.19.3. vSphere 存储策略

vSphere CSI Driver Operator 存储类使用 vSphere 的存储策略。OpenShift Container Platform 会自动创建一个存储策略,该策略以云配置中配置的数据存储为目标:

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: thin-csi
provisioner: csi.vsphere.vmware.com
parameters:
  StoragePolicyName: "$openshift-storage-policy-xxxx"
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: false
reclaimPolicy: Delete

5.19.4. ReadWriteMany vSphere 卷支持

如果底层 vSphere 环境支持 vSAN 文件服务,则 OpenShift Container Platform 安装的 vSphere Container Storage Interface (CSI) Driver Operator 支持 provisioning of ReadWriteMany (RWX) 卷。如果没有配置 vSAN 文件服务,则 ReadWriteOnce (RWO) 是唯一可用的访问模式。如果您没有配置 vSAN 文件服务,且您请求 RWX,则卷将无法被创建,并记录错误。

有关在您的环境中配置 vSAN 文件服务的更多信息,请参阅 vSAN File Service

您可以通过生成以下持久性卷声明 (PVC) 来请求 RWX 卷:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myclaim
spec:
  resources:
    requests:
      storage: 1Gi
  accessModes:
     - ReadWriteMany
  storageClassName: thin-csi

请求 RWX 卷类型的 PVC 会导致置备 vSAN 文件服务支持的持久性卷 (PV)。

5.19.5. VMware vSphere CSI Driver Operator 要求

要安装 vSphere CSI Driver Operator,必须满足以下要求:

  • VMware vSphere 版本: 7.0 更新 2 或更高版本; 8.0 更新 1 或更高版本
  • vCenter 版本: 7.0 更新 2 或更高版本; 8.0 更新 1 或更高版本
  • 硬件版本 15 或更高版本的虚拟机
  • 集群中还没有安装第三方 vSphere CSI 驱动程序

如果集群中存在第三方 vSphere CSI 驱动程序,OpenShift Container Platform 不会覆盖它。存在第三方 vSphere CSI 驱动程序可防止 OpenShift Container Platform 更新到 OpenShift Container Platform 4.13 或更高版本。

注意

只有在安装清单中使用 platform: vsphere 部署的集群中才支持 VMware vSphere CSI Driver Operator。

要删除第三方 CSI 驱动程序,请参阅删除第三方 vSphere CSI 驱动程序

5.19.6. 删除第三方 vSphere CSI Driver Operator

OpenShift Container Platform 4.10 及更新的版本包括红帽支持的 vSphere Container Storage Interface (CSI) Operator Driver 的内置版本。如果您安装了由社区或其他供应商提供的 vSphere CSI 驱动程序,则可能会对集群禁用对下一个 OpenShift Container Platform 主版本(如 4.13 或更高版本)的更新。

OpenShift Container Platform 4.12 及更新的版本仍被完全支持,且对 4.12 的 z-stream 版本的更新(如 4.12.z)不被支持,但您必须在升级到下一个 OpenShift Container Platform 主版本前删除第三方 vSphere CSI Driver 来修正这个状态。删除第三方 vSphere CSI 驱动程序不需要删除关联的持久性卷(PV)对象,也不会发生数据丢失。

注意

这些说明可能不完整,因此请参阅厂商或社区供应商卸载指南,以确保删除驱动程序和组件。

卸载第三方 vSphere CSI 驱动程序:

  1. 删除第三方 vSphere CSI 驱动程序(VMware vSphere Container Storage 插件)部署和 Daemonset 对象。
  2. 删除之前使用第三方 vSphere CSI 驱动程序安装的 configmap 和 secret 对象。
  3. 删除第三方 vSphere CSI 驱动程序 CSIDriver 对象:

    ~ $ oc delete CSIDriver csi.vsphere.vmware.com
    csidriver.storage.k8s.io "csi.vsphere.vmware.com" deleted

从 OpenShift Container Platform 集群中删除了第三方 vSphere CSI 驱动程序后,Red Hat 的 vSphere CSI Driver Operator 安装会自动恢复,以及阻止升级到 OpenShift Container Platform 4.11 或更高版本的任何条件。如果您已有 vSphere CSI PV 对象,它们的生命周期现在由红帽的 vSphere CSI Driver Operator 管理。

5.19.7. 配置 vSphere CSI 拓扑

OpenShift Container Platform 提供了将 OpenShift Container Platform for vSphere 部署到不同的区域和区域,允许您在多个计算集群中部署,这有助于避免单点故障。

注意

vSphere 上的 OpenShift Container Platform 不支持多个供应商。

这可以通过在 vCenter 中定义区域和区域类别来实现,然后将这些类别分配给不同的故障域,如计算集群,方法是为这些区域和区域类别创建标签。创建适当的类别并给 vCenter 对象分配了标签后,您可以创建额外的机器集来创建负责在这些故障域中调度 pod 的虚拟机(VM)。

步骤

  1. 在 VMware vCenter vSphere 客户端 GUI 中,定义适当的区域和区域校准和标签。

    虽然 vSphere 允许您使用任意名称创建类别,但 OpenShift Container Platform 强烈建议您使用 openshift-regionopenshift-zone 名称来定义拓扑。

    以下示例定义了两个区域和两个区的故障域:

    表 5.4. 带有一个区域的 vSphere 拓扑和两个区

    Compute 集群故障域描述

    Compute 集群: ocp1, Datacenter: Atlanta

    openshift-region: us-east-1 (tag), openshift-zone: us-east-1a (tag)

    这会在区域 us-east-1 中定义一个带有区域 us-east-1a 的故障域。

    计算 cluster: ocp2, Datacenter: Atlanta

    openshift-region: us-east-1 (tag), openshift-zone: us-east-1b (tag)

    这会在名为 us-east-1b 的同一区域中定义不同的故障域。

    有关 vSphere 类别和标签的更多信息,请参阅 VMware vSphere 文档。

  2. 要允许容器存储接口(CSI)驱动程序检测到这个拓扑,请编辑 clusterCSIDriver 对象 YAML 文件 driverConfig 部分:

    • 指定之前创建的 openshift-zoneopenshift-region 类别。
    • driverType 设置为 vSphere

      ~ $ oc edit clustercsidriver csi.vsphere.vmware.com -o yaml

      输出示例

      apiVersion: operator.openshift.io/v1
      kind: ClusterCSIDriver
      metadata:
       name: csi.vsphere.vmware.com
      spec:
       logLevel: Normal
       managementState: Managed
       observedConfig: null
       operatorLogLevel: Normal
       unsupportedConfigOverrides: null
       driverConfig:
        driverType: vSphere 1
          vSphere:
            topologyCategories: 2
            - openshift-zone
            - openshift-region

      1
      确保 driverType 设置为 vSphere
      2
      在 vCenter 前面创建的 openshift-zoneopenshift-region 类别。
  3. 运行以下命令,验证 CSINode 对象是否有拓扑键:

    ~ $ oc get csinode

    输出示例

    NAME                        DRIVERS     AGE
    co8-4s88d-infra-2m5vd       1           27m
    co8-4s88d-master-0          1           70m
    co8-4s88d-master-1          1           70m
    co8-4s88d-master-2          1           70m
    co8-4s88d-worker-j2hmg      1           47m
    co8-4s88d-worker-mbb46      1           47m
    co8-4s88d-worker-zlk7d      1           47m

    ~ $ oc get csinode co8-4s88d-worker-j2hmg -o yaml

    输出示例

    ...
    spec:
        drivers:
        - allocatable:
            count: 59
        name: csi-vsphere.vmware.com
        nodeID: co8-4s88d-worker-j2hmg
        topologyKeys: 1
        - topology.csi.vmware.com/openshift-zone
        - topology.csi.vmware.com/openshift-region

    1
    vSphere openshift-zoneopenshift-region 目录中的拓扑键。
    注意

    CSINode 对象可能需要一些时间才能接收更新的拓扑信息。更新驱动程序后,CSI Node 对象应具有拓扑键。

  4. 创建标签以在故障域间分配给数据存储:

    当 OpenShift Container Platform 跨越多个故障域时,可能无法在这些故障域间共享数据存储,即持久性卷 (PV) 的拓扑感知置备会很有用。

    1. 在 vCenter 中,创建一个类别来标记数据存储。例如,openshift-zonal-datastore-cat。您可以使用任何其他类别名称,只要类别唯一用于标记参与 OpenShift Container Platform 集群的数据存储。此外,确保 StoragePodDatastore, and Folder 被选为创建类别的可关联实体。
    2. 在 vCenter 中,创建使用之前创建的类别的标签。本例使用标签名称 openshift-zonal-datastore
    3. 将之前创建的标签(本例中为 openshift-zonal-datastore)分配给故障域中的每个数据存储,并被视为动态置备。

      注意

      您可以使用您想要的任何名称进行类别和标签。本例中使用的名称作为建议提供。确保定义仅唯一标识与 OpenShift Container Platform 集群中所有主机共享的数据存储的标签和类别。

  5. 创建一个存储策略,该策略以每个故障域中基于标签的数据存储为目标:

    1. 在 vCenter 中,从主菜单中点 Policies and Profiles
    2. Policies and Profiles 页面中,在导航窗格中点 VM Storage Policies
    3. CREATE
    4. 输入存储策略的名称。
    5. 对于规则,选择 Tag 放置规则并选择以所需数据存储为目标的标签和类别(本例中为 openshift-zonal-datastore 标签)。

      数据存储列在存储兼容性表中。

  6. 创建新使用新区存储策略的存储类:

    1. Storage > StorageClasses
    2. StorageClasses 页面中,点 Create StorageClass
    3. Name 中输入新存储类的名称。
    4. Provisioner 下,选择 csi.vsphere.vmware.com
    5. Additional parameter 下,对于 StoragePolicyName 参数,将 Value 设置为之前创建的新区存储策略的名称。
    6. Create

      输出示例

      kind: StorageClass
      apiVersion: storage.k8s.io/v1
      metadata:
        name: zoned-sc 1
      provisioner: csi.vsphere.vmware.com
      parameters:
        StoragePolicyName: zoned-storage-policy 2
      reclaimPolicy: Delete
      allowVolumeExpansion: true
      volumeBindingMode: WaitForFirstConsumer

      1
      新的拓扑了解存储类名称。
      2
      指定区存储策略。
      注意

      您还可以通过编辑前面的 YAML 文件并运行 oc create -f $FILE 命令来创建存储类。

结果

从拓扑创建持久性卷声明(PVC)和 PV 感知存储类实际上是区域性的,应该根据 pod 的调度方式在相应区中使用数据存储:

~ $ oc get pv <pv-name> -o yaml

输出示例

...
nodeAffinity:
  required:
    nodeSelectorTerms:
    - matchExpressions:
      - key: topology.csi.vmware.com/openshift-zone 1
        operator: In
        values:
        - <openshift-zone>
      -key: topology.csi.vmware.com/openshift-region 2
        operator: In
        values:
        - <openshift-region>
...
peristentVolumeclaimPolicy: Delete
storageClassName: <zoned-storage-class-name> 3
volumeMode: Filesystem
...

1 2
PV 具有区域的密钥。
3
PV 使用区域存储类。

5.19.8. 其他资源