全部產品
Search
文件中心

Container Service for Kubernetes:使用ESSD同城冗餘雲端硬碟實現應用的跨可用性區域容災

更新時間:Sep 16, 2025

ESSD同城冗餘雲端硬碟是一種全新的ESSD雲端硬碟,寫入該雲端硬碟的資料會自動存放在多個可用性區域,可用性區域的IDC、機櫃、電源等均實現物理隔離。基於ESSD同城冗餘部署應用,有狀態的應用可以零改造成本,從單可用性區域應用升級為具有跨可用性區域級容災能力的應用,當節點或可用性區域發生故障,或單可用性區域資源不足時,均可將該容器遷移到其他可用性區域,無需進行複雜的資料同步和資料校正,幫您實現更加簡化的資料高可用架構。

閱讀前提示

為了使您更好地瞭解ESSD同城冗餘雲端硬碟,建議您在閱讀本文之前,瞭解以下內容:

  • ESSD同城冗餘雲端硬碟簡介,請參見雲端硬碟簡介

  • ESSD同城冗餘雲端硬碟僅支援部分地區。更多使用限制,請參見使用限制

  • ESSD同城冗餘雲端硬碟收取雲端硬碟容量費,在容器中掛載使用時,僅支援隨用隨付。具體計費規則請參見Block Storage計費

前提條件

已建立ACK託管叢集,且叢集為1.26及以上版本。叢集中csi-plugin和csi-provisioner組件版本為1.33.4及以上,請參見csi-plugincsi-provisioner

使用方法

  1. 確認叢集中有支援ESSD同城冗餘雲端硬碟的節點。

    kubectl get node -lnode.csi.alibabacloud.com/disktype.cloud_regional_disk_auto=available

    該命令將返回叢集中所有支援掛載同城冗餘雲端硬碟的節點。如需驗證跨可用性區域遷移能力,則至少需要準備2個處於不同可用性區域的節點。下文以cn-beijing-icn-beijing-l為例。

  2. 建立StorageClass。

    1. 使用以下內容,建立sc-regional.yaml檔案。

      其中,type參數為cloud_regional_disk_auto

      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        name: alibabacloud-disk-regional
      parameters:
        type: cloud_regional_disk_auto
      provisioner: diskplugin.csi.alibabacloud.com
      reclaimPolicy: Delete
      volumeBindingMode: WaitForFirstConsumer
      allowVolumeExpansion: true
    2. 執行以下命令,建立StorageClass。

      kubectl apply -f sc-regional.yaml
  3. 建立測試應用。

    1. 使用以下內容,建立disk-test.yaml檔案。

      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: disk-test
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
              ports:
              - containerPort: 80
              volumeMounts:
              - name: pvc-disk
                mountPath: /data
        volumeClaimTemplates:
        - metadata:
            name: pvc-disk
          spec:
            accessModes: [ "ReadWriteOnce" ]
            storageClassName: alibabacloud-disk-regional
            resources:
              requests:
                storage: 20Gi
    2. 執行以下命令,建立應用並申請所需的雲端硬碟。

      kubectl apply -f disk-test.yaml
  4. 確認應用正常運行,並確認當前可用性區域。

    1. 執行以下命令查看PVC和Pod狀態:

      kubectl get pvc pvc-disk-disk-test-0
      kubectl get pod disk-test-0

      預期輸出:

      NAME                   STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS                 VOLUMEATTRIBUTESCLASS   AGE
      pvc-disk-disk-test-0   Bound    d-2ze5xxxxxxxxxxxxxxxx   20Gi       RWO            alibabacloud-disk-regional   <unset>                 14m
      NAME          READY   STATUS    RESTARTS   AGE
      disk-test-0   1/1     Running   0          14m

      可見同城冗餘雲端硬碟已申請成功,Pod已掛載雲端硬碟並正常運行。

    2. 執行以下命令查看它調度到的Node:

      kubectl get node $(kubectl get pod disk-test-0 -ojsonpath='{.spec.nodeName}') -Ltopology.kubernetes.io/zone

      預期輸出:

      NAME                       STATUS   ROLES    AGE     VERSION            ZONE
      cn-beijing.172.25.xxx.xx   Ready    <none>   6m32s   v1.32.1-aliyun.1   cn-beijing-i

      說明該Pod調度到了cn-beijing-i可用性區域。

  5. 為節點添加汙點,類比可用性區域故障。觀察Pod可以帶著雲端硬碟在另一可用性區域成功拉起。

    警告

    這會影響該可用性區域中所有正在啟動並執行Pod,請勿在生產環境操作。

    1. 執行以下命令,為Pod當前啟動並執行可用性區域的所有節點添加汙點:

      kubectl taint node -ltopology.kubernetes.io/zone=cn-beijing-i testing=regional:NoExecute
    2. KCM將驅逐該可用性區域上的Pod,然後它會在其他可用性區域重建。執行以下命令以觀察Pod狀態和它調度到的新節點:

      kubectl get pod disk-test-0
      kubectl get node $(kubectl get pod disk-test-0 -ojsonpath='{.spec.nodeName}') -Ltopology.kubernetes.io/zone

      預期輸出:

      NAME          READY   STATUS    RESTARTS   AGE
      disk-test-0   1/1     Running   0          20s
      NAME                       STATUS   ROLES    AGE   VERSION            ZONE
      cn-beijing.172.26.xxx.xx   Ready    <none>   32m   v1.32.1-aliyun.1   cn-beijing-l

      可見該Pod已成功在cn-beijing-l可用性區域拉起。雲端硬碟中的資料也均可以在新可用性區域訪問。

  6. 執行以下命令,清理測試所使用的汙點和資源:

    kubectl taint node -ltopology.kubernetes.io/zone=cn-beijing-i testing-
    kubectl delete sts disk-test
    kubectl delete pvc pvc-disk-disk-test-0