storage-operator組件提供了雲端硬碟類型有狀態應用跨可用性區域遷移和多地區打散的功能,實現了跨可用性區域遷移的自動化。遷移過程出現異常時,storage-operator組件可以通過預檢查和復原機制在原可用性區域恢複應用,保證業務的可用性。本文介紹如何?雲端硬碟類型的有狀態應用跨可用性區域遷移。
適用情境
當遇到規劃變更、應用規模擴大從而需要在多可用性區域部署,或當前可用性區域資源不足時,您都需要將已部署的有狀態應用遷移至其他的可用性區域。
NAS、OSS儲存底層支援跨可用性區域、多掛載使用。但云盤本身無多可用性區域漂移的能力,無法複用儲存聲明和儲存卷,此時,需要將雲端硬碟的有狀態應用遷移至新的可用性區域。
實現原理及遷移流程
雲端硬碟實現應用的跨可用性區域遷移,依賴雲端硬碟快照功能,並且支援設定建立的快照保留時間。關於雲端硬碟快照的更多資訊,請參見快照介紹。關於快照計費請參見快照計費。
storage-operator組件提供的雲端硬碟類型有狀態應用遷移流程如下。
相關預檢查,例如,待遷移應用運行是否正常、是否有需要遷移的雲端硬碟等。若檢查失敗,則不會進行遷移。
將雲端硬碟類型有狀態應用縮容至0副本,此時應用處於暫停狀態。
為待遷移的有狀態應用掛載的雲端硬碟製作快照,快照支援跨可用性區域。
確認快照可用後,使用快照在目標可用性區域製作新雲端硬碟,新雲端硬碟與原雲端硬碟的資料一致。
重建同名的儲存聲明及其對應的新儲存卷,綁定新雲端硬碟。
雲端硬碟類型有狀態應用副本恢複至原副本數量,並自動關聯重建的儲存聲明,實際掛載新雲端硬碟。
重要預檢查完成並開始遷移後,每個步驟均對應了不同的失敗復原策略。為確保復原後的應用能掛載原雲端硬碟,避免資料丟失,請確認遷移後的有狀態應用運行正常後,再刪除雲端硬碟。
(可選)確認有狀態應用運行正常後,刪除原儲存卷和相應的雲端硬碟。關於雲端硬碟計費,請參見Block Storage計費。
注意事項
待遷移的有狀態應用使用的所有儲存均為ESSD雲端硬碟。
為了提升快照製作時間,本功能在遷移時選用極速快照,具體操作請參見快照極速可用能力。目前極速快照僅支援ESSD雲端硬碟,若您的應用使用非ESSD類型雲端硬碟,可通過以下方式處理。
將雲端硬碟類型變更為ESSD類型後再進行遷移,具體請參見變更雲端硬碟類型。
手動使用雲端硬碟儲存快照進行雲端硬碟的跨可用性區域重建。
目標可用性區域支援ESSD雲端硬碟,且叢集中已有在目標可用性區域支援ESSD雲端硬碟的節點可供調度。
能業務接受中斷。對於多副本的有狀態應用,為保證資料的一致性,在遷移前會縮容至0副本,雲端硬碟遷移完成後再一次性恢複至原副本數,而非滾動遷移。
有狀態應用的跨可用性區域遷移過程中會產生業務的中斷,中斷時間長度與副本數量、容器啟動速度、所使用雲端硬碟容量等因素相關。
前提條件
已建立Kubernetes叢集,Kubernetes版本為v1.20及以上,且儲存外掛程式選擇為CSI。具體操作,請參見已建立Kubernetes託管版叢集。
若您的叢集為ACK專有版叢集,則需要為叢集WorkerRole配置如下許可權。具體操作,請參見建立自訂權限原則。
說明ACK Pro版叢集無需配置許可權。
storage-operator組件版本不低於v1.26.2-1de13b6-aliyun。關於升級storage-operator組件的操作,請參見管理組件。
使用方式
執行以下命令,修改叢集中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\"}"}}'
執行以下命令,在叢集中建立有狀態應用遷移任務。
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雲端硬碟的有狀態應用
執行以下命令,在叢集中部署有狀態應用Nginx。
執行以下命令,確認應用的兩個副本的部署情況。
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兩個可用性區域的節點上。實際部署的結果由調度器決定。
步驟二:建立有狀態應用遷移任務
執行以下命令,在叢集中建立有狀態應用遷移任務。
以下遷移任務中,將有狀態應用的兩個副本全部遷移至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
執行以下命令,查詢遷移任務的狀態。
kubectl describe cso migrate-to-k | grep Status
預期輸出:
Status: SUCCESS
預期輸出為
SUCCESS
,表明遷移任務狀態正常。如果預期輸出為FAILED
,表明遷移任務建立失敗,關於失敗問題排查,請參見(可選)任務失敗時原因排查。執行以下命令,查詢遷移後應用的兩個副本的部署情況。
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的節點上。
登入ECS管理主控台。
確認如下資訊:
建立的極速快照為長期保留。
建立的雲端硬碟在cn-beijing-k可用性區域。
原cn-beijing-i和cn-beijing-j的雲端硬碟配置未被刪除,因為遷移任務中
retainSourcePV
的配置為true
。
(可選)任務失敗時原因排查
若在步驟二中查詢到的遷移任務狀態為FAILED,可通過以下步驟查詢失敗原因,根據原因調整後重試。
執行以下命令,確認應用已經成功復原。
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>
執行以下指令,查詢遷移任務失敗的原因。
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雙可用性區域中。您可以通過以下操作實現雲端硬碟的多可用性區域打散。
執行以下命令,在叢集中建立有狀態應用遷移任務。
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
執行以下命令,查詢遷移任務的狀態。
kubectl describe cso migrate-to-i-and-j | grep Status
預期輸出:
Status: SUCCESS
執行以下命令,查詢遷移後應用兩個副本的部署情況。
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的節點上。
登入ECS管理主控台。
確認如下資訊:
建立的極速快照為長期保留。
建立的雲端硬碟在cn-beijing-i、cn-beijing-j可用性區域。
原cn-beijing-k的雲端硬碟配置未被刪除,因為遷移任務中
retainSourcePV
的配置為true
。