5.13. GCP PD CSI Driver Operator

5.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 的存储类。您还可以选择按照使用 GCE Persistent Disk 的持久性存储中的内容创建 GCP PD 存储类。
  • GCP PD 驱动程序:该驱动程序可让您创建并挂载 GCP PD PV。
重要

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

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

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

5.13.2. 关于 CSI

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

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

5.13.3. 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 存储类参数。

表 5.2. CreateVolume 参数

参数默认描述

type

pd-ssd 或者 pd-standard

pd-standard

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

replication-type

noneregional-pd

none

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

disk-encryption-kms-key

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

空字符串

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

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

创建 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 集群一起使用。