预配区域永久性磁盘


本页面介绍如何为区域 Persistent Disk 启用动态预配功能,以及如何在 Google Kubernetes Engine (GKE) 中手动预配它们。

如需了解如何为使用区域永久性磁盘的高可用性应用创建端到端解决方案,请参阅使用 Stateful HA Operator 提高有状态应用的可用性

区域永久性磁盘

与地区永久性磁盘一样,区域永久性磁盘可以根据需要动态预配,也可以由集群管理员提前预配,但建议使用动态预配。

动态预配

如需启用区域永久性磁盘的动态预配,请使用 replication-type 参数创建一个 StorageClass,并在 allowedTopologies 中指定地区限制。

例如,以下清单描述了一个名为 regionalpd-storageclassStorageClass,它使用标准永久性磁盘并将数据复制到 europe-west1-beurope-west1-c 地区:

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: regionalpd-storageclass
provisioner: pd.csi.storage.gke.io
parameters:
  type: pd-balanced
  replication-type: regional-pd
volumeBindingMode: WaitForFirstConsumer
allowedTopologies:
- matchLabelExpressions:
  - key: topology.gke.io/zone
    values:
    - europe-west1-b
    - europe-west1-c

如果使用区域级集群,则可以不指定 allowedTopologies。如果这样做,则在创建使用 PersistentVolumeClaim(使用此 StorageClass)的 Pod 时,系统会为区域永久性磁盘预配两个可用区。一个可用区是安排 Pod 的可用区。另一个可用区是从集群的可用区中随机选择的。

使用可用区级集群时,必须设置 allowedTopologies

创建 StorageClass 后,接下来创建 PersistentVolumeClaim 对象,以使用 storageClassName 字段引用 StorageClass。例如,以下清单创建一个名为 regional-pvcPersistentVolumeClaim 并引用 regionalpd-storageclass

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: regional-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500Gi
  storageClassName: regionalpd-storageclass

由于 StorageClass 是使用 volumeBindingMode: WaitForFirstConsumer 进行配置的,因此在创建使用 PersistentVolumeClaim 的 Pod 之前系统不会预配 PersistentVolume

以下清单是使用先前创建的 PersistentVolumeClaim 的示例 Pod:

kind: Pod
apiVersion: v1
metadata:
  name: task-pv-pod
spec:
  volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
        claimName: regional-pvc
  containers:
    - name: task-pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: task-pv-storage

手动预配

首先,使用 gcloud compute disks create 命令创建区域永久性磁盘。以下示例创建了一个被复制到 europe-west1-beurope-west1-c 可用区的名为 gce-disk-1 的磁盘:

gcloud compute disks create gce-disk-1 \
   --size 500Gi \
   --region europe-west1 \
   --replica-zones europe-west1-b,europe-west1-c

然后,您可以创建一个引用您刚创建的区域永久性磁盘的 PersistentVolume。除了将原有永久性磁盘用作 PersistentVolume 的对象,区域永久性磁盘的 PersistentVolume 还应指定node-affinity。 如果您使用 StorageClass,则应指定永久性磁盘 CSI 驱动程序。

下面是一个使用标准永久性磁盘并将数据复制到 europe-west1-beurope-west1-c 可用区的 StorageClass 清单示例:

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: regionalpd-storageclass
provisioner: pd.csi.storage.gke.io
parameters:
  type: pd-balanced
  replication-type: regional-pd
volumeBindingMode: WaitForFirstConsumer
allowedTopologies:
- matchLabelExpressions:
  - key: topology.gke.io/zone
    values:
    - europe-west1-b
    - europe-west1-c

以下清单示例创建了一个名为 pv-demoPersistentVolume 并引用 regionalpd-storageclass

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-demo
spec:
  storageClassName: "regionalpd-storageclass"
  capacity:
     storage: 500Gi
  accessModes:
     - ReadWriteOnce
  claimRef:
    namespace: default
    name: pv-claim-demo
  csi:
    driver: pd.csi.storage.gke.io
    volumeHandle: projects/PROJECT_ID/regions/europe-west1/disks/gce-disk-1
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
          - key: topology.gke.io/zone
            operator: In
            values:
               - europe-west1-b
               - europe-west1-c

请注意 PersistentVolume 示例的以下事项:

  • volumeHandle 字段包含 gcloud compute disks create 调用中的详细信息,包括 PROJECT_ID
  • 即使 claimRef.namespace 字段设置为 default,也必须指定它。

为永久性磁盘命名

Kubernetes 无法区分同名的地区永久性磁盘和区域永久性磁盘。如需解决此问题,请确保永久性磁盘的名称各不相同。如果使用动态预配的永久性磁盘,则不会出现此问题。

后续步骤