image_pdfimage_print

 

如今容器與 Kubernetes 可說是大眾傳媒的新寵兒,企業組織日漸發現這類解決方案相當適合次世代與雲端原生架構。因此當疫情封城期間,我試圖尋找能夠長久營運的專案,而 Kubernetes 看來是個絕佳的起始點。容器對我而言並非新鮮的概念,2000 年期間我曾在 Linux VServers 和 Solaris Zones 工作過,如今也有研究並運行 Kubernetes 數年的經驗,但我仍然有些疑問迫切需要解答:

  • Kubernetes 工作負載理應為可攜式,但應用程式是否能橫跨兩個平台,像是兩個公有雲之間、或是私有雲與公有雲之間,真正達成可攜性?
  • 若 Kubernetes 成為有狀態應用程式 (stateful application) 的可能方案,那麼該如何為這些應用程式提供災難復原?
  • 提供應用程式可攜性與災難復原應使用哪些工具?
  • 既然工作環境為完全獨立運作,那麼該如何規劃故障轉移?

漫長的封城期間,我潛心鑽研這項專案。以下便是我在專案工作期間的發現。

應用程式

第一步需要先定義何謂應用程式。我希望應用程式能夠盡可能廣泛相關,而 WordPress 看來是個絕佳的起始點。WordPress 是以 PHP 撰寫的免費開源內容管理系統,並配備 MySQL 或 MariaDB 資料庫。根據 WordPress 網站內容,網路上有 42% 網站由該系統運行,而且如今企業內部亦廣泛部署 MySQL,因此它應可作為廣泛相關的應用程式堆疊來使用。

平台

由於工作時間有限,且工作環境跨多重雲端,所以我希望採用能夠完整跨多重雲端環境的通用 Kubernetes 平台。儘管並非絕對必要,但我的關注重點在於使用部署快速、運行一致不中斷的可靠平台,最後我找到了 Red Hat OpenShift Red Hat OpenShift 是領先業界、專為開放混合雲策略所打造的 Kubernetes 平台,提供簡易上手的使用者驅動安裝功能,多種平台皆可使用,包括裸機、VMware、AWS、Azure 和 GCP。

架構 Kubernetes 災難復原策略時,大多數人都傾向選擇在各個站址分別部署 Kubernetes 叢集,並在各叢集間複寫物件和資料。 有鑑於此,我選擇將 Red Hat OpenShift 部署在 Amazon Web Services 和 Microsoft Azure 公有雲上,如下列圖表所示。

資料平台

若要在多重雲環境規劃故障轉移,便需要在兩個工作環境之間複寫容器建置與資料,因此需要通用的資料平台。 照理說應用程式層級的複寫(例如:MySQL 複寫)即可達成任務,但這樣做卻無法兼顧應用程式上其他有狀態的重要部分,復原過程會因此變得冗長繁瑣。 我希望能找到足以勝任複寫所有應用程式(容器建置與秘密存放區、SQL、檔案系統、訊息佇列、記憶體快取實例、機器學習平台、監控工具、備份等)相關資料的解決方案,只需一套工作排程、一組管理監控台面。為解決上述需求,我選用了 Kubernetes 資料平台的業界領導品牌 Portworx,該廠於 2020 年末由 Pure Storage 併購

Portworx 提供軟體定義容器儲存平台,可直接在 Kubernetes 叢集內部署,達到高可用性、安全性,不論就地部署或雲端環境,皆能兼顧叢集內的工作負載服務品質以及備份與災難復原。各種類型的 Kubernetes 分散式系統皆可支援 Portworx,包括 Kubernetes.io、Red Hat OpenShift、AWS EKS、Azure AKS、Google GKE、VMware Tanzu、Rancher 等等。Portworx 具備眾多優異功能,協助客戶更加簡易快速運行,並提供更具擴充性與適應力的容器環境,不過此專案我僅關注使用二項 Portworx 解決方案:PX-DR 和 STORK。

  • PX-DR 提供 Kubernetes 持久性資料容量,精細程度達容器層級,單一指令即可啟動保護與還原功能,我透過PX-DR 在兩個位址同步複寫資料。使用 PX-DR 同步複寫需要共享 ETCD 叢集以符合 Quorum 機制,這個機制我們稍後再介紹。
  • STORK 則為架構提供兩項關鍵功能:
    • 獨立叢集間的 Kubernetes 物件非同步複寫(像是部署、容量位元、持久性容量請求和服務規格)
    • 透過 Kubernetes 排程擴充功能,依拓撲性質將容量位元排程至與資料最相近的工作節點:主要位址一經啟用,STORK 便會將容量位元排程至主要位址,待次要位址啟用,STORK 僅會將容量位元排程至次要位址

下列圖表說明 STORK 和 PX-DR 如何合作運行,為 Kubernetes 提供同步災難復原解決方案。

參考資訊: https://docs.portworx.com/portworx-install-with-kubernetes/application-install-with-kubernetes/deployment-arch/dr-and-multi-site/

使用網路工作

我的目標是達成通用的資料平台,因此在 AWS 和 Azure 租用戶之間需要通用網路。幾近完美流暢的故障轉移也是必要的,因此我需要盡可能同步複寫的功能。Portworx 能在位址之間進行同步複寫,來回通訊延遲時間 (RTT) 僅需 10 毫秒。只要選用位於同一廣域網路內的 AWS 與 Azure 資料中心,便可輕鬆達成需求。在 AWS 和 Azure 都建立租用戶後,下一步即是使用 VPN 連接兩處雲端。

Microsoft 提供了多份詳實的說明書,闡述如何設定 AWS 與 Azure 的 VPN 連接 請按此處查看。

知識小站 #1:Microsoft Azure 預期本地與遠端的 IPv4 網路 CIDR 建置在 AWS 的 0.0.0.0/0 位址

VPN 一經建立,便可繼續設定 OpenShift 叢集環境。

安裝 Red Hat OpenShift

Red Hat OpenShift 提供客戶驅動的安裝流程,可輕易在 Azure 和 AWS 部署 OpenShift。安裝程式建置方式有兩種:

  • 由安裝程式供應 – 安裝程式會提供全新 AWS VPC(或 Azure VNet)並部署所有子網路、負載平衡器、路由表、ACLs 和 OpenShift 運行所需的 DNS 記錄
  • 使用者供應 – 由客戶提供 AWS VPC(或 Azure VNet)以及子網路、DNS 記錄、建置路由表和權限控制

兩相比較後我選擇了使用者供應方式,能掌握較多控制權,安裝過程依然快速簡便。更多 OpenShift 安裝流程資訊請參見下列連結:

安裝 Red Hat OpenShift CLI

大多數的建置任務皆可從 OpenShift Web Console 執行,但仍有少數 Portworx 叢集監控指令僅能透過 CLI 執行。關於 OpenShift CLI 的安裝說明 請按此處查看。

為 Portworx 同步複寫建置 OpenShift

Portworx 的一大好處在於它能依拓撲性質進行複寫。 這項功能非常值得探索運用。 

Portworx 安裝的 Kubernetes 節點能夠洞悉其所部署的機架、區域、或地區,且 Portworx 會運用這項資訊影響容量複寫的位置調度。各項拓撲的預設複寫行為如下:

  • 機架:若節點位於不同機架,管理員可以 手動 指定容量複寫選用的機架。
  • 區域:若節點位於不同區域,Portworx 將會 自動 保持複寫容量位於不同區域。
  • 地區:若節點位於不同地區,Portworx 將會 自動 保持複寫容量位於相同地區。

欲深入了解 Portworx 的拓撲學 請按此處查看。

將 Portworx 安裝在 Kubernetes 節點上時,設定會預先填入 Portworx 地區與區域值:

  • 雲端環境:failure-domain.beta.kubernetes.io/regionfailure-domain.beta.kubernetes.io/zone 皆為 Kubernetes 節點上的標籤
  • 就地部署環境:px/regionpx/zone 皆為 Kubernetes 節點上的標籤
  • 若未預先填入:可在各節點的 /etc/pwx/px_env 檔案建置 PX_RACK, PX_ZONE, PX_REGION 值

欲深入了解拓撲學標籤設定 請按此處查看。此次解決方案我需要容量資料的副本/複寫位於本地節點和遠端節點。依據上述規則,解決方案內的所有節點都必須位於相同地區,但必須分處不同區域。

預設情況下,當 OpenShift 部署於 AWS 或 Azure 時,會建置 failure-domain.beta.kubernetes.io/region failure-domain.beta.kubernetes.io/zone 於 AWS/Azure 地區以及區域節點(例如:亞太地區東南亞與東澳地區)。 Portworx 安裝時會沿用這些設定,將 Azure 與 AWS 工作節點放入不同 Portworx 地區,且不會將複寫分散至兩點位址。新增 px/region 標籤至各個節點以在同一地區建置 Portworx 叢集,可以解決這項問題。

可在 OpenShift GUI 上操作:

  • 瀏覽運算 -> 節點 -> 選擇各項工作節點
  • 點按 YAML -> 擴充中繼資料 -> 新增 px/region 標籤(我的方案是 px/region: ocsydney

例行作業、權限控制與 DNS

由於 Kubernetes 叢集彼此獨立、互不干涉,因此兩個叢集之間唯一的溝通方式是 Portworx 資料平台層。例行作業和權限控制需求由 Portworx 驅動,概略介紹 請按此處查看

  • Portworx:透過 VPN 通道兩處位址的所有主要節點與工作節點皆需要 IP 連接性。Portworx TCP/UDP 連接性需求包括下例幾點:
    • 兩處路徑皆為 TCP 埠號 9001 – 9022(或 OpenShift 17001 – 17020)
    • 兩處路徑皆為 UDP 埠號 9002
  • etcd Quorum:提供叢集 Quorum 機制的 etcd 伺服器亦要求叢集的例行工作與網路連接性:
    • Kubernetes 主要與工作節點及所有 etcd 伺服器皆為 TCP 埠號 2379
    • 所有 etcd 伺服器皆為 TCP 埠號 2380 以允許叢集節點同步
  • STORK:Stork 需要 Kubernetes API 服務的 DNS 解決方案與 TCP 埠連接性,以連接至遠端 Kubernetes 主要節點搬移 Kubernetes 物件。任一 Kubernetes 叢集如何解決其他叢集的命名深具挑戰性,需要做到下列任一點:
    • 在本地 DNS 創建區域與 DNS 名稱以對映遠端 DNS 區域和 FQDN,取得遠端叢集的 API 服務
    • 本地 DNS 伺服器的 DNS 轉發器 (forwarder) 透過遠端 DNS 伺服器解決遠端 DNS 區域

我的解決方案選擇在各個叢集的本地 DNS 伺服器創建區域,這些伺服器可對映替代位址的 DNS 區域。本地叢集 STORK 溝通遠端叢集的 Kubernetes API 服務以實行 Kubernetes 物件搬移。為了實行工作任務,需要 TCP 埠號 6443 遠端叢集主要節點的連接性。

安裝 ETCD 叢集

若要在同步模式操作 PX-DR,Portworx 關鍵值資料庫 (KVDB) 必須部署於共享 etcd 叢集。Portworx 一般建議客戶部署三節點的 etcd 叢集,每個位址有一個 etcd 節點,剩餘的 etcd 則部署於獨立第三方位址作為見證節點,如底下詳述所示,做為 Quorum 斷路器使用。

為了符合需求,我在各個位址都部署了單一虛擬機器,並遵循 Portworx 簡易好上手的安裝說明,如下列 連結所示

知識小站 #2:若開機/重新啟動後接收 ETCD 叢集有困難,試著在 file /etc/systemd/system/etcd3.service 內將 TimeoutStartSec 設定為 600 秒,並同時重新啟動所有 ETCD 伺服器。

安裝 Portworx

處理好所有前置作業後,便是安裝 Portworx 的大好時機。在 OpenShift 安裝 Portworx 只需三個簡單步驟。

第 1 步自 Red Hat OpenShift GUI 安裝 Portworx Enterprise 操作器。

Portworx Enterprise 操作器可透過 OpenShift GUI 部署—僅需瀏覽 OpenShift OperatorHub,搜尋 Portworx Enterprise,並點按 安裝。 此一步驟需在 兩處 OpenShift 叢集上完成。

第 2 步建置 Portworx 安裝規格

Portworx 提供 基於網頁的建置服務器 ,可客製化 Portworx 安裝。

下列圖示是我在安裝建置時所使用的選項。

上述建置步驟一經完成,我們即擁有客製化的 kubectl 指令可安裝 Portworx。複製這道指令的 URL 以繼續下列步驟。

第 3 步在 OpenShift 創建 Portworx 安裝規格

為完成 Portworx 安裝,請僅複製上述建置服務器工具提供的客製化規格 URL,並將內容貼上至本地瀏覽器。選擇所有文字內容並複製至剪貼簿。

隨後在 兩處 OpenShift 叢集獨立完成下述步驟。 瀏覽 Red Hat OpenShift GUI:

  • 點按安裝操作器 -> Portworx Enterprise
  • 點按儲存叢集 -> 創建 StorageCluster

  • 點按 YAML 檢視
  • 刪除既有的 YAML 並貼上客製化規格的 YAML
  • 至關重要:在規格註解新增一行文字指定使用中的 OpenShift 叢集網域。例如:
    • OpenShift / AWS 叢集:io/misc-args: “-cluster_domain ocazure”
    • OpenShift / Azure 叢集:io/misc-args: “-cluster_domain ocaws”
  • 點按建立

  • 瀏覽 Pods,選擇 kube-system 物件,並監控 Portworx 容量位元安裝及上線時的狀態。當所有容量位元的狀態皆顯示為「運行中」,Portworx 即安裝完成,隨時可啟用。

第 4 步兩處叢集皆完成上述任務後,即可查看叢集狀態,請瀏覽「安裝操作器 -> Portworx Enterprise」

  • 點按「儲存節點」,便可查看所有安裝的叢集節點以及上線狀態。

第一部分至此已完成。在下一篇文章中,我們會部署 WordPress 並執行 AWS 和 Azure Red Hat OpenShift 之間的應用程式故障轉移與故障回復。