全部產品
Search
文件中心

Container Service for Kubernetes:雲端硬碟類型有狀態應用的跨可用性區域遷移

更新時間:Jun 19, 2024

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

適用情境

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

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

實現原理及遷移流程

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

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

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

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

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

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

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

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

    重要

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

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

注意事項

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

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

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

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

重要

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

前提條件

  • 已建立Kubernetes叢集,Kubernetes版本為v1.20及以上,且儲存外掛程式選擇為CSI。具體操作,請參見已建立Kubernetes託管版叢集

  • 若您的叢集為ACK專有版叢集,則需要為叢集WorkerRole配置如下許可權。具體操作,請參見建立自訂權限原則

    展開查看ACK專有版叢集WorkerRole權限原則內容

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

    ACK Pro版叢集無需配置許可權。

  • storage-operator組件版本不低於v1.26.2-1de13b6-aliyun。關於升級storage-operator組件的操作,請參見管理組件

使用方式

  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狀態。

使用樣本

測試叢集為cn-beijing的ACK叢集Pro版,包含可用性區域來自cn-beijing-i, cn-beijing-j, cn-beijing-k的節點node-zone-i, node-zone-j, node-zone-k。

樣本1:雲端硬碟跨可用性區域遷移

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

  1. 執行以下命令,在叢集中部署有狀態應用Nginx。

    展開查看部署有狀態應用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: nginx:1.14.2
              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. 執行以下命令,確認應用的兩個副本的部署情況。

    kubectl get pod -owide | grep web-

    預期輸出:

    NAME                        READY    STATUS   RESTARTS    AGE     IP                ZONE                  NOMINATED NODE   READINESS GATES
    web-0                        1/1     Running   0          44s     172.29.XX.XX    node-zone-i           <none>           <none>
    web-1                        1/1     Running   0          3s      172.29.XX.XX    node-zone-j           <none>           <none>

    預期輸出表明,應用的兩個副本分別部署在cn-beijing-i, cn-beijing-j兩個可用性區域的節點上。實際部署的結果由調度器決定。

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

  1. 執行以下命令,在叢集中建立有狀態應用遷移任務。

    以下遷移任務中,將有狀態應用的兩個副本全部遷移至cn-beijing-k可用性區域。遷移前,已確認該節點有足夠的資源,且可用性區域和機型均支援ESSD雲端硬碟。

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

    kubectl describe cso migrate-to-k | grep Status

    預期輸出:

      Status:  SUCCESS

    預期輸出為SUCCESS,表明遷移任務狀態正常。如果預期輸出為FAILED,表明遷移任務建立失敗,關於失敗問題排查,請參見(可選)任務失敗時原因排查

  3. 執行以下命令,查詢遷移後應用的兩個副本的部署情況。

    kubectl get pod -owide | grep web-

    預期輸出:

    NAME                        READY    STATUS    RESTARTS   AGE     IP                  ZONE                 NOMINATED NODE    READINESS GATES
    web-0                        1/1     Running   0          25m     172.29.XX.XX     node-zone-k           <none>           <none>
    web-1                        1/1     Running   0          25m     172.29.XX.XX     node-zone-k           <none>           <none>

    預期輸出表明,應用的副本均已遷移至可用性區域cn-beijing-k的節點上。

  4. 登入ECS管理主控台

    確認如下資訊:

    • 建立的極速快照為長期保留。

    • 建立的雲端硬碟在cn-beijing-k可用性區域。

    • 原cn-beijing-i和cn-beijing-j的雲端硬碟配置未被刪除,因為遷移任務中retainSourcePV的配置為true

(可選)任務失敗時原因排查

若在步驟二中查詢到的遷移任務狀態為FAILED,可通過以下步驟查詢失敗原因,根據原因調整後重試。

  1. 執行以下命令,確認應用已經成功復原。

    kubectl get pod -owide | grep web-

    預期輸出:

    NAME                        READY    STATUS    RESTARTS   AGE     IP                  ZONE                 NOMINATED NODE    READINESS GATES
    web-0                        1/1     Running   0          12m     172.29.XX.XX   node-zone-i           <none>           <none>
    web-1                        1/1     Running   0          12m     172.29.XX.XX    node-zone-j           <none>           <none>
  2. 執行以下指令,查詢遷移任務失敗的原因。

    kubectl describe cso migrate-to-k | grep Message -A 1

    預期輸出:

      Message:
        Consume: no pvc mounted in statefulset or no pvc need to migrated web

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

樣本2:雲端硬碟多可用性區域打散

例如,樣本一中的有狀態應用的兩個副本當前都部署在cn-beijing-k可用性區域中,即運行在節點node-beijing-k上。為提高應用的可用性,現需要將副本打散到cn-beijing-i及cn-beijing-j雙可用性區域中。您可以通過以下操作實現雲端硬碟的多可用性區域打散。

  1. 執行以下命令,在叢集中建立有狀態應用遷移任務。

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

    kubectl describe cso migrate-to-i-and-j | grep Status

    預期輸出:

      Status:  SUCCESS
  3. 執行以下命令,查詢遷移後應用兩個副本的部署情況。

    kubectl get pod -owide | grep web-

    預期輸出:

    NAME                        READY    STATUS    RESTARTS   AGE     IP                  ZONE                NOMINATED NODE   READINESS GATES
    web-0                        1/1     Running   0          12m     172.29.XX.XX    node-zone-i           <none>           <none>
    web-1                        1/1     Running   0          12m     172.29.XX.XX    node-zone-j           <none>           <none>

    預期輸出表明,應用的兩個副本已被打散至可用性區域cn-beijing-i和cn-beijing-j的節點上。

  4. 登入ECS管理主控台

    確認如下資訊:

    • 建立的極速快照為長期保留。

    • 建立的雲端硬碟在cn-beijing-i、cn-beijing-j可用性區域。

    • 原cn-beijing-k的雲端硬碟配置未被刪除,因為遷移任務中retainSourcePV的配置為true