基於 K8s 容器叢集的容災架構與方案

阿里云云原生發表於2024-03-13

作者:莊宇

在設計系統架構時,我們必須假設任何元件和任何基礎設施可能會在任何時間失效,例如:自然災害,電力中斷,網路中斷,錯誤的系統變更等。為了應對挑戰,我們必須設計合適的容災架構。

本文介紹如何以 K8s 叢集(包括:ACK 叢集,他雲叢集和本地 IDC K8s 叢集)為基礎,結合阿里云云產品(網路,資料庫,中介軟體,可觀測),設計容災架構,構建一個“韌性”系統。

容災目標

Recovery time objective(RTO):

服務中斷與服務恢復之間可接受的最大延遲時間。決定服務停機的可接受時長。

Recovery point objective(RPO):

自上一個資料恢復點以來可接受的最大時間量。決定可接受的資料丟失或重建。

對於 RTO 和 RPO,數值越低代表停機時間和資料丟失越少,但是越低的 RTO 和 RPO 會導致資源成本和運維複雜性越高。因此,您需要根據工作負載的重要性,指定適當的 RTO 和 RPO。

容災策略

上圖中,描述的常見的 3 種容災策略:備份與恢復、主備、雙活,不同的容災策略對應了不同的收益和成本。您需要綜合分析業務的重要性、風險、可投入的成本等,以選擇適合的容災策略。

備份與恢復(Backup-Restore)

在系統執行時,備份應用和資料,在災難發生時,在另一個地點恢復應用和資料,並切換業務流量。由於資料無法實時備份,在恢復資料時會有一定的資料丟失,同時如果資料量較大,恢復資料時間可能較長。

主備(Active-Standby)

在主備模式中,主 Location 處理所有的業務流量,備用 location 可以啟動較少的應用例項節省成本,並週期傳送測試流量以驗證系統有效性。在災難發生時,做資料庫主備切換,擴容應用例項數,並切換業務流量。

雙活(Active-Active)

在雙活模式中,2 個 Location 啟動相同的應用例項數,同時處理業務流量。在災難發生時,做資料庫主備切換,並切換業務流量。

容災範圍

多可用區(Multi-AZ)

阿里雲地域(Region) [ 11] 包含多個可用區(AZ),可用區(AZ)是電力和網路互相獨立的物理區域,對停電,斷網等區域性中斷的容災場景,可以使用多個可用區(AZ)設計容災策略。由於可用區間的網路延時較短,可以更容易實現資料部分的容災方案,包括資料庫、快取和訊息等。

多地域(Multi-Region)

為了應對更大範圍的災難故障事件,這些事件可能會影響同地域(Region)的多個可用區(AZ),您可以使用多個地域(Region)設計容災策略。但由於地域間更大網路延時,容災方案複雜度和實現成本較高。

在選擇多可用區(AZ)或者多地域(Region)容災方案時,需要重點考慮有狀態應用和依賴的雲產品(例如:資料庫、快取和訊息)是否支援多地域或者多可用區容災。

方案示例

備份與恢復(Backup & Restore)

公共雲跨可用區和跨地域備份與恢復

  1. 透過 ACK One 備份中心 [3 ] ,可以備份 ACK 叢集中的應用,包括無狀態應用和有狀態應用,對有狀態應用,在備份應用 YAML 的同時可以備份相關 Storage 資料。

  2. ACK One 備份中心整合雲產品雲盤快照 [ 12] ,檔案儲存 NAS [13 ] ,物件儲存 OSS [14 ] 和雲備份 [15 ] ,分別支援應用 YAML,雲盤 PV,檔案系統 PV 的一鍵備份。

  3. 備份後,可以隨時將應用和 Storage 資料,恢復到任意地域和可用區的 ACK 叢集。

  4. 阿里雲資料庫服務的備份與恢復,可以參考相應資料產品的文件,例如:RDS MySQL 資料庫備份恢復 [ 16] ,RDS 例項間資料遷移 [17 ]

混合雲備份與恢復

  1. 透過 ACK One 註冊叢集 [ 4] ,可以將 IDC 自建或者非阿里雲 K8s 叢集,接入到阿里雲 ACK 控制檯。

  2. 接入 ACK One 註冊叢集后,透過 ACK One 備份中心,可以備份 IDC 自建和非阿里雲 K8s 叢集中的應用,包括無狀態應用和有狀態應用,對有狀態應用,在備份應用 YAML 的同時可以備份相關 Storage 資料。

  3. 備份後,可以隨時將應用(Deployment/Statefulset)和資料(PV/PVC),恢復到任意地域和可用區的 ACK 叢集。

總結

備份恢復方案實施成本較低,但 RTO 和 RPO 相對較長,取決於資料量的大小和應用的複雜度。備份中心能夠提供的全量備份+增量備份能力,減少 RTO 和 RPO 時間。

備份恢復作為容災的兜底方案,重要性高,在系統運維的過程中,要保證備份的及時性和可恢復性。

另外,許多使用者選擇透過備份恢復功能實現應用的跨叢集遷移,場景如下:

  1. 業務上雲,將本地 IDC 叢集中的應用,遷移到阿里雲 ACK 叢集中,參考 IDC 應用上雲遷移 [ 18]

  2. 叢集版本較老,版本升級有穩定性風險,可以先建立新版本叢集,透過備份恢復將應用遷移到新版本叢集執行,參考跨版本叢集遷移 [ 19]

  3. 使用者在收斂雲賬號或者組織調整時,需要跨賬號叢集接入 [ 20] 和跨叢集遷移應用 [21 ]

多叢集 Service

在應用遷移的過程中,由於應用的數量較多,需要分批遷移,同時應用間存在呼叫關係。此時,在網路打通的前提下,可以使用 ACK One 艦隊多叢集 Service [ 5] ,實現應用 Kubernetes Service 跨叢集訪問。如下圖所示,ACK One 艦隊多叢集 Service,可以將 Cluster1 的 Applcation2 的 Kubernetes Service(包含 endpoints)注入到 Cluster2,Cluster2 上的 Application1 可以訪問 Cluster1 上的 Application2。

在專線拉通的前提下,透過 ACK One 註冊叢集,IDC 和非阿里雲的 K8s 叢集也可以是用 ACK One 艦隊多叢集 Service。

單地域多可用區容災

基於 DNS 流量分發

  1. 透過 ACK One GitOps 應用分發 [6 ] ,在 2 個 ACK 叢集中部署應用,實現基於 Git 倉庫的持續一致性部署。

  2. 透過全域性流量管理(GTM) [22 ] 做 DNS 解析實現負載分發,並監控系統執行健康狀態,自動觸發容災切換。

  3. 每個 AZ 內,透過 ACK Ingress [ 7] 實現 7 層流量管理。

  4. 備叢集和主叢集的應用版本相同,但備叢集節點較少,應用副本較少,節省成本。

  5. 在主系統不可用時,全域性流量管理(GTM)會將服務域名 DNS 解析到備用系統,完成主備切換。

  6. 由於流量的增長,備叢集中 ACK HPA [8 ] 會擴容應用副本,進而觸發 ACK Cluster Autocaler [9 ] 擴容叢集節點。

  7. 阿里雲中介軟體(訊息,快取)的跨可用區容災,可參考相關文件,例如:雲訊息佇列 RocketMQ 版例項規格 [ 23] ,雲訊息佇列 Kafka 版例項規格 [ 24] ,雲原生記憶體資料庫 Tair 容災方案 [ 25]

  8. 阿里雲資料庫服務的跨可用區容災,可參考相關文件,例如:RDS MySQL 資料庫搭建高可用架構 [ 26]

🔔 注意:

  1. 本方案基於 DNS 流量轉發,由於 DNS 快取,在災難事件發生時,部分業務依然路由到主系統,造成一定的業務損失。

  2. 需要在 2 個叢集中分別配置維護 7 層 ingress 規則,成本高。系統正常執行狀態:

災難事件發生,AZ 不可用時,系統主備切換,GTM 將流量切換到 AZ2,ACK Cluste2 的應用例項自動擴充套件,中介軟體和資料庫多可用區高可用切換。

基於 ACK One 多叢集閘道器

  1. 透過 ACK One GitOps 應用分發,在 2 個 ACK 叢集中部署應用,實現基於 Git 倉庫的持續一致性部署。

  2. 透過 ACK One 多叢集閘道器 [ 10] ,定義標準 K8s Ingress 規則(YAML 格式),實現 7 層流量治理,實現流量的主備模式分發。多叢集閘道器為跨可用區高可用。

  3. 備叢集和主叢集的應用版本相同,但備叢集節點較少,應用副本較少,節省成本。可以傳送特定 http header 的測試流量,多叢集閘道器轉發到備叢集以驗證工作狀態。

  4. 在主系統不可用時,ACK One 多叢集閘道器會自動將業務流量備用系統,完成主備切換。

  5. 由於流量的增長,備叢集中 ACK HPA 會擴容應用副本,進而觸發 ACK Cluster Autocaler 擴容叢集節點。

  6. 阿里雲資料庫服務的跨可用區容災,可參考相關文件,例如:RDS MySQL 資料庫搭建高可用架構。

🔔 注意:

  1. 本方案為 HTTP 七層流量轉發,配合 7 層健康檢查,主備切換時相比 DNS 方案,大幅減低業務流量損失。

  2. 閘道器側統一支援基於 Ingress 規則的流量治理,相比 DNS 方案,合併了四層負載均衡 SLB 和七層 Ingress 閘道器,降低系統複雜度和維護成本。

系統正常執行狀態:

災難事件發生,AZ 不可用時,系統主備切換,多叢集閘道器(MSE 雲原生閘道器)自動將流量切換到 AZ2 的 ACK Cluste2 中, 應用例項自動擴充套件。

跨可用區雙活

以上 2 個方案以主備模式為例,描述了系統架構。同樣的架構,基於 DNS 流量分發和 ACK One 多叢集閘道器也支援雙活場景,可以配置流量分發比例(例如:50% : 50%),支援自動 failover 切換。在雙活的場景下,每個叢集中的應用副本數,需要根據流量分發比例確定,叢集中需要配置彈性伸縮,以支援流量切換情況下的流量增長。

總結

單地域多可用區方案實現的成本較低,可以利用雲產品(包括:閘道器,容器,中介軟體,資料庫)多可用區部署和多可用區高可用,快速實現容災,對業務改造較小。但此方案僅可應對單個可用區的災難和故障,無法應對地域級的災難故障。

單地域雲+IDC 容災方案

方案架構與單地域多可用區容災方案類似,要點如下:

  1. 雲上 VPC 與 IDC 建立專線連線,打通管控與資料通道。

  2. 透過 ACK One 註冊叢集接入 IDC 叢集,使用阿里雲強大可觀測和安全能力,統一管理 IDC 叢集和 ACK 叢集。

  3. 透過 ACK One GitOps 應用分發,在 2 個叢集中部署應用,實現基於 Git 倉庫的持續一致性部署。

基於 DNS 流量分發(單地域雲上和雲下雙活)

基於 ACK One 多叢集閘道器(單地域雲上和雲下雙活)

多地域容災

如果業務規模大重要性高,服務的使用者數量多範圍廣,單地域的容災方案就無法滿足業務高可用要求,這時需要多地域容災方案。在多個地域獨立部署業務系統,保證每個地域的業務系統具有單獨閉環提供完整的服務能力。

  1. 透過全域性流量管理(GTM)實現使用者就近接入相應地域。

  2. 透過 ACK One GitOps 應用分發,在 2 個 ACK 叢集中部署應用,實現基於 Git 倉庫的持續一致性部署。

  3. 快取多地域高可用方案,可以參考阿里雲產品相關文件,例如:Tair 全球多話 [ 27]

  4. 資料庫跨地域高可用方案,可以參考阿里資料庫雲產品相關文件,例如:雲原生資料庫 PolarDB MySQL 全球資料庫 [ 28]

  5. 地域內,可以採用單地域多可用區容災方案。

單元化多活部署

區別與前一方案,多地域單元化多活部署,需要設計分片規則對應用和資料進行分片,使得單元提供面向部分資料分片的完整服務能力,實現業務安全故障隔離,水平擴充套件,服務龐大的使用者群體。一般分為中心單元(擁有所有使用者資料)和多個子單元(分片後詳細資料)。此種方式需要業務系統支援,自定義分流規則,資料拆分,單元間配合等,複雜度高。

總結

各種災難事件會影響您業務的可用性,透過使用阿里雲的相關雲產品的容災能力,可以減輕或者消除這些影響。首先,需要了解業務可用性需求,從而選擇一個適當的容災策略,然後,使用阿里雲相關雲產品,包括:容器(容器服務 Kubernetes 版 ACK [ 1] 和分散式雲容器平臺 ACK One [ 2] )、訊息、快取、資料庫等,設計容災架構,快速達到您業務可用性要求的恢復時間目標 RTO 和恢復點目標 RPO。

相關連結:

[1] 容器服務 Kubernetes 版 ACK

https://help.aliyun.com/zh/ack/

[2] 分散式雲容器平臺 ACK One

https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/product-overview/ack-one-overview

[3] ACK One 備份中心

https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/backup-center-overview

[4] ACK One 註冊叢集

https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/overview-9

[5] ACK One 艦隊多叢集 Service

https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/mcs-overview

[6] ACK One GitOps 應用分發

https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/gitops-overview

[7] ACK Ingress

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/ingress-overview

[8] ACK HPA

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/horizontal-pod-autoscaling

[9] ACK Cluster Autocaler

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/auto-scaling-of-nodes

[10] ACK One 多叢集閘道器

https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/multi-cluster-gateway-overview

[11] 地域(Region)

https://help.aliyun.com/document_detail/40654.html#concept-z04-bg5-j8w

[12] 雲盤快照

https://help.aliyun.com/zh/ecs/user-guide/copy-a-snapshot

[13] 檔案儲存 NAS

https://help.aliyun.com/zh/nas/product-overview/what-is-nas

[14] 物件儲存 OSS

https://help.aliyun.com/zh/oss/product-overview/what-is-oss

[15] 雲備份

https://help.aliyun.com/zh/cloud-backup/product-overview/what-is-hbr

[16] RDS MySQL 資料庫備份恢復

https://help.aliyun.com/zh/flink/developer-reference/log-service-connector

[17] RDS 例項間資料遷移

https://help.aliyun.com/zh/rds/apsaradb-rds-for-mysql/migrate-data-between-apsaradb-rds-for-mysql-instances

[18] IDC 應用上雲遷移

https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/migrate-applications-from-self-managed-kubernetes-clusters-to-ack-clusters

[19] 跨版本叢集遷移

https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/use-backup-center-to-migrate-applications-from-clusters-running-lower-kubernetes-versions

[20] 跨賬號叢集接入

https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/use-cases/use-ack-one-to-manage-clusters-across-cloud-platforms-and-alibaba-cloud-accounts

[21] 跨叢集遷移應用

https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/migrate-applications-across-clusters-in-different-regions

[22] 全域性流量管理(GTM)

https://help.aliyun.com/document_detail/189587.html

[23] 雲訊息佇列 RocketMQ 版例項規格

https://help.aliyun.com/zh/apsaramq-for-rocketmq/cloud-message-queue-rocketmq-5-x-series/product-overview/instance-specifications

[24] 雲訊息佇列 Kafka 版例項規格

https://help.aliyun.com/zh/apsaramq-for-kafka/cloud-message-queue-for-kafka/product-overview/instance-editions

[25] 雲原生記憶體資料庫 Tair 容災方案

https://help.aliyun.com/zh/tair/product-overview/disaster-recovery

[26] RDS MySQL 資料庫搭建高可用架構

https://help.aliyun.com/zh/rds/apsaradb-rds-for-mysql/build-a-high-availability-architecture

[27] Tair 全球多話

https://help.aliyun.com/zh/tair/user-guide/overview-of-global-distributed-cache-for-tair

[28] 雲原生資料庫 PolarDB MySQL 全球資料庫

https://help.aliyun.com/zh/polardb/polardb-for-mysql/user-guide/overview-49

相關文章