Kubernetes 運(yùn)行于多可用區(qū)環(huán)境

2022-06-01 11:53 更新

背景 

Kubernetes 從設(shè)計(jì)上允許同一個(gè) Kubernetes 集群跨多個(gè)失效區(qū)來(lái)運(yùn)行, 通常這些區(qū)位于某個(gè)稱作 區(qū)域(region) 邏輯分組中。 主要的云提供商都將區(qū)域定義為一組失效區(qū)的集合(也稱作 可用區(qū)(Availability Zones)), 能夠提供一組一致的功能特性:每個(gè)區(qū)域內(nèi),各個(gè)可用區(qū)提供相同的 API 和服務(wù)。

典型的云體系結(jié)構(gòu)都會(huì)嘗試降低某個(gè)區(qū)中的失效影響到其他區(qū)中服務(wù)的概率。

控制面行為 

所有的控制面組件 都支持以一組可相互替換的資源池的形式來(lái)運(yùn)行,每個(gè)組件都有多個(gè)副本。

當(dāng)你部署集群控制面時(shí),應(yīng)將控制面組件的副本跨多個(gè)失效區(qū)來(lái)部署。 如果可用性是一個(gè)很重要的指標(biāo),應(yīng)該選擇至少三個(gè)失效區(qū),并將每個(gè) 控制面組件(API 服務(wù)器、調(diào)度器、etcd、控制器管理器)復(fù)制多個(gè)副本, 跨至少三個(gè)失效區(qū)來(lái)部署。如果你在運(yùn)行云控制器管理器,則也應(yīng)該將 該組件跨所選的三個(gè)失效區(qū)來(lái)部署。

Note:
Kubernetes 并不會(huì)為 API 服務(wù)器端點(diǎn)提供跨失效區(qū)的彈性。 你可以為集群 API 服務(wù)器使用多種技術(shù)來(lái)提升其可用性,包括使用 DNS 輪轉(zhuǎn)、SRV 記錄或者帶健康檢查的第三方負(fù)載均衡解決方案等等。

節(jié)點(diǎn)行為 

Kubernetes 自動(dòng)為負(fù)載資源(如Deployment 或 StatefulSet)) 跨集群中不同節(jié)點(diǎn)來(lái)部署其 Pods。 這種分布邏輯有助于降低失效帶來(lái)的影響。

節(jié)點(diǎn)啟動(dòng)時(shí),每個(gè)節(jié)點(diǎn)上的 kubelet 會(huì)向 Kubernetes API 中代表該 kubelet 的 Node 對(duì)象 添加 標(biāo)簽。 這些標(biāo)簽可能包含區(qū)信息。

如果你的集群跨了多個(gè)可用區(qū)或者地理區(qū)域,你可以使用節(jié)點(diǎn)標(biāo)簽,結(jié)合 Pod 拓?fù)浞植技s束 來(lái)控制如何在你的集群中多個(gè)失效域之間分布 Pods。這里的失效域可以是 地理區(qū)域、可用區(qū)甚至是特定節(jié)點(diǎn)。 這些提示信息使得調(diào)度器 能夠更好地分布 Pods,以實(shí)現(xiàn)更好的可用性,降低因?yàn)槟撤N失效給整個(gè)工作負(fù)載 帶來(lái)的風(fēng)險(xiǎn)。

例如,你可以設(shè)置一種約束,確保某個(gè) StatefulSet 中的三個(gè)副本都運(yùn)行在 不同的可用區(qū)中,只要其他條件允許。你可以通過(guò)聲明的方式來(lái)定義這種約束, 而不需要顯式指定每個(gè)工作負(fù)載使用哪些可用區(qū)。

跨多個(gè)區(qū)分布節(jié)點(diǎn)

Kubernetes 的核心邏輯并不會(huì)幫你創(chuàng)建節(jié)點(diǎn),你需要自行完成此操作,或者使用 類似 Cluster API 這類工具來(lái)替你管理節(jié)點(diǎn)。

使用類似 Cluster API 這類工具,你可以跨多個(gè)失效域來(lái)定義一組用做你的集群 工作節(jié)點(diǎn)的機(jī)器,以及當(dāng)整個(gè)區(qū)的服務(wù)出現(xiàn)中斷時(shí)如何自動(dòng)治愈集群的策略。

為 Pods 手動(dòng)指定區(qū)

你可以應(yīng)用節(jié)點(diǎn)選擇算符約束 到你所創(chuàng)建的 Pods 上,或者為 Deployment、StatefulSet 或 Job 這類工作負(fù)載資源 中的 Pod 模板設(shè)置此類約束。

跨區(qū)的存儲(chǔ)訪問(wèn)

當(dāng)創(chuàng)建持久卷時(shí),?PersistentVolumeLabel ?準(zhǔn)入控制器 會(huì)自動(dòng)向那些鏈接到特定區(qū)的 PersistentVolume 添加區(qū)標(biāo)簽。 調(diào)度器通過(guò)其 ?NoVolumeZoneConflict ?斷言確保申領(lǐng)給定 PersistentVolume 的 Pods 只會(huì) 被調(diào)度到該卷所在的可用區(qū)。

你可以為 PersistentVolumeClaim 指定StorageClass 以設(shè)置該類中的存儲(chǔ)可以使用的失效域(區(qū))。

網(wǎng)絡(luò) 

Kubernetes 自身不提供與可用區(qū)相關(guān)的聯(lián)網(wǎng)配置。 你可以使用網(wǎng)絡(luò)插件 來(lái)配置集群的聯(lián)網(wǎng),該網(wǎng)絡(luò)解決方案可能擁有一些與可用區(qū)相關(guān)的元素。 例如,如果你的云提供商支持 ?type=LoadBalancer? 的 Service,則負(fù)載均衡器 可能僅會(huì)將請(qǐng)求流量發(fā)送到運(yùn)行在負(fù)責(zé)處理給定連接的負(fù)載均衡器組件所在的區(qū)。 請(qǐng)查閱云提供商的文檔了解詳細(xì)信息。

對(duì)于自定義的或本地集群部署,也可以考慮這些因素 Service Ingress 的行為, 包括處理不同失效區(qū)的方法,在很大程度上取決于你的集群是如何搭建的。

失效恢復(fù) 

在搭建集群時(shí),你可能需要考慮當(dāng)某區(qū)域中的所有失效區(qū)都同時(shí)掉線時(shí),是否以及如何 恢復(fù)服務(wù)。例如,你是否要求在某個(gè)區(qū)中至少有一個(gè)節(jié)點(diǎn)能夠運(yùn)行 Pod? 請(qǐng)確保任何對(duì)集群很關(guān)鍵的修復(fù)工作都不要指望集群中至少有一個(gè)健康節(jié)點(diǎn)。 例如:當(dāng)所有節(jié)點(diǎn)都不健康時(shí),你可能需要運(yùn)行某個(gè)修復(fù)性的 Job, 該 Job 要設(shè)置特定的容忍度 以便修復(fù)操作能夠至少將一個(gè)節(jié)點(diǎn)恢復(fù)為可用狀態(tài)。

Kubernetes 對(duì)這類問(wèn)題沒(méi)有現(xiàn)成的解決方案;不過(guò)這也是要考慮的因素之一。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)