5.5. GCP PD CSI Driver Operator
5.5.1. 概述
OpenShift Dedicated 可以使用 Google Cloud Platform(GCP)持久性存储的 Container Storage Interface(CSI)驱动程序来置备持久性卷(PV)。
在使用 Container Storage Interface (CSI) Operator 和驱动时,我们建议用户需要熟悉持久性存储和配置 CSI 卷。
要创建挂载到 GCP PD 存储资产中的 CSI 置备持久性卷(PV),OpenShift Dedicated 在 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 磁盘。
5.5.2. 用于裸机和 N4 机器集的 C3 实例类型
5.5.2.1. C3 和 N4 实例类型限制
对裸机和 N4 机器集的 C3 实例类型的 GCP PD CSI 驱动程序支持有以下限制:
- 使用存储池时不支持克隆卷。
- 对于克隆或重新定义大小,超磁盘平衡的磁盘大小必须是 6Gi 或更高。
默认存储类是 standard-csi。
重要您需要手动创建存储类。
有关创建存储类的详情,请参考 设置超线程磁盘 一节中的第 2 步。
- 不支持使用不同存储类型(如 N2 和 N4)的混合虚拟机(VM)的集群。这是因为超disks-balanced 磁盘在大多数旧虚拟机上不可用。同样,常规持久磁盘在 N4/C3 虚拟机上不可用。
- 具有 c3-standard-2、c3-standard-4、n4-standard-2 和 n4-standard-4 节点的 GCP 集群可能会错误地超过最大可附加磁盘号码,其应为 16 (JIRA 链接)。
5.5.2.2. 用于超磁盘平衡磁盘的存储池概述
Hyperdisk 存储池可用于计算引擎进行大规模存储。超磁盘存储池是购买的容量、吞吐量和 IOPS 集合,您可以根据需要为应用程序进行配置。您可以使用超磁盘存储池来创建和管理池中的磁盘,并使用多个工作负载的磁盘。通过以聚合的形式管理磁盘,您可以在实现预期容量和性能增长的同时降低成本。通过仅使用超磁盘存储池中所需的存储,您可以降低预测容量的复杂性,并通过管理数百个磁盘来管理单个存储池来减少管理。
要设置存储池,请参阅设置超磁盘平衡的磁盘。
5.5.2.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
创建使用您刚才创建的 PVC 的部署。使用部署有助于确保应用程序可以访问持久性存储,即使 pod 重启和重新调度:
- 在创建部署前,请确保具有指定机器集的节点池已启动并在运行。否则,pod 无法调度。
使用以下示例 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
运行以下命令确认部署是否已成功创建:
$ oc get deployment
输出示例
NAME READY UP-TO-DATE AVAILABLE AGE postgres 0/1 1 0 42s
可能需要过几分钟后,超磁盘实例才会完成调配,并显示 READY 状态。
运行以下命令确认 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
确认 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 磁盘。
如果使用存储池,请运行以下命令检查卷是否在存储类和 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
5.5.3. 关于 CSI
在过去,存储厂商一般会把存储驱动作为 Kubernetes 的一个部分提供。随着容器存储接口 (CSI) 的实现,第三方供应商可以使用标准接口来提供存储插件,而无需更改核心 Kubernetes 代码。
CSI Operators 为 OpenShift Dedicated 用户提供了存储选项,如卷快照,它无法通过 in-tree 卷插件实现。
5.5.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 Dedicated 支持的所有 GCP PD CSI 存储类参数。
参数 | 值 | 默认 | 描述 |
---|---|---|---|
|
|
| 允许您选择标准的 PV 或使用固态硬盘的 PV。 驱动程序不会验证值,因此接受所有可能的值。 |
|
|
| 允许您在 zonal 或区域 PV 之间进行选择。 |
| 用于加密新磁盘的密钥的完全限定资源标识符。 | 空字符串 | 使用客户管理的加密密钥(CMEK)加密新磁盘。 |
5.5.5. 创建自定义加密的持久性卷
创建 PersistentVolumeClaim
对象时,OpenShift Dedicated 会置备一个新的持久性卷(PV)并创建一个 PersistentVolume
对象。您可以通过加密新创建的 PV,在 Google Cloud Platform(GCP)中添加自定义加密密钥来保护集群中的 PV。
要加密,您新创建的 PV 使用新的或现有的 Google Cloud Key Management Service(KMS)密钥在集群中使用用户管理的加密密钥(CMEK)。
先决条件
- 已登陆到一个正在运行的 OpenShift Dedicated 集群。
- 您已创建了 Cloud KMS 密钥环以及密钥版本。
有关 CMEK 和 Cloud KMS 资源的更多信息,请参阅使用客户管理的加密密钥(CMEK)。
流程
要创建自定义加密 PV,请完成以下步骤:
使用 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
。使用
oc
命令在 OpenShift Dedicated 集群上部署存储类:$ 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
创建名为
pvc.yaml
的文件,该文件与您在上一步中创建的存储类对象的名称匹配:kind: PersistentVolumeClaim apiVersion: v1 metadata: name: podpvc spec: accessModes: - ReadWriteOnce storageClassName: csi-gce-pd-cmek resources: requests: storage: 6Gi
注意如果将新存储类标记为默认值,可以省略
storageClassName
字段。在集群中应用 PVC:
$ oc apply -f pvc.yaml
获取 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 Dedicated 集群一起使用。