云盤類型有狀態(tài)應(yīng)用的跨可用區(qū)遷移
storage-operator組件提供了云盤類型有狀態(tài)應(yīng)用跨可用區(qū)遷移和多地域打散的功能,實(shí)現(xiàn)了跨可用區(qū)遷移的自動(dòng)化。遷移過程出現(xiàn)異常時(shí),storage-operator組件可以通過預(yù)檢查和回滾機(jī)制在原可用區(qū)恢復(fù)應(yīng)用,保證業(yè)務(wù)的可用性。本文介紹如何實(shí)現(xiàn)云盤類型的有狀態(tài)應(yīng)用跨可用區(qū)遷移。
適用場(chǎng)景
當(dāng)遇到規(guī)劃變更、應(yīng)用規(guī)模擴(kuò)大從而需要在多可用區(qū)部署,或當(dāng)前可用區(qū)資源不足時(shí),您都需要將已部署的有狀態(tài)應(yīng)用遷移至其他的可用區(qū)。
NAS、OSS存儲(chǔ)底層支持跨可用區(qū)、多掛載使用。但云盤本身無多可用區(qū)漂移的能力,無法復(fù)用存儲(chǔ)聲明和存儲(chǔ)卷,此時(shí),需要將云盤的有狀態(tài)應(yīng)用遷移至新的可用區(qū)。
實(shí)現(xiàn)原理及遷移流程
云盤實(shí)現(xiàn)應(yīng)用的跨可用區(qū)遷移,依賴云盤快照功能,并且支持設(shè)定新建的快照保留時(shí)間。關(guān)于云盤快照的更多信息,請(qǐng)參見快照介紹。關(guān)于快照計(jì)費(fèi)請(qǐng)參見快照計(jì)費(fèi)。
storage-operator組件提供的云盤類型有狀態(tài)應(yīng)用遷移流程如下。
相關(guān)預(yù)檢查,例如,待遷移應(yīng)用運(yùn)行是否正常、是否有需要遷移的云盤等。若檢查失敗,則不會(huì)進(jìn)行遷移。
將云盤類型有狀態(tài)應(yīng)用縮容至0副本,此時(shí)應(yīng)用處于暫停狀態(tài)。
為待遷移的有狀態(tài)應(yīng)用掛載的云盤制作快照,快照支持跨可用區(qū)。
確認(rèn)快照可用后,使用快照在目標(biāo)可用區(qū)制作新云盤,新云盤與原云盤的數(shù)據(jù)一致。
重建同名的存儲(chǔ)聲明及其對(duì)應(yīng)的新存儲(chǔ)卷,綁定新云盤。
云盤類型有狀態(tài)應(yīng)用副本恢復(fù)至原副本數(shù)量,并自動(dòng)關(guān)聯(lián)重建的存儲(chǔ)聲明,實(shí)際掛載新云盤。
重要預(yù)檢查完成并開始遷移后,每個(gè)步驟均對(duì)應(yīng)了不同的失敗回滾策略。為確保回滾后的應(yīng)用能掛載原云盤,避免數(shù)據(jù)丟失,請(qǐng)確認(rèn)遷移后的有狀態(tài)應(yīng)用運(yùn)行正常后,再刪除云盤。
(可選)確認(rèn)有狀態(tài)應(yīng)用運(yùn)行正常后,刪除原存儲(chǔ)卷和相應(yīng)的云盤。關(guān)于云盤計(jì)費(fèi),請(qǐng)參見塊存儲(chǔ)計(jì)費(fèi)。
注意事項(xiàng)
待遷移的有狀態(tài)應(yīng)用使用的所有存儲(chǔ)均為ESSD云盤。
為了提升快照制作時(shí)間,本功能在遷移時(shí)選用極速快照,具體操作請(qǐng)參見快照極速可用能力。目前極速快照僅支持ESSD云盤,若您的應(yīng)用使用非ESSD類型云盤,可通過以下方式處理。
將云盤類型變更為ESSD類型后再進(jìn)行遷移,具體請(qǐng)參見變更云盤類型。
手動(dòng)使用云盤存儲(chǔ)快照進(jìn)行云盤的跨可用區(qū)重建。
目標(biāo)可用區(qū)支持ESSD云盤,且集群中已有在目標(biāo)可用區(qū)支持ESSD云盤的節(jié)點(diǎn)可供調(diào)度。
能業(yè)務(wù)接受中斷。對(duì)于多副本的有狀態(tài)應(yīng)用,為保證數(shù)據(jù)的一致性,在遷移前會(huì)縮容至0副本,云盤遷移完成后再一次性恢復(fù)至原副本數(shù),而非滾動(dòng)遷移。
有狀態(tài)應(yīng)用的跨可用區(qū)遷移過程中會(huì)產(chǎn)生業(yè)務(wù)的中斷,中斷時(shí)長(zhǎng)與副本數(shù)量、容器啟動(dòng)速度、所使用云盤容量等因素相關(guān)。
前提條件
已創(chuàng)建Kubernetes集群,Kubernetes版本為v1.20及以上,且存儲(chǔ)插件選擇為CSI。具體操作,請(qǐng)參見已創(chuàng)建Kubernetes托管版集群。
若您的集群為ACK專有版集群,則需要為集群WorkerRole配置如下權(quán)限。具體操作,請(qǐng)參見創(chuàng)建自定義權(quán)限策略。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:CreateSnapshot", "ecs:DescribeSnapshot", "ecs:DeleteSnapshot", "ecs:ModifyDiskSpec", "ecs:DescribeTaskAttribute" ], "Resource": "*" } ] }
說明ACK Pro版集群無需配置權(quán)限。
storage-operator組件版本不低于v1.26.2-1de13b6-aliyun。關(guān)于升級(jí)storage-operator組件的操作,請(qǐng)參見管理組件。
使用方式
執(zhí)行以下命令,修改集群中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\"}"}}'
執(zhí)行以下命令,在集群中創(chuàng)建有狀態(tài)應(yīng)用遷移任務(wù)。
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
參數(shù)
是否必選
說明
operationType
必選
取值為APPMIGRATE,表明當(dāng)前的操作是有狀態(tài)應(yīng)用遷移。
stsName
必選
有狀態(tài)應(yīng)用名稱,當(dāng)前僅支持填寫單個(gè)有狀態(tài)應(yīng)用。
說明部署多個(gè)有狀態(tài)應(yīng)用的遷移任務(wù)時(shí),組件將以部署時(shí)間順序依次遷移。
stsNamespace
必選
有狀態(tài)應(yīng)用所在命名空間。
targetZone
必選
遷移的目標(biāo)可用區(qū)列表。當(dāng)存在多個(gè)目標(biāo)可用區(qū)時(shí),可用區(qū)之間用英文半角逗號(hào)(,)隔開。例如
cn-beijing-h,cn-beijing-j
。當(dāng)應(yīng)用掛載的某個(gè)云盤已在列表中時(shí),應(yīng)用將不進(jìn)行遷移。
當(dāng)目標(biāo)可用區(qū)大于1時(shí),剩余云盤將按列表中可用區(qū)的排列順序依次遷移至各個(gè)目標(biāo)可用區(qū)。
stsType
可選
指定的有狀態(tài)應(yīng)用的類型,默認(rèn)為kube。取值:
kube:原生StatefulSet。
kruise:OpenKruise組件提供的Advanced StatefulSet。
checkWaitingMinutes
可選
有狀態(tài)應(yīng)用在遷移后的可用區(qū)啟動(dòng)時(shí),其狀態(tài)檢查的輪詢間隔時(shí)間,單位為分鐘。
默認(rèn)為
"1"
,即每分鐘檢查一次,直至可用副本數(shù)與預(yù)期一致,或多次檢查失敗重試后回滾,回遷至原可用區(qū)。重要對(duì)于副本數(shù)較多、鏡像拉取時(shí)間長(zhǎng)、業(yè)務(wù)本身啟動(dòng)耗時(shí)較長(zhǎng)的應(yīng)用,需要適當(dāng)增加輪詢間隔時(shí)間,避免重試次數(shù)過多后應(yīng)用回滾。
healthDurationMinutes
可選
二次檢查的間隔時(shí)間,單位為分鐘。二次檢查即當(dāng)有狀態(tài)應(yīng)用遷移完成,可用副本數(shù)與預(yù)期一致后,等待指定時(shí)間進(jìn)行二次檢查,以增強(qiáng)數(shù)據(jù)敏感業(yè)務(wù)的遷移可靠性。
默認(rèn)為
"0"
,即不進(jìn)行二次檢查。snapshotRetentionDays
可選
遷移過程中,新建極速快照的保留時(shí)間,單位為天。取值:
"1"
:默認(rèn)值,保留一天。"-1"
:將永久保留極速快照。
retainSourcePV
可選
是否保留原云盤及其在集群中對(duì)應(yīng)的存儲(chǔ)卷資源。取值:
"false"
:默認(rèn)值,不保留。"true"
:保留,您可以登錄ECS管理控制臺(tái)找到原云盤實(shí)例,且集群內(nèi)對(duì)應(yīng)的存儲(chǔ)卷資源也不會(huì)被刪除,存儲(chǔ)卷處于Released狀態(tài)。
使用示例
測(cè)試集群為cn-beijing的ACK集群Pro版,包含可用區(qū)來自cn-beijing-i, cn-beijing-j, cn-beijing-k的節(jié)點(diǎn)node-zone-i, node-zone-j, node-zone-k。
示例1:云盤跨可用區(qū)遷移
步驟一:創(chuàng)建使用ESSD云盤的有狀態(tài)應(yīng)用
執(zhí)行以下命令,在集群中部署有狀態(tài)應(yīng)用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
執(zhí)行以下命令,確認(rèn)應(yīng)用的兩個(gè)副本的部署情況。
kubectl get pod -owide | grep web-
預(yù)期輸出:
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>
預(yù)期輸出表明,應(yīng)用的兩個(gè)副本分別部署在cn-beijing-i, cn-beijing-j兩個(gè)可用區(qū)的節(jié)點(diǎn)上。實(shí)際部署的結(jié)果由調(diào)度器決定。
步驟二:創(chuàng)建有狀態(tài)應(yīng)用遷移任務(wù)
執(zhí)行以下命令,在集群中創(chuàng)建有狀態(tài)應(yīng)用遷移任務(wù)。
以下遷移任務(wù)中,將有狀態(tài)應(yīng)用的兩個(gè)副本全部遷移至cn-beijing-k可用區(qū)。遷移前,已確認(rèn)該節(jié)點(diǎn)有足夠的資源,且可用區(qū)和機(jī)型均支持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可用區(qū)。 healthDurationMinutes: "1" # 遷移完成后隔1分鐘確認(rèn)應(yīng)用運(yùn)行正常。 snapshotRetentionDays: "-1" # 新建的快照長(zhǎng)期保留,直至在控制臺(tái)刪除。 retainSourcePV: "true" # 保留原可用區(qū)的云盤和對(duì)應(yīng)PV。 EOF
執(zhí)行以下命令,查詢遷移任務(wù)的狀態(tài)。
kubectl describe cso migrate-to-k | grep Status
預(yù)期輸出:
Status: SUCCESS
預(yù)期輸出為
SUCCESS
,表明遷移任務(wù)狀態(tài)正常。如果預(yù)期輸出為FAILED
,表明遷移任務(wù)創(chuàng)建失敗,關(guān)于失敗問題排查,請(qǐng)參見(可選)任務(wù)失敗時(shí)原因排查。執(zhí)行以下命令,查詢遷移后應(yīng)用的兩個(gè)副本的部署情況。
kubectl get pod -owide | grep web-
預(yù)期輸出:
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>
預(yù)期輸出表明,應(yīng)用的副本均已遷移至可用區(qū)cn-beijing-k的節(jié)點(diǎn)上。
確認(rèn)如下信息:
新建的極速快照為長(zhǎng)期保留。
新建的云盤在cn-beijing-k可用區(qū)。
原cn-beijing-i和cn-beijing-j的云盤配置未被刪除,因?yàn)檫w移任務(wù)中
retainSourcePV
的配置為true
。
(可選)任務(wù)失敗時(shí)原因排查
若在步驟二中查詢到的遷移任務(wù)狀態(tài)為FAILED,可通過以下步驟查詢失敗原因,根據(jù)原因調(diào)整后重試。
執(zhí)行以下命令,確認(rèn)應(yīng)用已經(jīng)成功回滾。
kubectl get pod -owide | grep web-
預(yù)期輸出:
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>
執(zhí)行以下指令,查詢遷移任務(wù)失敗的原因。
kubectl describe cso migrate-to-k | grep Message -A 1
預(yù)期輸出:
Message: Consume: no pvc mounted in statefulset or no pvc need to migrated web
預(yù)期輸出表明,失敗的原因是由于找不到待遷移的存儲(chǔ)聲明,可能為應(yīng)用并未掛載存儲(chǔ)、應(yīng)用已掛載在目標(biāo)可用區(qū),無法獲取存儲(chǔ)聲明信息等,請(qǐng)根據(jù)實(shí)際情況修改后重試。
示例2:云盤多可用區(qū)打散
例如,示例一中的有狀態(tài)應(yīng)用的兩個(gè)副本當(dāng)前都部署在cn-beijing-k可用區(qū)中,即運(yùn)行在節(jié)點(diǎn)node-beijing-k上。為提高應(yīng)用的可用性,現(xiàn)需要將副本打散到cn-beijing-i及cn-beijing-j雙可用區(qū)中。您可以通過以下操作實(shí)現(xiàn)云盤的多可用區(qū)打散。
執(zhí)行以下命令,在集群中創(chuàng)建有狀態(tài)應(yīng)用遷移任務(wù)。
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可用區(qū)。 healthDurationMinutes: "1" # 遷移完成后隔1分鐘確認(rèn)應(yīng)用運(yùn)行正常。 snapshotRetentionDays: "-1" # 新建的快照長(zhǎng)期保留,直至在控制臺(tái)刪除。 retainSourcePV: "true" # 保留原可用區(qū)的云盤和對(duì)應(yīng)PV。 EOF
執(zhí)行以下命令,查詢遷移任務(wù)的狀態(tài)。
kubectl describe cso migrate-to-i-and-j | grep Status
預(yù)期輸出:
Status: SUCCESS
執(zhí)行以下命令,查詢遷移后應(yīng)用兩個(gè)副本的部署情況。
kubectl get pod -owide | grep web-
預(yù)期輸出:
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>
預(yù)期輸出表明,應(yīng)用的兩個(gè)副本已被打散至可用區(qū)cn-beijing-i和cn-beijing-j的節(jié)點(diǎn)上。
確認(rèn)如下信息:
新建的極速快照為長(zhǎng)期保留。
新建的云盤在cn-beijing-i、cn-beijing-j可用區(qū)。
原cn-beijing-k的云盤配置未被刪除,因?yàn)檫w移任務(wù)中
retainSourcePV
的配置為true
。