瞭解以 etcd 快照為基礎的 Kubernetes 叢集回復

為確保災害發生時的業務連續性,您要為 Kubernetes 叢集上執行的應用系統實行災害復原策略。使用這些 Oracle Maximum Availability Architecture (Oracle MAA) 建議,以提供資料保護,並使您快速切換至待命系統,以減少資料遺失與生產力。

儘管 Kubernetes 採用意味著 IT 系統架構的巨大變化,但 Kubernetes 系統卻將類似的災害復原 (DR) 形式視為傳統應用程式 (例如 Oracle Java SE、Oracle Java EE 或 JavaScript)。它必須在次要位置維持主要系統的一致且「儘可能達到最新狀態」複本,以供繼續工作負載的災害在主要區域會導致停機。

此解決方案手冊提供 Oracle MAA 建議與公用程式,建立次要 Kubernetes 系統,讓您在影響位置的災害案例中復原,並強制將工作負載重新導向至複本網站。

雖然此解決方案手冊著重於將 Kubernetes 叢集回復至不同區域,但您可以使用相同的命令檔與程序將叢集就地還原至先前的時間點。在災害復原以外的情況 (例如下列),此作業可能相當有用:

  • 當控制平面設定錯誤時。
  • 當 etcd 資料庫遺失、損毀或當 etcd 未正確啟動時。
  • 不正確的部署或使用者錯誤會影響多個應用程式或微服務,且必須將叢集回復為先前的版本或拷貝。ETCD 快照回復會將所有使用者自建物件回復至擷取快照 (備份) 的時間點。

本文件著重於將 Kubernetes 的 etcd 資料複製到次要位置。Kubernetes 叢集的所有資訊都儲存在 etcd 中,這是一個金鑰值存放區,用來作為叢集資料之 Kubernetes 備份存放區。This solution playbook provides recommendations to replicate a Kubernetes cluster created with the Kubernetes kubeadm tool (see https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/) based on etcd restore.提供的設定程序和命令檔可能需要自訂其他類型的叢集 (不是以 kubeadm 建立的叢集),但一般而言,只要可以存取 Kubernetes 控制層使用的 etcd 端點,便有效。此複寫解決方案需要針對次要叢集進行特定設定,而且將會使用 etcd (也稱為 etcd 快照) 複本來啟動存在於主要叢集中的完全相同構件。

您可以使用使用者自建物件快照或第三方 Kubernetes 備份工具,跨 Kubernetes 系統複寫特定的命名空間和應用系統。不過,它們不會保護叢集免於控制層描述資料中的檔案損毀和組態錯誤。除了將它們用於災害保護之外,您也可以使用 etcd 快照進行本機回復,並將 Kubernetes 叢集回復為上一個工作時間點。如果您的 etcd 存放區與 etcd 叢集系統不健康,則應用模組可能會繼續執行,但仍會繼續執行 POD 遷移、組態變更、秘密存取,及其他需要控制層可用性的作業無法正確運作。因此,等等保留必須是任何 Kubernetes 叢集生命週期程序的關鍵部分。

除了 Kubernetes 組態資料外,在 Kubernetes 上執行的應用系統和微服務,還可在程式實際執行時產生資料。執行階段資料災害保護超出本文件的範圍,應會以與在應用程式伺服器上執行之傳統應用程式相同的方式處理:

  • 避免多語言持續性 (在程式實際執行資料使用不同類型的永久存放區,幾乎無法解決 BAC Theorem 的問題)
  • 使用單一存放區儲存所有不同的資料類型、微服務和應用系統,並盡可能提供相依性
  • 請參閱 Oracle MAA Best Practices for Oracle Database ,瞭解您的程式實際執行災害防護

開始之前

有數個 Oracle Maximum Availability Architecture (MAA) 技術摘要,描述如何為傳統中介軟體系統設定災害復原 (DR) 系統。 這些文件詳述 Kubernetes 應用系統使用之外部基礎架構元件 (例如儲存、負載平衡器及資料庫) 的災害保護需求。

請複查下列以瞭解詳細資訊:

架構

此架構顯示 Kubernetes 叢集的災害復原 (DR) 系統拓樸。

主要資料庫中的所有程式實際執行、組態以及描述資料資訊,都會以 Oracle Autonomous Data Guard 從區域 1 複製到區域 2。必要的 Kubernetes 叢集組態會透過 etcd 快照進行複製以保護控制層。您可以使用 etcd 副本或構件快照來保護應用程式特定的組態。如需詳細資訊,請參閱使用使用者自建物件快照保護您的 Kubernetes 叢集免於災害。容器使用的映像檔會由每個叢集的本機登錄或外部儲存區域代管 (這些映像檔本身並不視為 Kubernetes 叢集組態)。

注意:

對程式實際執行資料庫設定 Oracle Autonomous Data Guard 已超出此文件的範圍。
kubernetes-etcd-multiregion-dr.png 的描述如下
kubernetes-etcd-multiregion-dr.png 圖解描述

kubernetes-etcd-multiregion-dr-oracle.zip

此架構支援下列元件:

  • 區域

    Oracle Cloud Infrastructure 區域是一個本地化的地理區域,包含一或多個資料中心 (稱為可用性網域)。區域與其他區域無關,因此廣大的距離可加以區隔 (跨國家或甚至洲)。

  • 負載平衡程式

    Oracle Cloud Infrastructure Load Balancing 服務提供從單一進入點到後端多部伺服器的自動化流量分配。

  • 動態路由閘道 (DRG)

    DRG 是一個虛擬路由器,可為 VCN 與區域外部網路之間的 VCN (例如另一個 Oracle Cloud Infrastructure 區域中的 VCN、企業內部部署網路或其他雲端提供者中的網路) 之間的專用網路流量提供路徑。

  • 資料保全

    Oracle Data Guard 提供一組全方位的服務,可建立、維護、管理及監督一或多個待命資料庫,讓生產環境的 Oracle 資料庫保持可用,而不會發生中斷。Oracle Data Guard 會將這些待命資料庫保留為生產資料庫的複本。接著,如果生產環境資料庫因計畫性或非計畫性停機而無法使用,Oracle Data Guard 可以將任何待命資料庫切換為生產角色,將停機關聯的停機時間降到最低。

  • Oracle Real Application Clusters (Oracle RAC)

    Oracle RAC 可讓您跨多部伺服器執行單一 Oracle Database,以最大程度地提高可用性並啟用水平擴展性,同時存取共用儲存。連線到 Oracle RAC 執行處理的使用者階段作業,可以在停機期間容錯移轉並安全重新執行變更,而不需要對一般使用者應用程式進行任何變更。

  • 容器登錄

    Oracle Cloud Infrastructure Registry 是 Oracle 管理的登錄,可讓您簡化開發到生產的工作流程。登錄可讓您輕鬆儲存、共用及管理開發使用者自建物件與映像檔。Oracle Cloud Infrastructure 的高可用性擴充架構可確保您可以可靠地部署和管理應用程式。

  • Kubernetes 的容器引擎

    Oracle Cloud Infrastructure Container Engine for Kubernetes 是一項完全託管、可擴展且高可用性的服務,可用來將容器化應用系統部署到雲端。您可以指定應用系統所需的運算資源,而 Kubernetes 的容器引擎則會在現有租用戶的 Oracle Cloud Infrastructure 上佈建這些資源。Kubernetes 的容器引擎使用 Kubernetes 將跨主機叢集的容器化應用程式部署、擴展及管理自動化。

  • Kubernetes 叢集

    Kubernetes 叢集是一組執行容器化應用程式的機器。Kubernetes 提供可攜式、可擴充的開源平台,可管理這些節點中的容器化工作負載和服務。kubernetes 叢集是由工作節點與控制層節點組成。

  • Kubernetes 控制平面
    Kubernetes 控制層可管理 Kubernetes 叢集內工作節點與 Pod 的資源。控制層元件可偵測和回應事件、執行排程及移動叢集資源。以下為控制平面元件:
    • kube-apiserver:執行 Kubernetes API 伺服器。
    • etcd:所有叢集資料的分散式索引鍵值存放區。
    • kube 排程器:決定將執行哪一個節點新的未指定 Pod。
    • kube-controller-manager:執行控制器行程 。
    • cloud-controller-manager:將您的叢集與雲端特定 API 連結。
  • Kubernetes 工作節點

    Kubernetes 工作節點是一個在 Kubernetes 叢集內執行容器化應用程式的工作機器。每個叢集至少都有一個工作節點。

  • 傳入控制器

    傳入控制器是指在 Kubernetes 叢集中執行並管理傳入資源的元件。它會從外部網路接收流量、將它遞送至正確的服務,以及執行負載平衡和 SSL 終止。傳入控制器通常以叢集中的個別 Pod 形式執行,且可以與所管理的服務個別調整規模。

  • KUBE 端點 API

    KUBE-Endpoint API 是 Kubernetes 控制層中的 kube-apiserver 元件。它會執行 Kubernetes API 伺服器。

  • ETCD 備份

    ETCD Backup 是 Kubernetes 控制層的 etcd 元件備份。etcd 包含所有叢集資料的分散式索引鍵值存放區。建立 ETCD 備份以復原用於災害復原的 Kubernetes 叢集是很重要的。

  • YAML 快照

    YAML 快照是 (yaml) 檔案的時間點複本,包含 Kubernetes 叢集中的使用者自建物件定義。此快照是一個 tar 檔案,可用來回復相同或不同 Kubernetes 叢集中的使用者自建物件。

Kubernetes 災害保護的考量

為 Kubernetes 實作災害保護時,請考慮下列事項:

  • 對稱式災害復原 (DR) :Oracle 建議在主要和次要裝置中使用完全相同的資源容量和組態。兩個區域中的 Kubernetes 叢集應有類似的可用資源,例如工作節點數目 (及其硬體容量) 和其他基礎架構 (共用儲存體、負載平衡器、資料庫等等)。第二區域中 Kubernetes 叢集所依賴的資源,必須能夠與主要負載相同。此外,這兩個系統必須與回復系統依存的完全相同服務一致,在這兩個位置都必須使用並排車、組態對應 (CM)。
  • 主機名稱別名和虛擬化:請務必規劃次要網站中節點所使用的主機名稱。控制層和工作節點的主機名稱或別名主機名稱在次要位置必須為「作用中」,才能從主要 Kubernetes 叢集回復 etcd 快照。節點名稱會儲存在 Kubernetes 叢集的不同使用者自建物件中,用以識別工作節點、標示 Pod 配置、在描述叢集本身的組態 (組態) 對應中,以及在多個組態檔和項目中標記 Pod 配置。您的次要位置必須識別主要 Kubernetes 叢集使用相同主機名稱的工作者、控制層和前端 kube-api 位址 (網域名稱中的完整名稱可能不同,但主機名稱必須相同)。如果沒有主機名稱別名,etcd 快照回復將無法正常運作,因為 kubelet、排程器、控制器一般而言,控制層服務無法連線複製組態所使用的適當端點和主機。請勿使用 IP 來識別 kubernetes 中的節點,請一律改用主機名稱。
  • 容器映像檔與二進位檔呈現類似的典範:映像檔不會像檔隨著 Kubernetes 組態而變更,您可能不需要隨著每個 Kubernetes 叢集複寫更新映像檔。主要系統使用的影像必須與次要系統中使用的影像相同,或不一致且可能發生故障。不過,影像複製已超出此播放簿的範圍。您可以運用多種策略在兩個位置之間保持影像的一致使用,包括下列各項:
    • 將影像儲存於主要節點,並載入至次要的職工節點。這個方法非常容易實作,但會產生管理負荷。使用容器登錄在本機儲存映像檔有許多優點,因此很難管理版本和更新。
    • 映像檔可以完全位於不同區域中的外部容器登錄,也可以位於主要和待命資料庫使用的不同資料中心。外部產品和程式庫是由第三方維護,其可用性通常在其版本中是隱含的。
    • 影像可以位於主要和待命的「容器註冊」中。釋出新版本的映像檔時,每個區域會平行更新。這樣可以更有效地控制使用的軟體,但會導致更高的管理負荷。它需要複製映像檔並管理證明資料,才能存取兩個不同的登錄檔。CI/CD 工具通常用於此方法。

這個解決方案手冊示範如何使用 kubeadm 工具建立的 Kubernetes 叢集範例。這些建議是安裝在內部部署系統之自訂 Kubernetes 叢集的一般建議,但大多數命令檔可能都需要修改不是使用 kubeadm 工具建立的叢集。您必須使用在執行相同 etcd 和 Kubernetes 版本的 Kubernetes 叢集之間提供的步驟和命令檔。在不同的 kubernet 版本中回復 etcd 快照,可能會導致不一致且不穩定的 etcd 叢集。

關於必要產品與角色

此解決方案需要下列產品與角色:

  • Kubernetes 叢集
  • 能夠管理 Kubernetes 系統的堡壘主機可存取叢集的 etcd 端點,並且使用 ssh 存取不同的控制層節點
  • (選擇性) Oracle Cloud Infrastructure (OCI)

    此手冊以 OCI 區域以及主要和次要區域的資源為基礎。不過,此解決方案也適用於企業內部部署的 Kubernetes 叢集。

這些是每項服務所需的角色。

服務名稱:角色 需要 ...
Kubernetes 叢集 (主要):administrator 執行所有的命令檔。
Kubernetes (主要) 節點:具備 root sudo 權限的使用者

執行下列的命令檔:

  • maak8s-force-stop-cp.sh
  • maak8-etcd-backup.sh
  • maak8-etcd-restore.sh
Kubernetes 叢集 (次要):administrator 執行所有的命令檔。
Kubernetes (次要) 節點:具備 root sudo 權限的使用者 執行下列的命令檔:
  • maak8s-force-stop-cp.sh
  • maak8-etcd-backup.sh
  • maak8-etcd-restore.sh

請參閱 Oracle 產品、解決方案和服務,以取得您需要的內容。