全部產品
Search
文件中心

Container Service for Kubernetes:跨可用性區域遷移使用雲端硬碟儲存卷的有狀態應用

更新時間:Jul 24, 2025

storage-operator組件提供了雲端硬碟類型有狀態應用(StatefulSet)跨可用性區域遷移和多地區打散的功能,實現了跨可用性區域遷移的自動化。遷移過程出現異常時,storage-operator組件可以通過預檢查和復原機制在原可用性區域恢複應用,保證業務的可用性。本文介紹如何?雲端硬碟類型的有狀態應用跨可用性區域遷移。

適用情境

  • 當遇到規劃變更、應用規模擴大從而需要在多可用性區域部署,或當前可用性區域資源不足時,您都需要將已部署的有狀態應用遷移至其他的可用性區域。

  • NAS、OSS儲存底層支援跨可用性區域、多掛載使用。但云盤本身無多可用性區域漂移的能力,無法複用儲存聲明和儲存卷,此時,需要將使用雲端硬碟儲存卷的有狀態應用遷移至新的可用性區域。

  • 能接受業務中斷的應用。對於多副本的有狀態應用,為保證資料的一致性,在遷移前會縮容至0副本,雲端硬碟遷移完成後再一次性恢複至原副本數,而非滾動遷移。

    重要

    有狀態應用的跨可用性區域遷移過程中會產生業務的中斷,中斷時間長度與副本數量、容器啟動速度、所使用雲端硬碟容量等因素相關。

實現原理及遷移流程

雲端硬碟實現應用的跨可用性區域遷移,依賴雲端硬碟快照功能,並且支援設定建立的快照保留時間。關於雲端硬碟快照的更多資訊,請參見快照介紹。關於快照計費請參見快照計費

storage-operator組件提供的雲端硬碟類型有狀態應用遷移流程如下。

  1. 相關預檢查,例如,待遷移應用運行是否正常、是否有需要遷移的雲端硬碟等。若檢查失敗,則不會進行遷移。

  2. 將雲端硬碟類型有狀態應用縮容至0副本,此時應用處於暫停狀態。

  3. 為待遷移的有狀態應用掛載的雲端硬碟製作快照,快照支援跨可用性區域。

  4. 確認快照可用後,使用快照在目標可用性區域製作新雲端硬碟,新雲端硬碟與原雲端硬碟的資料一致。

  5. 重建同名的儲存聲明及其對應的新儲存卷,綁定新雲端硬碟。

  6. 雲端硬碟類型有狀態應用副本恢複至原副本數量,並自動關聯重建的儲存聲明,實際掛載新雲端硬碟。

    重要

    預檢查完成並開始遷移後,每個步驟均對應了不同的失敗復原策略。為確保復原後的應用能掛載原雲端硬碟,避免資料丟失,請確認遷移後的有狀態應用運行正常後,再刪除雲端硬碟。

  7. (可選)確認有狀態應用運行正常後,刪除原儲存卷和相應的雲端硬碟。關於雲端硬碟計費,請參見Block Storage計費

注意事項

  • 待遷移的有狀態應用使用的所有儲存均為ESSD雲端硬碟。

    為了提升快照製作時間,本功能在遷移時選用極速快照,具體操作請參見快照極速可用能力。目前極速快照僅支援ESSD雲端硬碟,若您的應用使用非ESSD類型雲端硬碟,可通過以下方式處理。

  • 目標可用性區域支援ESSD雲端硬碟,且叢集中已有在目標可用性區域支援ESSD雲端硬碟的節點可供調度。

前提條件

  • 叢集的版本為1.20及以上,並且使用CSI儲存外掛程式。

    如需升級叢集,請參見手動升級叢集

  • 叢集中已安裝storage-operator組件,且版本不低於v1.26.2-1de13b6-aliyun。更多資訊,請參見管理storage-operator組件

  • 叢集中已安裝csi-plugincsi-provisioner組件,且安裝的csi-provisioner為非託管版。

    說明

    如果當前安裝的是csi-provisioner託管版組件,卸載託管版後可以重新安裝非託管版。切換CSI組件後,請執行kubectl delete pod -n kube-system <storage-controller-pod-name>重啟storage controller。

  • 如果您的叢集是ACK專有叢集,需確保叢集的WorkerRole和MasterRole具備ModifyDiskSpec許可權。具體操作,請參見建立自訂權限原則

    ACK託管叢集無需進行此授權。

    展開查看權限原則

    {
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "ecs:CreateSnapshot",
                    "ecs:DescribeSnapshot",
                    "ecs:DeleteSnapshot",
                    "ecs:ModifyDiskSpec",
                    "ecs:DescribeTaskAttribute"
                ],
                "Resource": "*"
            }
        ]
    }

使用方式

  1. 修改叢集中ConfigMap的配置。

    kubectl patch configmap/storage-operator \
      -n kube-system \
      --type merge \
      -p '{"data":{"storage-controller":"{\"imageRep\":\"acs/storage-controller\",\"imageTag\":\"\",\"install\":\"true\",\"template\":\"/acs/templates/storage-controller/install.yaml\",\"type\":\"deployment\"}"}}'
  2. 在叢集中建立有狀態應用遷移任務。

    cat <<EOF | kubectl apply -f -
    apiVersion: storage.alibabacloud.com/v1beta1
    kind: ContainerStorageOperator
    metadata:
      name: default
    spec:
      operationType: APPMIGRATE
      operationParams:
        stsName: web
        stsNamespace: default
        stsType: kube
        targetZone: cn-beijing-h,cn-beijing-j
        checkWaitingMinutes: "1"
        healthDurationMinutes: "1"
        snapshotRetentionDays: "2"
        retainSourcePV: "true"
    EOF

    參數

    是否必選

    說明

    operationType

    必選

    取值為APPMIGRATE,表明當前的操作是有狀態應用遷移。

    stsName

    必選

    有狀態應用程式名稱,當前僅支援填寫單個有狀態應用。

    說明

    部署多個有狀態應用的遷移任務時,組件將以部署時間順序依次遷移。

    stsNamespace

    必選

    有狀態應用所在命名空間。

    targetZone

    必選

    遷移的目標可用性區域列表。當存在多個目標可用性區域時,可用性區域之間用英文半形逗號(,)隔開。例如cn-beijing-h,cn-beijing-j

    • 當應用掛載的某個雲端硬碟已在列表中時,應用將不進行遷移。

    • 當目標可用性區域大於1時,剩餘雲端硬碟將按列表中可用性區域的排列順序依次遷移至各個目標可用性區域。

    stsType

    可選

    指定的有狀態應用的類型,預設為kube。取值:

    • kube:原生StatefulSet。

    • kruise:OpenKruise組件提供的Advanced StatefulSet。

    checkWaitingMinutes

    可選

    有狀態應用在遷移後的可用性區域啟動時,其狀態檢查的輪詢間隔時間,單位為分鐘。

    預設為"1",即每分鐘檢查一次,直至可用副本數與預期一致,或多次檢查失敗重試後復原,回遷至原可用性區域。

    重要

    對於副本數較多、鏡像拉取時間長、業務本身啟動耗時較長的應用,需要適當增加輪詢間隔時間,避免重試次數過多後應用復原。

    healthDurationMinutes

    可選

    二次檢查的間隔時間,單位為分鐘。二次檢查即當有狀態應用遷移完成,可用副本數與預期一致後,等待指定時間進行二次檢查,以增強資料敏感業務的遷移可靠性。

    預設為"0",即不進行二次檢查。

    snapshotRetentionDays

    可選

    遷移過程中,建立極速快照的保留時間,單位為天。取值:

    • "1":預設值,保留一天。

    • "-1":將持續保留極速快照。

    retainSourcePV

    可選

    是否保留原雲端硬碟及其在叢集中對應的儲存卷資源。取值:

    • "false":預設值,不保留。

    • "true":保留,您可以登入ECS管理主控台找到原雲端硬碟執行個體,且叢集內對應的儲存卷資源也不會被刪除,儲存卷處於Released狀態。

使用樣本

測試叢集為ACK託管叢集Pro版,包含不同可用性區域的多個節點,樣本如下:

  • 可用性區域B:cn-shanghai.192.168.5.245

  • 可用性區域G:cn-shanghai.192.168.2.214

  • 可用性區域M:cn-shanghai.192.168.3.236、cn-shanghai.192.168.3.237

節點可用性區域

步驟一:建立使用ESSD雲端硬碟的有狀態應用

在叢集中建立一個使用ESSD雲端硬碟的StatefulSet用於後續測試。如果已有相關測試資源,可跳過該步驟。

  1. 建立StatefulSet並掛載ESSD雲端硬碟。

    展開查看部署有狀態應用Nginx的檔案

    cat << EOF | kubectl apply -f -
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      selector:
        matchLabels:
          app: nginx
      serviceName: "nginx"
      replicas: 2
      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
                  name: web
              volumeMounts:
                - name: www
                  mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
        - metadata:
            name: www
            labels:
              app: nginx
          spec:
            accessModes: [ "ReadWriteOnce" ]
            storageClassName: "alicloud-disk-essd"
            resources:
              requests:
                storage: 20Gi
    EOF
    
  2. 確認StatefulSet中Pod的部署情況。

    kubectl get pod -o wide -l app=nginx

    返回樣本如下,根據Node欄位確認2個Pod均被調度到了可用性區域M。

    說明

    實際可用性區域部署情況由調度器決定。

    NAME       READY   STATUS    RESTARTS   AGE   IP              NODE                        NOMINATED NODE   READINESS GATES
    web-0      1/1     Running   0          2m    192.168.3.243   cn-shanghai.192.168.3.237   <none>           <none>
    web-1      1/1     Running   0          2m    192.168.3.246   cn-shanghai.192.168.3.236   <none>           <none>

步驟二:建立有狀態應用遷移任務

樣本1:跨可用性區域遷移

  1. 建立有狀態應用遷移任務。

    以下遷移任務樣本中,將StatefulSet的2個Pod全部遷移至cn-shanghai-b可用性區域。

    重要

    遷移前,請確認該節點有足夠的資源,且可用性區域和節點規格均支援ESSD雲端硬碟。

    cat <<EOF | kubectl apply -f -
    apiVersion: storage.alibabacloud.com/v1beta1
    kind: ContainerStorageOperator
    metadata:
      name: migrate-to-b
    spec:
      operationType: APPMIGRATE
      operationParams:
        stsName: web
        stsNamespace: default
        stsType: kube
        targetZone: cn-shanghai-b     # 遷移到的目標可用性區域。
        healthDurationMinutes: "1"    # 遷移完成後隔1分鐘確認應用運行正常。
        snapshotRetentionDays: "-1"   # 建立的快照長期保留,直至在控制台刪除。
        retainSourcePV: "true"        # 保留原可用性區域的雲端硬碟和對應PV。
    EOF
  2. 查詢遷移任務的狀態。

    kubectl describe cso migrate-to-b | grep Status

    預期返回如下,如果返回SUCCESS表明遷移任務狀態正常。

      Status:
        Status:   SUCCESS
    說明

    如果返回FAILED,則表明遷移任務失敗,請參考常見問題處理。

  3. 查詢遷移後StatefulSet中2個Pod的部署情況。

    kubectl get pod -o wide -l app=nginx

    返回樣本如下,可以看到2個Pod均已遷移到cn-shanghai.192.168.5.245節點,對應可用性區域B。

    NAME    READY   STATUS    RESTARTS   AGE     IP              NODE                        NOMINATED NODE   READINESS GATES
    web-0   1/1     Running   0          2m36s   192.168.5.250   cn-shanghai.192.168.5.245   <none>           <none>
    web-1   1/1     Running   0          2m14s   192.168.5.2     cn-shanghai.192.168.5.245   <none>           <none>
  4. ECS管理主控台確認遷移任務符合預期。

    • 快照頁面,確認已建立2個快照,且快照持續保留。

    • Block Storage頁面,確認在遷移後的可用性區域B已建立2個雲端硬碟,遷移前的可用性區域M的2個雲端硬碟未被刪除(因為遷移任務中retainSourcePV的配置為true)。

樣本2:多可用性區域打散

為提高應用的可用性,需要將Pod及雲端硬碟打散部署到不同的可用性區域中。

  1. 建立有狀態應用遷移任務。

    以下遷移任務樣本中,將StatefulSet的2個Pod打散部署到可用性區域B和可用性區域G。

    cat <<EOF | kubectl apply -f -
    apiVersion: storage.alibabacloud.com/v1beta1
    kind: ContainerStorageOperator
    metadata:
      name: migrate
    spec:
      operationType: APPMIGRATE
      operationParams:
        stsName: web
        stsNamespace: default
        stsType: kube
        targetZone: cn-shanghai-b,cn-shanghai-g   # 遷移到的目標可用性區域。配置多個時,會自動打散。
        healthDurationMinutes: "1"                # 遷移完成後隔1分鐘確認應用運行正常。
        snapshotRetentionDays: "-1"               # 建立的快照長期保留,直至在控制台刪除。
        retainSourcePV: "true"                    # 保留原可用性區域的雲端硬碟和對應PV。
    EOF
  2. 查詢遷移任務的狀態。

    kubectl describe cso migrate | grep Status

    預期返回如下,如果返回SUCCESS表明遷移任務狀態正常。

      Status:
        Status:   SUCCESS
    說明

    如果返回FAILED,則表明遷移任務失敗,請參考常見問題處理。

  3. 查詢遷移後StatefulSet中2個Pod的部署情況。

    kubectl get pod -o wide -l app=nginx

    返回樣本如下,可以看到2個Pod已打散部署到cn-shanghai.192.168.5.245節點(可用性區域B)和cn-shanghai.192.168.2.214節點(可用性區域G)。

    NAME    READY   STATUS    RESTARTS   AGE     IP              NODE                        NOMINATED NODE   READINESS GATES
    web-0   1/1     Running   0          4m59s   192.168.2.215   cn-shanghai.192.168.2.214   <none>           <none>
    web-1   1/1     Running   0          4m38s   192.168.5.250   cn-shanghai.192.168.5.245   <none>           <none>
  4. ECS管理主控台確認遷移任務符合預期。

    • 快照頁面,確認已建立2個快照,且快照持續保留。

    • Block Storage頁面,確認在遷移後的可用性區域B和可用性區域G已建立2個雲端硬碟,遷移前的可用性區域M的2個雲端硬碟未被刪除(因為遷移任務中retainSourcePV的配置為true)。

常見問題

若查詢到的遷移任務狀態為FAILED,可通過以下命令查詢失敗原因,根據原因調整後再重試。

kubectl describe cso <ContainerStorageOperator-name> | grep Message -A 1

返回樣本如下,表示失敗是由於找不到待遷移的儲存聲明,可能原因為應用並未掛載儲存、應用已掛載在目標可用性區域,無法擷取儲存聲明資訊等,請根據實際情況修改後重試。

  Message:
    Consume: failed to get target pvc, err: no pvc mounted in statefulset or no pvc need to migrated web