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

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

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

Hyperdisk Balanced High Availability

此示例展示了如何根据需要动态预配 Hyperdisk Balanced High Availability 卷,或如何由集群管理员提前手动预配它们。

动态预配

  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
    # Allow volume expansion.
    allowVolumeExpansion: true
    parameters:
      type: hyperdisk-balanced-high-availability
      # Provisioned throughput in MiB/s.
      provisioned-throughput-on-create: "250Mi"
      # Provisioned IOPS (input/output operations per second).
      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 High Availability 支持 ReadWriteOnceReadWriteManyReadWriteOncePod。如需了解每种访问模式的差异和应用场景,请参阅永久性卷访问模式
    • 如果您选择使用 ReadWriteMany,还需要将 volumeMode: Block 添加到 PersistentVolumeClaim。此设置可防止多个 Pod 同时写入存储空间而导致的数据损坏。volumeMode: Block 设置会将磁盘作为原始块存储设备公开,从而绕过 Kubernetes 的文件系统管理。下面给出了一个示例:
      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: podpvc
      spec:
        accessModes:
        - ReadWriteMany
        volumeMode: Block
        storageClassName: balanced-ha-storage
        resources:
          requests:
            storage: 20Gi
      ```
    
  4. 应用引用您之前创建的 StorageClass 的 PersistentVolumeClaim:

    kubectl apply -f pvc-example.yaml
    

手动预配

  1. 按照 Compute Engine 文档手动创建 Hyperdisk Balanced High Availability 卷。

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

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-demo
    spec:
      capacity:
        storage: 500Gi
      accessModes:
        - ACCESS_MODE
      # ClaimRef links this PersistentVolume to a PersistentVolumeClaim.
      claimRef:
        namespace: default
        name: podpvc
      csi:
        driver: pd.csi.storage.gke.io
        # The unique identifier of the Compute Engine disk resource that backs this volume.
        volumeHandle: projects/PROJECT_ID/regions/REGION/disks/gce-disk-1
      # Node affinity to ensure the Pod is scheduled in a zone where the volume is replicated.
      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 High Availability 支持 ReadWriteOnceReadWriteManyReadWriteOncePod。如需了解每种访问模式的差异和应用场景,请参阅永久性卷访问模式
  3. 创建引用您之前创建的 Hyperdisk Balanced High Availability 卷的永久性卷:

    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 High Availability 支持 ReadWriteOnceReadWriteManyReadWriteOncePod。必须与上一步中在 PersistentVolume 中指定的访问模式相同。如需了解每种访问模式的差异和应用场景,请参阅永久性卷访问模式
  5. 应用引用您之前创建的 PersistentVolume 的 PersistentVolumeClaim:

    kubectl apply -f pvc-example.yaml
    

以块模式使用多写入者卷

如需在块模式下使用卷,您必须在使用方 Pod 中指定 volumeBlock,而不是 volumeMounts。使用之前介绍的 PersistenVolumeClaim 的 Pod 示例应如下所示:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-server-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        # Use volumeDevices instead of volumeMounts to consume the volume as a raw block device.
        volumeDevices:
        # The "mountPath" field specifies the path where the block device is accessible in the container.
        - mountPath: /dev/my-device
          name: mypvc
      volumes:
      - name: mypvc
        persistentVolumeClaim:
          claimName: podpvc
          readOnly: false

区域永久性磁盘

与地区永久性磁盘一样,区域永久性磁盘可以根据需要动态预配,也可以由集群管理员提前预配,但建议使用动态预配。 如需利用 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
  # Specifies that the disk should be a regional persistent disk.
  replication-type: regional-pd
volumeBindingMode: WaitForFirstConsumer
# Constrains which zones the regional persistent disk can be provisioned in.
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
      # This Pod uses the PVC that's associated with the
      # "regionalpd-storageclass" StorageClass.
      persistentVolumeClaim:
        claimName: regional-pvc
  containers:
    - name: task-pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      # The volume is mounted into the container at the "/usr/share/nginx/html" path.
      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
  # Specifies that the disk should be a regional persistent disk.
  replication-type: regional-pd
volumeBindingMode: WaitForFirstConsumer
# Constrains which zones the regional persistent disk can be provisioned in.
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:
  # The StorageClass that specifies regional replication.
  storageClassName: "regionalpd-storageclass"
  capacity:
     storage: 500Gi
  accessModes:
     - ReadWriteOnce
  claimRef:
    namespace: default
    name: pv-claim-demo
  csi:
    driver: pd.csi.storage.gke.io
    # The unique identifier for the pre-existing regional disk.
    volumeHandle: projects/PROJECT_ID/regions/europe-west1/disks/gce-disk-1
  # Ensures that Pods are scheduled in zones where the disk is replicated.
  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 无法区分同名的地区永久性磁盘和区域永久性磁盘。如需解决此问题,请确保永久性磁盘的名称各不相同。如果使用动态预配的永久性磁盘,则不会出现此问题。

后续步骤