预配区域级永久性磁盘和 Hyperdisk Balanced 高可用性卷


本页面介绍如何为 Hyperdisk Balanced 高可用性卷区域级永久性磁盘启用动态预配功能,以及如何在 Google Kubernetes Engine (GKE) 中手动预配它们。如需了解机器类型兼容性,请参阅区域级磁盘的限制机器系列对 Hyperdisk 的支持。一般来说,对于第 3 代机器系列或更新的机器系列,您应使用 Hyperdisk Balanced 高可用性卷;对于第 2 代机器系列或更旧的机器系列,您应使用区域级永久性磁盘。如需详细了解机器系列世代,请参阅 Compute Engine 术语

如需了解如何为使用区域级永久性磁盘的高可用性应用创建端到端解决方案,请参阅使用 Stateful HA Operator 提高有状态应用的可用性。此功能不支持 Hyperdisk Balanced 高可用性卷。

Hyperdisk Balanced 高可用性

此示例展示了如何根据需要动态预配 Hyperdisk Balanced 高可用性卷,或如何由集群管理员提前手动预配该卷。

动态预配

  1. 将以下清单保存在名为 balanced-ha-storage.yaml 的文件中。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: balanced-ha-storage
    provisioner: pd.csi.storage.gke.io
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    parameters:
      type: hyperdisk-balanced-high-availability
      provisioned-throughput-on-create: "250Mi"
      provisioned-iops-on-create: "7000"
    allowedTopologies:
    - matchLabelExpressions:
      - key: topology.gke.io/zone
        values:
        - ZONE1
        - ZONE2
    

    替换以下内容:

    • ZONE1ZONE2:将复制动态预配的卷的区域内的可用区。
  2. 创建 StorageClass:

    kubectl create -f hdb-ha-example-class.yaml
    
  3. 将以下 PersistentVolumeClaim 清单保存到名为 pvc-example.yaml 的文件中:

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
      - ACCESS_MODE
      storageClassName: balanced-ha-storage
      resources:
        requests:
          storage: 20Gi
    

    替换以下内容:

    • ACCESS_MODE:Hyperdisk Balanced 高可用性支持 ReadWriteOnceReadWriteManyReadWriteOncePod。如需了解每种访问模式的差异和应用场景,请参阅永久性卷访问模式
  4. 应用引用您之前创建的 StorageClass 的 PersistentVolumeClaim:

    kubectl apply -f pvc-example.yaml
    

手动预配

  1. 按照 Compute Engine 文档手动创建 Hyperdisk Balanced 高可用性卷。

  2. 将以下 PersistentVolume 清单保存在名为 pv-example.yaml 的文件中。清单引用了您刚刚创建的 Hyperdisk Balanced 高可用性卷:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-demo
    spec:
      capacity:
        storage: 500Gi
      accessModes:
        - ACCESS_MODE
      claimRef:
        namespace: default
        name: podpvc
      csi:
        driver: pd.csi.storage.gke.io
        volumeHandle: projects/PROJECT_ID/regions/REGION/disks/gce-disk-1
      nodeAffinity:
        required:
          nodeSelectorTerms:
            - matchExpressions:
              - key: topology.gke.io/zone
                operator: In
                values:
                - ZONE1
                - ZONE2
    

    替换以下内容:

    • PROJECT_ID:您创建的卷的项目 ID。
    • REGION:您创建的磁盘的区域。如需了解最新的区域可用性,请参阅 Compute Engine 文档
    • ZONE1ZONE2:复制您创建的卷的区域内的可用区。
    • ACCESS_MODE:Hyperdisk Balanced 高可用性支持 ReadWriteOnceReadWriteManyReadWriteOncePod。如需了解每种访问模式的差异和应用场景,请参阅永久性卷访问模式
  3. 创建引用您之前创建的 Hyperdisk Balanced 高可用性卷的永久性卷:

    kubectl apply -f pv-example.yaml
    
  4. 将以下 PersistentVolumeClaim 清单保存到名为 pvc-example.yaml 的文件中:

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
      - ACCESS_MODE
      storageClassName: balanced-ha-storage
      resources:
        requests:
          storage: 20Gi
    

    替换以下内容:

    • ACCESS_MODE:Hyperdisk Balanced 高可用性支持 ReadWriteOnceReadWriteManyReadWriteOncePod。必须与上一步中在 PersistentVolume 中指定的访问模式相同。如需了解每种访问模式的差异和应用场景,请参阅永久性卷访问模式
  5. 应用引用您之前创建的 PersistentVolume 的 PersistentVolumeClaim:

    kubectl apply -f pvc-example.yaml
    

区域级永久性磁盘

与地区永久性磁盘一样,区域永久性磁盘可以根据需要动态预配,也可以由集群管理员提前预配,但建议使用动态预配。 如需利用 pd-standard 类型的区域级永久性磁盘,请将 PersistentVolumeClaim 的 spec.resources.requests.storage 属性设置为至少 200 GiB。如果您的用例需要较小的卷,请考虑改用 pd-balancedpd-ssd

动态预配

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

后续步骤