架構(gòu)設(shè)計(jì)

如上圖,元集群是一個(gè)高可用的 Kubernetes 集群,用于管理 N 個(gè)業(yè)務(wù)集群的 Master 節(jié)點(diǎn)。業(yè)務(wù)集群是一個(gè)服務(wù)生產(chǎn)業(yè)務(wù)的 Kubernetes 集群。SigmaBoss 是集群管理入口,為用戶提供便捷的交互界面和可控的變更流程。

元集群中部署的 Cluster-Operator 提供了業(yè)務(wù)集群集群創(chuàng)建、刪除和升級(jí)能力,Cluster-Operator 面向終態(tài)設(shè)計(jì),當(dāng)業(yè)務(wù)集群 Master 節(jié)點(diǎn)或組件異常時(shí),會(huì)自動(dòng)隔離并進(jìn)行修復(fù),以保證業(yè)務(wù)集群 Master 節(jié)點(diǎn)達(dá)到穩(wěn)定的終態(tài)。這種采用 Kubernetes 管理 Kubernetes 的方案,我們稱作 Kube on Kube 方案,簡(jiǎn)稱 KOK 方案。

業(yè)務(wù)集群中部署有 Machine-Operator 和節(jié)點(diǎn)故障自愈組件用于管理業(yè)務(wù)集群的工作節(jié)點(diǎn),提供節(jié)點(diǎn)新增、刪除、升級(jí)和故障處理能力。在 Machine-Operator 提供的單節(jié)點(diǎn)終態(tài)保持的能力上,SigmaBoss 上構(gòu)建了集群維度灰度變更和回滾能力。

核心組件

集群終態(tài)保持器

基于 K8S CRD,在元集群中定義了 Cluster CRD 來(lái)描述業(yè)務(wù)集群終態(tài),每個(gè)業(yè)務(wù)集群對(duì)應(yīng)一個(gè) Cluster 資源,創(chuàng)建、刪除、更新 Cluster 資源對(duì)應(yīng)于實(shí)現(xiàn)業(yè)務(wù)集群創(chuàng)建、刪除和升級(jí)。Cluster-Operator watch Cluster 資源,驅(qū)動(dòng)業(yè)務(wù)集群 Master 組件達(dá)到 Cluster 資源描述的終態(tài)。

業(yè)務(wù)集群 Master 組件版本集中維護(hù)在 ClusterPackageVersion CRD 中,ClusterPackageVersion 資源記錄了 Master 組件(如:api-server、controller-manager、scheduler、operators 等)的鏡像、默認(rèn)啟動(dòng)參數(shù)等信息。Cluster 資源唯一關(guān)聯(lián)一個(gè) ClusterPackageVersion,修改 Cluster CRD 中記錄的 ClusterPackageVersion 版本即可完成業(yè)務(wù)集群 Master 組件發(fā)布和回滾。

節(jié)點(diǎn)終態(tài)保持器

Kubernetes 集群工作節(jié)點(diǎn)的管理任務(wù)主要有:

?節(jié)點(diǎn)系統(tǒng)配置、內(nèi)核補(bǔ)丁管理

?docker / kubelet 等組件安裝、升級(jí)、卸載

?節(jié)點(diǎn)終態(tài)和可調(diào)度狀態(tài)管理(如關(guān)鍵 DaemonSet 部署完成后才允許開(kāi)啟調(diào)度)

?節(jié)點(diǎn)故障自愈

為實(shí)現(xiàn)上述管理任務(wù),在業(yè)務(wù)集群中定義了 Machine CRD 來(lái)描述工作節(jié)點(diǎn)終態(tài),每一個(gè)工作節(jié)點(diǎn)對(duì)應(yīng)一個(gè) Machine 資源,通過(guò)修改 Machine 資源來(lái)管理工作節(jié)點(diǎn)。

Machine CRD 定義如下圖所示,spec 中描述了節(jié)點(diǎn)需要安裝的組件名和版本,status 中記錄有當(dāng)前這個(gè)工作節(jié)點(diǎn)各組件安裝運(yùn)行狀態(tài)。除此之外,Machine CRD 還提供了插件式終態(tài)管理能力,用于與其它節(jié)點(diǎn)管理 Operators 協(xié)作,這部分會(huì)在后文詳細(xì)介紹。

工作節(jié)點(diǎn)上的組件版本管理由 MachinePackageVersion CRD 完成。MachinePackageVersion 維護(hù)了每個(gè)組件的 rpm 版本、配置和安裝方法等信息。一個(gè) Machine 資源會(huì)關(guān)聯(lián) N 個(gè)不同的 MachinePackageVersion,用來(lái)實(shí)現(xiàn)安裝多個(gè)組件。

在 Machine、MachinePackageVersion CRD 基礎(chǔ)上,設(shè)計(jì)實(shí)現(xiàn)了節(jié)點(diǎn)終態(tài)控制器 Machine-Operator。Machine-Operator watch Machine 資源,解析 MachinePackageVersion,在節(jié)點(diǎn)上執(zhí)行運(yùn)維操作來(lái)驅(qū)動(dòng)節(jié)點(diǎn)達(dá)到終態(tài),并持續(xù)守護(hù)終態(tài)。

節(jié)點(diǎn)終態(tài)管理

隨著業(yè)務(wù)訴求的變化,節(jié)點(diǎn)管理已不再局限于安裝 docker / kubelet 等組件,我們需要實(shí)現(xiàn)如等待日志采集 DaemonSet 部署完成才可以開(kāi)啟調(diào)度的需求,而且這類需求變得越來(lái)越多。如果將終態(tài)統(tǒng)一交由 Machine-Operator 管理,勢(shì)必會(huì)增加 Machine-Operator 與其它組件的耦合性,而且系統(tǒng)的擴(kuò)展性會(huì)受到影響。因此,我們?cè)O(shè)計(jì)了一套節(jié)點(diǎn)終態(tài)管理的機(jī)制,來(lái)協(xié)調(diào) Machine-Operator 和其它節(jié)點(diǎn)運(yùn)維 Operators。設(shè)計(jì)如下圖所示:

全量 ReadinessGates:記錄節(jié)點(diǎn)可調(diào)度需要檢查的 Condition 列表

Condition ConfigMap:各節(jié)點(diǎn)運(yùn)維 Operators 終態(tài)狀態(tài)上報(bào) ConfigMap

協(xié)作關(guān)系:

1.外部節(jié)點(diǎn)運(yùn)維 Operators 檢測(cè)并上報(bào)與自己相關(guān)的子終態(tài)數(shù)據(jù)至對(duì)應(yīng)的 Condition ConfigMap;

2.Machine-Operator 根據(jù)標(biāo)簽獲取節(jié)點(diǎn)相關(guān)的所有子終態(tài) Condition ConfigMap,并同步至 Machine status 的 conditions中

3.Machine-Operator 根據(jù)全量 ReadinessGates 中記錄的 Condition 列表,檢查節(jié)點(diǎn)是否達(dá)到終態(tài),未達(dá)到終態(tài)的節(jié)點(diǎn)不開(kāi)啟調(diào)度

節(jié)點(diǎn)故障自愈

我們都知道物理機(jī)硬件存在一定的故障概率,隨著集群節(jié)點(diǎn)規(guī)模的增加,集群中會(huì)常態(tài)出現(xiàn)故障節(jié)點(diǎn),如果不及時(shí)修復(fù)上線,這部分物理機(jī)的資源將會(huì)被閑置。

為解決這一問(wèn)題,我們?cè)O(shè)計(jì)了一套故障發(fā)現(xiàn)、隔離、修復(fù)的閉環(huán)自愈系統(tǒng)。

如下圖所示,故障發(fā)現(xiàn)方面,采取 Agent 上報(bào)和監(jiān)控系統(tǒng)主動(dòng)探測(cè)相結(jié)合的方式,保證了故障發(fā)現(xiàn)的實(shí)時(shí)性和可靠性(Agent 上報(bào)實(shí)時(shí)性比較好,監(jiān)控系統(tǒng)主動(dòng)探測(cè)可以覆蓋 Agent 異常未上報(bào)場(chǎng)景)。故障信息統(tǒng)一存儲(chǔ)于事件中心,關(guān)注集群故障的組件或系統(tǒng)都可以訂閱事件中心事件拿到這些故障信息。

節(jié)點(diǎn)故障自愈系統(tǒng)會(huì)根據(jù)故障類型創(chuàng)建不同的維修流程,例如:硬件維系流程、系統(tǒng)重裝流程等。維修流程中優(yōu)先會(huì)隔離故障節(jié)點(diǎn)(暫停節(jié)點(diǎn)調(diào)度),然后將節(jié)點(diǎn)上 Pod 打上待遷移標(biāo)簽來(lái)通知 PAAS 或 MigrateController 進(jìn)行 Pod 遷移,完成這些前置操作后,會(huì)嘗試恢復(fù)節(jié)點(diǎn)(硬件維修、重裝操作系統(tǒng)等),修復(fù)成功的節(jié)點(diǎn)會(huì)重新開(kāi)啟調(diào)度,長(zhǎng)期未自動(dòng)修復(fù)的節(jié)點(diǎn)由人工介入排查處理。

風(fēng)險(xiǎn)防范

在 Machine-Operator 提供的原子能力基礎(chǔ)上,系統(tǒng)中設(shè)計(jì)實(shí)現(xiàn)了集群維度的灰度變更和回滾能力。此外,為了進(jìn)一步降低變更風(fēng)險(xiǎn),Operators 在發(fā)起真實(shí)變更時(shí)都會(huì)進(jìn)行風(fēng)險(xiǎn)評(píng)估,架構(gòu)示意圖如下。

高風(fēng)險(xiǎn)變更操作(如:刪除節(jié)點(diǎn)、重裝系統(tǒng))接入統(tǒng)一限流中心,限流中心維護(hù)了不同類型操作的限流策略,若觸發(fā)限流,則熔斷變更。

為了評(píng)估變更過(guò)程是否正常,我們會(huì)在變更前后,對(duì)各組件進(jìn)行健康檢查,組件的健康檢查雖然能夠發(fā)現(xiàn)大部分異常,但不能覆蓋所有異常場(chǎng)景。所以,風(fēng)險(xiǎn)評(píng)估過(guò)程中,系統(tǒng)會(huì)從事件中心、監(jiān)控系統(tǒng)中獲取集群業(yè)務(wù)指標(biāo)(如:Pod創(chuàng)建成功率),如果出現(xiàn)異常指標(biāo),則自動(dòng)熔斷變更。

結(jié)束語(yǔ)

本文主要和大家分享了現(xiàn)階段螞蟻金服 Kubernetes 集群管理系統(tǒng)的核心設(shè)計(jì),核心組件大量使用 Operator 面向終態(tài)設(shè)計(jì)模式。

未來(lái)我們會(huì)嘗試將集群規(guī)模變更切換為 Operator 面向終態(tài)設(shè)計(jì)模式,探索如何在面向終態(tài)的模式下,做到變更的可監(jiān)控、可灰度和可回滾,實(shí)現(xiàn)變更的無(wú)人值守。

如果你對(duì)螞蟻金服 Kubernetes 集群感興趣,可以閱讀這篇文章:從零到破萬(wàn)節(jié)點(diǎn)!支撐618大促背后的螞蟻金服Kubernetes集群

分享到

songjy

相關(guān)推薦