在多個區域中執行
本頁說明跨多個區域執行 Kubernetes 的相關資訊。
背景
Kubernetes 的設計旨在讓單一 Kubernetes 叢集可以跨多個故障區域執行,這些區域通常屬於稱為「區域」的邏輯群組。主要雲端供應商將區域定義為一組故障區域(也稱為可用區域),這些區域提供一致的功能集:在一個區域內,每個區域都提供相同的 API 和服務。
典型的雲端架構旨在盡可能降低一個區域的故障也會損害另一個區域服務的可能性。
控制平面行為
所有控制平面元件都支援以可互換資源池的形式執行,每個元件都經過複寫。
當您部署叢集控制平面時,請將控制平面元件的複本放置在多個故障區域中。如果可用性是一個重要的考量因素,請選擇至少三個故障區域,並在至少三個故障區域中複寫每個個別的控制平面元件(API 伺服器、排程器、etcd、叢集控制器管理員)。如果您正在執行雲端控制器管理員,那麼您也應該在您選擇的所有故障區域中複寫它。
註記
Kubernetes 不為 API 伺服器端點提供跨區域的彈性。您可以使用各種技術來提高叢集 API 伺服器的可用性,包括 DNS 循環配置資源、SRV 記錄或具有健康狀態檢查的第三方負載平衡解決方案。節點行為
Kubernetes 會自動將工作負載資源(例如 Deployment 或 StatefulSet)的 Pod 分散到叢集中不同的節點。這種分散有助於降低故障的影響。
當節點啟動時,每個節點上的 kubelet 會自動將標籤新增至 Node 物件,該物件代表 Kubernetes API 中特定的 kubelet。這些標籤可以包含區域資訊。
如果您的叢集橫跨多個區域或地區,您可以搭配使用節點標籤與Pod 拓撲分散約束,以控制 Pod 如何分散在叢集中不同的容錯域:地區、區域,甚至特定節點。這些提示讓排程器能夠更妥善地放置 Pod,以提高預期的可用性,並降低相關故障影響整個工作負載的風險。
例如,您可以設定約束,以確保 StatefulSet 的 3 個副本盡可能在不同的區域中執行。您可以宣告式地定義此項,而無需明確定義每個工作負載使用的可用區域。
跨區域分散節點
Kubernetes 核心本身不會為您建立節點;您需要自行建立,或使用諸如 Cluster API 之類的工具來代表您管理節點。
使用諸如 Cluster API 之類的工具,您可以定義多組機器作為叢集中跨多個容錯域的工作節點運行,並制定規則在整個區域服務中斷時自動修復叢集。
手動為 Pod 指派區域
您可以將節點選擇器約束套用至您建立的 Pod,以及工作負載資源(例如 Deployment、StatefulSet 或 Job)中的 Pod 範本。
區域的儲存存取
當建立持久卷時,Kubernetes 會自動將區域標籤新增至連結到特定區域的任何 PersistentVolume。然後,排程器透過其 NoVolumeZoneConflict
謂詞確保宣告給定 PersistentVolume 的 Pod 僅放置在與該卷相同的區域中。
請注意,新增區域標籤的方法可能取決於您的雲端供應商和您使用的儲存佈建器。請務必參考您環境的特定文件,以確保正確的組態。
您可以為 PersistentVolumeClaims 指定 StorageClass,該 StorageClass 指定該類別中的儲存體可能使用的容錯域(區域)。若要瞭解如何配置可感知容錯域或區域的 StorageClass,請參閱允許的拓撲。
網路功能
Kubernetes 本身不包含區域感知網路功能。您可以使用網路外掛程式來配置叢集網路,而該網路解決方案可能具有區域特定的元素。例如,如果您的雲端供應商支援 type=LoadBalancer
的服務,則負載平衡器可能只會將流量傳送到與處理給定連線的負載平衡器元素位於同一區域中的 Pod。請查看您的雲端供應商的文件以瞭解詳細資訊。
對於自訂或內部部署,也適用類似的考量。 Service 和 Ingress 行為,包括處理不同的容錯區域,確實會因叢集的確切設定方式而異。
容錯回復
當您設定叢集時,您可能還需要考量,如果一個地區中的所有容錯區域同時離線,您的設定是否以及如何能夠恢復服務。例如,您是否依賴於至少有一個節點能夠在區域中執行 Pod?
請確保任何叢集關鍵的修復工作不會依賴於叢集中至少有一個健康的節點。例如:如果所有節點都不健康,您可能需要執行具有特殊容忍度的修復 Job,以便修復能夠完成,並使至少一個節點恢復服務。
Kubernetes 沒有針對此挑戰的現成答案;然而,這是需要考量的事情。
下一步
若要瞭解排程器如何在叢集中放置 Pod,並遵守已配置的約束,請造訪排程和驅離。