在多可用區中執行
此頁面描述了在多個區域中執行 Kubernetes。
背景
Kubernetes 的設計允許單個 Kubernetes 叢集跨多個故障區域執行,通常這些區域位於一個邏輯分組中,稱為區域。主要的雲提供商將一個區域定義為一組故障區域(也稱為可用區),這些區域提供了一致的功能集:在一個區域內,每個可用區都提供相同的 API 和服務。
典型的雲架構旨在最大限度地降低一個可用區中的故障同時損害另一個可用區中的服務的可能性。
控制平面行為
所有控制平面元件都支援作為可互換資源池執行,每個元件都有副本。
部署叢集控制平面時,請將控制平面元件的副本放置在多個故障區域中。如果可用性是一個重要的考慮因素,請至少選擇三個故障區域,並將每個獨立的控制平面元件(API 伺服器、排程器、etcd、叢集控制器管理器)複製到至少三個故障區域中。如果正在運行雲控制器管理器,則也應將其複製到所有選定的故障區域中。
注意
Kubernetes 不提供 API 伺服器端點的跨區域彈性。你可以使用各種技術來提高叢集 API 伺服器的可用性,包括 DNS 迴圈、SRV 記錄或具有健康檢查的第三方負載均衡解決方案。節點行為
Kubernetes 會自動將工作負載資源(例如Deployment 或 StatefulSet)的 Pod 分散到叢集中的不同節點上。這種分散有助於降低故障的影響。
當節點啟動時,每個節點上的 kubelet 會自動為表示該特定 kubelet 在 Kubernetes API 中的 Node 物件新增標籤。這些標籤可以包括區域資訊。
如果你的叢集跨越多個區域或可用區,你可以結合使用節點標籤和 Pod 拓撲分佈約束 來控制 Pod 在叢集中不同故障域(區域、可用區甚至特定節點)之間的分佈方式。這些提示使排程器能夠為了更好的預期可用性而放置 Pod,從而降低相關故障影響整個工作負載的風險。
例如,你可以設定一個約束,以確保 StatefulSet 的 3 個副本在可行的情況下都執行在不同的可用區中。你無需顯式定義每個工作負載使用哪些可用區,即可宣告性地定義此約束。
跨區域分佈節點
Kubernetes 的核心不會為你建立節點;你需要自己完成,或者使用 Cluster API 等工具代表你管理節點。
使用 Cluster API 等工具,你可以定義一組機器,使其作為叢集的 worker 節點跨多個故障域執行,並設定規則以便在整個可用區服務中斷時自動修復叢集。
Pod 的手動區域分配
你可以將節點選擇器約束應用於你建立的 Pod,以及工作負載資源(如 Deployment、StatefulSet 或 Job)中的 Pod 模板。
區域的儲存訪問
建立持久卷時,Kubernetes 會自動為任何與特定區域關聯的 PersistentVolume 新增區域標籤。排程器隨後透過其 NoVolumeZoneConflict
謂詞確保宣告給定 PersistentVolume 的 Pod 只放置在該卷所在的同一區域中。
請注意,新增區域標籤的方法可能取決於你的雲提供商和你使用的儲存供應器。請務必參考你特定環境的文件以確保正確的配置。
你可以為 PersistentVolumeClaim 指定一個 StorageClass,該 StorageClass 指定該類中儲存可能使用的故障域(區域)。要了解如何配置感知故障域或區域的 StorageClass,請參閱允許的拓撲。
網路
Kubernetes 本身不包含區域感知的網路。你可以使用網路外掛來配置叢集網路,並且該網路解決方案可能具有區域特定的元素。例如,如果你的雲提供商支援 type=LoadBalancer
的 Service,則負載均衡器可能只會將流量傳送到與處理給定連線的負載均衡器元素位於同一區域的 Pod。請查閱你的雲提供商的文件以獲取詳細資訊。
對於自定義或本地部署,類似考慮也適用。Service 和 Ingress 的行為,包括處理不同故障區域的方式,確實因叢集的具體設定而異。
故障恢復
設定叢集時,你可能還需要考慮如果一個區域中的所有故障區域同時離線,你的設定是否以及如何恢復服務。例如,你是否依賴於至少有一個節點能夠在區域中執行 Pod?
確保任何叢集關鍵的修復工作不依賴於叢集中至少有一個健康節點。例如:如果所有節點都不健康,你可能需要執行一個帶有特殊容忍度的修復 Job,以便修復能夠完成,使至少一個節點投入使用。
Kubernetes 沒有為此挑戰提供解決方案;然而,這是需要考慮的事情。
下一步
要了解排程器如何在叢集中放置 Pod,並遵守配置的約束,請訪問排程和驅逐。