「容器云架構(gòu)」K8s 多區(qū)域部署
背景
Kubernetes的設(shè)計(jì)使得單個(gè)Kubernetes集群可以跨多個(gè)故障區(qū)域multiple failure zones運(yùn)行,通常這些區(qū)域(zones )位于稱為區(qū)域(region)的邏輯分組中。主要的云提供商將一個(gè)區(qū)域定義為一組故障區(qū)域 failure zones(也稱為可用性區(qū)域availability zones),這些區(qū)域提供一組一致的功能:在一個(gè)區(qū)域內(nèi),每個(gè)區(qū)域提供相同的api和服務(wù)。
典型的云架構(gòu)旨在將一個(gè)區(qū)域中的故障同時(shí)損害另一個(gè)區(qū)域中的服務(wù)的可能性降至最低。
控制平面行為
所有控制平面組件都支持作為一個(gè)可交換資源池運(yùn)行,每個(gè)組件復(fù)制一個(gè)。
部署群集控制平面時(shí),請(qǐng)跨多個(gè)故障區(qū)域放置控制平面組件的副本。如果可用性是一個(gè)重要問題,請(qǐng)選擇至少三個(gè)故障區(qū)域,并跨至少三個(gè)故障區(qū)域復(fù)制每個(gè)單獨(dú)的控制平面組件(API服務(wù)器、調(diào)度器、etcd、群集控制器管理器)。如果您正在運(yùn)行一個(gè)云控制器管理器,那么您還應(yīng)該在您選擇的所有故障區(qū)域中復(fù)制它。
注意:Kubernetes不為API服務(wù)器端點(diǎn)提供跨區(qū)域彈性。您可以使用各種技術(shù)來(lái)提高集群API服務(wù)器的可用性,包括DNS循環(huán)、SRV記錄或具有運(yùn)行狀況檢查的第三方負(fù)載平衡解決方案。
節(jié)點(diǎn)行為
Kubernetes自動(dòng)將工作負(fù)載資源(如部署或狀態(tài)集)的pod分布在集群中的不同節(jié)點(diǎn)上。這種傳播有助于減少失敗的影響。
當(dāng)節(jié)點(diǎn)啟動(dòng)時(shí),每個(gè)節(jié)點(diǎn)上的kubelet會(huì)自動(dòng)向節(jié)點(diǎn)對(duì)象添加標(biāo)簽,該對(duì)象在kubernetesapi中表示特定的kubelet。這些標(biāo)簽可以包含區(qū)域信息。
如果集群跨越多個(gè)區(qū)域或區(qū)域,則可以將節(jié)點(diǎn)標(biāo)簽與Pod拓?fù)鋽U(kuò)展約束結(jié)合使用,以控制Pod如何在容錯(cuò)域(區(qū)域、區(qū)域甚至特定節(jié)點(diǎn))之間跨集群擴(kuò)展。這些提示使調(diào)度器能夠放置pod以獲得更好的預(yù)期可用性,從而降低相關(guān)故障影響整個(gè)工作負(fù)載的風(fēng)險(xiǎn)。
例如,您可以設(shè)置一個(gè)約束,以確保StatefulSet的3個(gè)副本都彼此在不同的區(qū)域中運(yùn)行,只要這是可行的。您可以聲明性地定義它,而無(wú)需顯式地定義每個(gè)工作負(fù)載使用的可用性區(qū)域。
跨區(qū)域(Zone)分布節(jié)點(diǎn)
Kubernetes的核心并不為您創(chuàng)建節(jié)點(diǎn);您需要自己創(chuàng)建節(jié)點(diǎn),或者使用集群API之類的工具代表您管理節(jié)點(diǎn)。
使用諸如clusterapi之類的工具,您可以定義作為集群的工作節(jié)點(diǎn)跨多個(gè)故障域運(yùn)行的計(jì)算機(jī)集,以及在整個(gè)區(qū)域服務(wù)中斷時(shí)自動(dòng)修復(fù)集群的規(guī)則。
Pods的手動(dòng)區(qū)域分配
可以將節(jié)點(diǎn)選擇器約束應(yīng)用于創(chuàng)建的Pod,以及工作負(fù)載資源(如部署、狀態(tài)集或作業(yè))中的Pod模板。
區(qū)域(zone)的存儲(chǔ)訪問
創(chuàng)建持久卷時(shí),PersistentVolumeLabel許可控制器會(huì)自動(dòng)向鏈接到特定區(qū)域的任何持久卷添加區(qū)域標(biāo)簽。然后,調(diào)度器通過(guò)其NoVolumeZoneConflict謂詞確保聲明給定PersistentVolume的pod只放置在與該卷相同的區(qū)域中。
您可以為PersistentVolumeClaimes指定一個(gè)StorageClass,它指定該類中的存儲(chǔ)可能使用的故障域(區(qū)域)。要了解如何配置可識(shí)別故障域或區(qū)域的StorageClass,請(qǐng)參閱允許的拓?fù)洹?/p>
網(wǎng)絡(luò)
Kubernetes本身并不包括區(qū)域感知網(wǎng)絡(luò)。您可以使用網(wǎng)絡(luò)插件來(lái)配置集群網(wǎng)絡(luò),并且該網(wǎng)絡(luò)解決方案可能具有特定于區(qū)域的元素。例如,如果您的云提供商支持type=LoadBalancer的服務(wù),那么負(fù)載平衡器可能只向運(yùn)行在與處理給定連接的負(fù)載平衡器元素所在的同一區(qū)域中的pod發(fā)送流量。有關(guān)詳細(xì)信息,請(qǐng)查看云提供商的文檔。
對(duì)于自定義或內(nèi)部部署,也需要考慮類似的問題。服務(wù)和入口行為(包括對(duì)不同故障區(qū)域的處理)確實(shí)有所不同,具體取決于集群的設(shè)置方式。
故障恢復(fù)
在設(shè)置集群時(shí),您可能還需要考慮,如果某個(gè)區(qū)域中的所有故障區(qū)域同時(shí)脫機(jī),安裝程序是否以及如何恢復(fù)服務(wù)。例如,您是否依賴于一個(gè)區(qū)域中至少有一個(gè)節(jié)點(diǎn)能夠運(yùn)行Pods?
確保任何群集關(guān)鍵修復(fù)工作都不依賴于群集中至少有一個(gè)正常節(jié)點(diǎn)。例如:如果所有節(jié)點(diǎn)都不正常,則可能需要運(yùn)行具有特殊容差的修復(fù)作業(yè),以便修復(fù)可以完成到足以使至少一個(gè)節(jié)點(diǎn)投入服務(wù)的程度。
Kubernetes并沒有回答這個(gè)挑戰(zhàn),但是,這是值得考慮的問題。