6.13. GCP PD CSI Driver Operator


6.13.1. 概述

OpenShift Container Platform 可以使用 Google Cloud Platform(GCP)持久性存储的 Container Storage Interface(CSI)驱动程序来置备持久性卷(PV)。

在使用 Container Storage Interface (CSI) Operator 和驱动时,我们建议用户需要熟悉持久性存储配置 CSI 卷

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

  • GCP PD CSI Driver Operator:默认情况下,Operator 提供了一个可用来创建 PVC 的存储类。如果需要,您可以禁用此默认存储类 (请参阅管理默认存储类)。您还可以选择创建 GCP PD 存储类,如使用 GCE Persistent Disk 的 Persistent Storage 所述。
  • GCP PD 驱动程序:该驱动程序可让您创建并挂载 GCP PD PV。

    GCP PD CSI 驱动程序支持裸机和 N4 机器集的 C3 实例类型。C3 实例类型和 N4 机器集支持 hyperdisk-balanced 磁盘。

OpenShift Container Platform 为 GCE Persistent Disk in-tree 卷插件提供自动迁移到对应的 CSI 驱动程序。如需更多信息,请参阅 CSI 自动迁移

6.13.2. 用于裸机和 N4 机器集的 C3 实例类型

6.13.2.1. C3 和 N4 实例类型限制

对裸机和 N4 机器集的 C3 实例类型的 GCP PD CSI 驱动程序支持有以下限制:

  • 在创建超磁盘平衡磁盘时,您必须将卷大小设置为至少 4Gi。OpenShift Container Platform 不会舍入到最小大小,因此您必须自己指定正确的大小。
  • 使用存储池时不支持克隆卷。
  • 对于克隆或重新定义大小,超磁盘平衡的磁盘大小必须是 6Gi 或更高。
  • 默认存储类是 standard-csi。

    重要

    您需要手动创建存储类。

    有关创建存储类的详情,请参考设置超线程磁盘一节中的第 2 步。

  • 不支持使用不同存储类型(如 N2 和 N4)的混合虚拟机(VM)的集群。这是因为 hyperdisks-balanced 磁盘在大多数旧虚拟机上不可用。同样,常规持久磁盘在 N4/C3 虚拟机上不可用。
  • 具有 c3-standard-2、c3-standard-4、n4-standard-2 和 n4-standard-4 节点的 GCP 集群可能会错误地超过最大可附加磁盘号码,其应为 16 (JIRA 链接)。
  • 其他限制

Hyperdisk 存储池可用于计算引擎进行大规模存储。超磁盘存储池是购买的容量、吞吐量和 IOPS 集合,您可以根据需要为应用程序进行配置。您可以使用超磁盘存储池来创建和管理池中的磁盘,并使用多个工作负载的磁盘。通过以聚合的形式管理磁盘,您可以在实现预期容量和性能增长的同时降低成本。通过仅使用超磁盘存储池中所需的存储,您可以降低预测容量的复杂性,并通过管理数百个磁盘来管理单个存储池来减少管理。

要设置存储池,请参阅设置超磁盘平衡的磁盘

6.13.2.3. 设置超磁盘平衡磁盘

先决条件

  • 使用管理特权访问集群

流程

完成以下步骤以设置超磁盘平衡的磁盘:

  1. 使用通过 hyperdisk-balanced 磁盘置备的附加磁盘创建 GCP 集群。
  2. 在安装过程中创建指定超磁盘平衡磁盘的存储类:

    1. 按照使用自定义在 GCP 上安装集群中的步骤操作

      对于 install-config.yaml 文件,请使用以下示例文件:

      install-config YAML 文件示例

      apiVersion: v1
      metadata:
        name: ci-op-9976b7t2-8aa6b
      
      sshKey: |
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      baseDomain: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      platform:
        gcp:
          projectID: XXXXXXXXXXXXXXXXXXXXXX
          region: us-central1
      controlPlane:
        architecture: amd64
        name: master
        platform:
          gcp:
            type: n4-standard-4 
      1
      
            osDisk:
              diskType: hyperdisk-balanced 
      2
      
              diskSizeGB: 200
        replicas: 3
      compute:
      - architecture: amd64
        name: worker
        replicas: 3
        platform:
          gcp:
            type: n4-standard-4 
      3
      
            osDisk:
              diskType: hyperdisk-balanced 
      4

      1 3
      将节点类型指定为 n4-standard-4。
      2 4
      指定节点具有由 hyperdisk-balanced 磁盘类型支持的根磁盘。集群中的所有节点都应该使用相同的磁盘类型,可以是 hyperdisks-balanced 或 pd fluentd。
      注意

      集群中的所有节点都必须支持 hyperdisk-balanced 卷。不支持使用混合节点的集群,如使用 hyperdisk-balanced 磁盘的 N2 和 N3。

    2. 合并 Cloud Credential Operator 工具清单 部分的第 3 步后,将以下清单复制到安装程序创建的 manifests 目录中:

      • cluster_csi_driver.yaml - 指定不使用默认存储类创建
      • StorageClass.yaml - 创建一个特定于磁盘的存储类

        集群 CSI 驱动程序 YAML 文件示例

        apiVersion: operator.openshift.io/v1
        kind: "ClusterCSIDriver"
        metadata:
          name: "pd.csi.storage.gke.io"
        spec:
          logLevel: Normal
          managementState: Managed
          operatorLogLevel: Normal
          storageClassState: Unmanaged 
        1

        1
        指定禁用创建默认 OpenShift Container Platform 存储类。

        存储类 YAML 文件示例

        apiVersion: storage.k8s.io/v1
        kind: StorageClass
        metadata:
          name: hyperdisk-sc 
        1
        
          annotations:
            storageclass.kubernetes.io/is-default-class: "true"
        provisioner: pd.csi.storage.gke.io 
        2
        
        volumeBindingMode: WaitForFirstConsumer
        allowVolumeExpansion: true
        reclaimPolicy: Delete
        parameters:
          type: hyperdisk-balanced 
        3
        
          replication-type: none
          provisioned-throughput-on-create: "140Mi" 
        4
        
          provisioned-iops-on-create: "3000" 
        5
        
          storage-pools: projects/my-project/zones/us-east4-c/storagePools/pool-us-east4-c 
        6
        
        allowedTopologies: 
        7
        
        - matchLabelExpressions:
          - key: topology.kubernetes.io/zone
            values:
            - us-east4-c
        ...

        1
        指定存储类的名称。在本例中,它是 hyperdisk-sc
        2
        pd.csi.storage.gke.io 指定 GCP CSI 置备程序。
        3
        使用 hyperdisk-balanced 磁盘指定。
        4
        使用 "Mi" qualifier 指定 MiBps 中的吞吐量值。例如,如果您的所需的吞吐量为 250 MiBps,请指定 "250Mi"。如果没有指定值,则容量基于磁盘类型默认值。
        5
        指定没有限定符的 IOPS 值。例如,如果您需要 7,000 IOPS,请指定 "7000"。如果没有指定值,则容量基于磁盘类型默认值。
        6
        如果使用存储池,请指定您要使用的特定存储池的列表: projects/PROJECT_ID/zones/ZONE/storagePools/STORAGE_POOL_NAME。
        7
        如果使用存储池,请设置 allowedTopologies,将置备卷的拓扑限制为存储池所在的位置。在本例中,us-east4-c
  3. 使用以下 YAML 文件示例,创建一个使用 hyperdisk 特定存储类的持久性卷声明(PVC):

    PVC YAML 文件示例

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-pvc
    spec:
      storageClassName: hyperdisk-sc 
    1
    
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 2048Gi 
    2

    1
    PVC 引用特定于存储池的存储类。在本例中,hyperdisk-sc
    2
    超磁盘平衡卷的目标存储容量。在本例中,2048Gi
  4. 创建使用您刚才创建的 PVC 的部署。使用部署有助于确保应用程序可以访问持久性存储,即使 pod 重启和重新调度:

    1. 在创建部署前,请确保具有指定机器集的节点池已启动并在运行。否则,pod 无法调度。
    2. 使用以下示例 YAML 文件创建部署:

      部署 YAML 文件示例

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: postgres
      spec:
        selector:
          matchLabels:
            app: postgres
        template:
          metadata:
            labels:
              app: postgres
          spec:
            nodeSelector:
              cloud.google.com/machine-family: n4 
      1
      
            containers:
            - name: postgres
              image: postgres:14-alpine
              args: [ "sleep", "3600" ]
              volumeMounts:
              - name: sdk-volume
                mountPath: /usr/share/data/
            volumes:
            - name: sdk-volume
              persistentVolumeClaim:
                claimName: my-pvc 
      2

      1
      指定机器系列。在本例中,是 n4
      2
      指定上一步中创建的 PVC 名称。在本例中,是 my-pfc
    3. 运行以下命令确认部署是否已成功创建:

      $ oc get deployment

      输出示例

      NAME       READY   UP-TO-DATE   AVAILABLE   AGE
      postgres   0/1     1            0           42s

      可能需要过几分钟后,超磁盘实例才会完成调配,并显示 READY 状态。

    4. 运行以下命令确认 PVC my-pvc 已成功绑定到持久性卷(PV):

      $ oc get pvc my-pvc

      输出示例

      NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       VOLUMEATTRIBUTESCLASS  AGE
      my-pvc        Bound    pvc-1ff52479-4c81-4481-aa1d-b21c8f8860c6   2Ti        RWO            hyperdisk-sc       <unset>                2m24s

    5. 确认 hyperdisk-balanced 磁盘的预期配置:

      $ gcloud compute disks list

      输出示例

      NAME                                        LOCATION        LOCATION_SCOPE  SIZE_GB  TYPE                STATUS
      instance-20240914-173145-boot               us-central1-a   zone            150      pd-standard         READY
      instance-20240914-173145-data-workspace     us-central1-a   zone            100      pd-balanced         READY
      c4a-rhel-vm                                 us-central1-a   zone            50       hyperdisk-balanced  READY 
      1

      1
      Hyperdisk-balanced 磁盘。
    6. 如果使用存储池,请运行以下命令检查卷是否在存储类和 PVC 中指定:

      $ gcloud compute storage-pools list-disks pool-us-east4-c --zone=us-east4-c

      输出示例

      NAME                                      STATUS  PROVISIONED_IOPS  PROVISIONED_THROUGHPUT  SIZE_GB
      pvc-1ff52479-4c81-4481-aa1d-b21c8f8860c6  READY   3000              140                     2048

6.13.3. 关于 CSI

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

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

6.13.4. GCP PD CSI 驱动程序存储类参数

Google Cloud Platform(GCP)持久磁盘(PD)Container Storage Interface(CSI)驱动程序使用 CSI external-provisioner sidecar 作为控制器。这是和 CSI 驱动程序一起部署的单独的 helper 容器。sidecar 通过触发 CreateVolume 操作来管理持久性卷(PV)。

GCP PD CSI 驱动程序使用 csi.storage.k8s.io/fstype 参数键来支持动态置备。下表描述了 OpenShift Container Platform 支持的所有 GCP PD CSI 存储类参数。

Expand
表 6.5. CreateVolume 参数
参数默认描述

type

pd-ssd,pd-standard, 或 pd-balanced

pd-standard

允许您选择标准的 PV 或使用固态硬盘的 PV。

驱动程序不会验证值,因此接受所有可能的值。

replication-type

noneregional-pd

none

允许您在 zonal 或区域 PV 之间进行选择。

disk-encryption-kms-key

用于加密新磁盘的密钥的完全限定资源标识符。

空字符串

使用客户管理的加密密钥(CMEK)加密新磁盘。

6.13.5. 创建自定义加密的持久性卷

创建 PersistentVolumeClaim 对象时,OpenShift Container Platform 会置备一个新的持久性卷(PV)并创建一个 PersistentVolume 对象。您可以通过加密新创建的 PV,在 Google Cloud Platform(GCP)中添加自定义加密密钥来保护集群中的 PV。

要加密,您新创建的 PV 使用新的或现有的 Google Cloud Key Management Service(KMS)密钥在集群中使用用户管理的加密密钥(CMEK)。

先决条件

  • 登陆到一个正在运行的 OpenShift Container Platform 集群。
  • 您已创建了 Cloud KMS 密钥环以及密钥版本。

有关 CMEK 和 Cloud KMS 资源的更多信息,请参阅使用客户管理的加密密钥(CMEK)

流程

要创建自定义加密 PV,请完成以下步骤:

  1. 使用 Cloud KMS 密钥创建存储类。以下示例启用加密卷的动态置备:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: csi-gce-pd-cmek
    provisioner: pd.csi.storage.gke.io
    volumeBindingMode: "WaitForFirstConsumer"
    allowVolumeExpansion: true
    parameters:
      type: pd-standard
      disk-encryption-kms-key: projects/<key-project-id>/locations/<location>/keyRings/<key-ring>/cryptoKeys/<key> 
    1
    1
    此字段必须是用于加密新磁盘的密钥的资源标识符。值是区分大小写的。有关提供关键 ID 值的更多信息,请参阅检索资源 ID获取 Cloud KMS 资源 ID
    注意

    您不能将 disk-encryption-kms-key 参数添加到现有的存储类中。但是,您可以删除存储类并使用相同的名称和不同的参数集合重新创建该存储类。如果您这样做,现有类的置备程序必须是 pd.csi.storage.gke.io

  2. 使用 oc 命令在 OpenShift Container Platform 集群上部署存储类:

    $ oc describe storageclass csi-gce-pd-cmek

    输出示例

    Name:                  csi-gce-pd-cmek
    IsDefaultClass:        No
    Annotations:           None
    Provisioner:           pd.csi.storage.gke.io
    Parameters:            disk-encryption-kms-key=projects/key-project-id/locations/location/keyRings/ring-name/cryptoKeys/key-name,type=pd-standard
    AllowVolumeExpansion:  true
    MountOptions:          none
    ReclaimPolicy:         Delete
    VolumeBindingMode:     WaitForFirstConsumer
    Events:                none

  3. 创建名为 pvc.yaml 的文件,该文件与您在上一步中创建的存储类对象的名称匹配:

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: csi-gce-pd-cmek
      resources:
        requests:
          storage: 6Gi
    注意

    如果将新存储类标记为默认值,可以省略 storageClassName 字段。

  4. 在集群中应用 PVC:

    $ oc apply -f pvc.yaml
  5. 获取 PVC 的状态,并验证它是否已创建并绑定到新置备的 PV:

    $ oc get pvc

    输出示例

    NAME      STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS     AGE
    podpvc    Bound     pvc-e36abf50-84f3-11e8-8538-42010a800002   10Gi       RWO            csi-gce-pd-cmek  9s

    注意

    如果您的存储类将 volumeBindingMode 字段设置为 WaitForFirstConsumer,您必须创建一个 pod 来使用 PVC,然后才能验证它。

您的 CMEK 保护 PV 现在可以与 OpenShift Container Platform 集群一起使用。

6.13.6. 用户管理的加密

用户管理的加密功能允许您在安装过程中提供加密 OpenShift Container Platform 节点根卷的密钥,并允许所有受管存储类使用这些密钥加密置备的存储卷。您必须在 install-config YAML 文件中的 platform.<cloud_type>.defaultMachinePlatform 字段中指定自定义密钥。

此功能支持以下存储类型:

  • Amazon Web Services (AWS) Elastic Block storage (EBS)
  • Microsoft Azure Disk 存储
  • Google Cloud Platform (GCP) 持久磁盘 (PD) 存储
  • IBM Virtual Private Cloud (VPC) Block 存储

有关使用用户管理的 GCP PD 加密安装的详情,请参考安装配置参数

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部