佈建區域性永久磁碟和 Hyperdisk 已平衡高可用性磁碟區


本頁說明如何在 Google Kubernetes Engine (GKE) 中啟用Hyperdisk Balanced 高可用性磁碟區區域性永久磁碟的動態佈建,以及如何手動佈建這些磁碟。如要瞭解機器類型相容性,請參閱「區域磁碟的限制」和「支援 Hyperdisk 的機器系列」。一般來說,您應該為第 3 代機器系列或更新版本使用 Hyperdisk 平衡高可用性磁碟區,並為第 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
    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 High Availability 支援 ReadWriteOnceReadWriteManyReadWriteOncePod。如要瞭解各存取模式的差異和用途,請參閱「永久磁碟區存取模式」。
    • 如果選擇使用 ReadWriteMany,也必須將 volumeMode: Block 新增至 PersistentVolumeClaim,如下列範例所示:
      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:
        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 High Availability 支援 ReadWriteOnceReadWriteManyReadWriteOncePod。如要瞭解各存取模式的差異和用途,請參閱「永久磁碟區存取模式」。
  3. 建立永久磁碟區,參照先前建立的 Hyperdisk 已平衡高可用性磁碟區:

    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
        volumeDevices:
        - 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 中指定區域限制。

舉例來說,下列資訊清單說明使用標準永久磁碟的 StorageClass,並將資料複製到 europe-west1-beurope-west1-c 區域:regionalpd-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

如果使用區域叢集,可以不指定 allowedTopologies。如果您這麼做,當您建立使用這個 StorageClass 的 Pod 時,系統會佈建兩個可用區的地區永久磁碟。PersistentVolumeClaim其中一個可用區與 Pod 排定時間的可用區相同。系統會從叢集可用的區域中隨機挑選其他區域。

使用可用區叢集時,必須設定 allowedTopologies

建立 StorageClass 後,請使用 storageClassName 欄位參照 StorageClass,接著建立 PersistentVolumeClaim 物件。舉例來說,下列資訊清單會建立名為 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 指令建立地區永久磁碟。下列範例會建立名為 gce-disk-1 的磁碟,並將資料複製到 europe-west1-beurope-west1-c 區域:

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

然後,您可以建立 PersistentVolume,參照您剛建立的地區永久磁碟。除了「使用既有的永久磁碟做為 PersistentVolumes」一文中的物件,地區永久磁碟的 PersistentVolume 也應指定 node-affinity。如果您使用 StorageClass,則應指定永久磁碟 CSI 驅動程式。

以下是 StorageClass 資訊清單範例,該資訊清單使用標準永久磁碟,並將資料複製到 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

以下是建立名為 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
  • 即使設為 default,也必須指定 claimRef.namespace 欄位。

為永久磁碟命名

Kubernetes 無法區分具有相同名稱的區域和地區永久磁碟。解決方法是,請確保永久磁碟使用不重複的名稱。使用動態佈建的永久磁碟時,不會發生這個問題。

後續步驟