Kubernetes以其超前的設計理念和優(yōu)秀的技術架構,在容器編排領域拔得頭籌。越來越多的公司開始在生產(chǎn)環(huán)境部署實踐 Kubernetes,在阿里巴巴和螞蟻金服 Kubernetes 已被大規(guī)模用于生產(chǎn)環(huán)境。Kubernetes的出現(xiàn)使得廣大開發(fā)同學也能運維復雜的分布式系統(tǒng),它大幅降低了容器化應用部署的門檻,但運維和管理一個生產(chǎn)級的高可用 Kubernetes 集群仍十分困難。本文將分享螞蟻金服是如何有效可靠地管理大規(guī)模 Kubernetes 集群的,并會詳細介紹集群管理系統(tǒng)核心組件的設計。 Kubernetes集群管理系統(tǒng)需要具備便捷的集群生命周期管理能力,完成集群的創(chuàng)建、升級和工作節(jié)點的管理。在大規(guī)模場景下,集群變更的可控性直接關系到集群的穩(wěn)定性,因此管理系統(tǒng)可監(jiān)控、可灰度、可回滾的能力是系統(tǒng)設計的重點之一。除此之外,超大規(guī)模集群中,節(jié)點數(shù)量已經(jīng)達到 10K 量級,節(jié)點硬件故障、組件異常等問題會常態(tài)出現(xiàn)。面向大規(guī)模集群的管理系統(tǒng)在設計之初就需要充分考慮這些異常場景,并能夠從這些異常場景中自恢復。 基于這些背景,我們設計了一個面向終態(tài)的集群管理系統(tǒng)。系統(tǒng)定時檢測集群當前狀態(tài),判斷是否與目標狀態(tài)一致,出現(xiàn)不一致時,Operators 會發(fā)起一系列操作,驅(qū)動集群達到目標狀態(tài)。這一設計參考控制理論中常見的負反饋閉環(huán)控制系統(tǒng),系統(tǒng)實現(xiàn)閉環(huán),可以有效抵御系統(tǒng)外部的干擾,在我們的場景下,干擾對應于節(jié)點軟硬件故障。如上圖,元集群是一個高可用的 Kubernetes 集群,用于管理 N 個業(yè)務集群的 Master 節(jié)點。業(yè)務集群是一個服務生產(chǎn)業(yè)務的 Kubernetes 集群。SigmaBoss 是集群管理入口,為用戶提供便捷的交互界面和可控的變更流程。 元集群中部署的 Cluster-Operator 提供了業(yè)務集群集群創(chuàng)建、刪除和升級能力,Cluster-Operator面向終態(tài)設計,當業(yè)務集群 Master 節(jié)點或組件異常時,會自動隔離并進行修復,以保證業(yè)務集群 Master 節(jié)點達到穩(wěn)定的終態(tài)。這種采用 Kubernetes 管理 Kubernetes 的方案,我們稱作 Kube on Kube 方案,簡稱 KOK 方案。業(yè)務集群中部署有 Machine-Operator 和節(jié)點故障自愈組件用于管理業(yè)務集群的工作節(jié)點,提供節(jié)點新增、刪除、升級和故障處理能力。在 Machine-Operator 提供的單節(jié)點終態(tài)保持的能力上,SigmaBoss 上構建了集群維度灰度變更和回滾能力。基于 K8S CRD,在元集群中定義了 Cluster CRD 來描述業(yè)務集群終態(tài),每個業(yè)務集群對應一個 Cluster 資源,創(chuàng)建、刪除、更新 Cluster 資源對應于實現(xiàn)業(yè)務集群創(chuàng)建、刪除和升級。Cluster-Operator watch Cluster 資源,驅(qū)動業(yè)務集群Master 組件達到 Cluster 資源描述的終態(tài)。 業(yè)務集群 Master 組件版本集中維護在 ClusterPackageVersion CRD 中,ClusterPackageVersion 資源記錄了 Master 組件(如:api-server、controller-manager、scheduler、operators 等)的鏡像、默認啟動參數(shù)等信息。Cluster 資源唯一關聯(lián)一個 ClusterPackageVersion,修改 Cluster CRD 中記錄的 ClusterPackageVersion 版本即可完成業(yè)務集群 Master 組件發(fā)布和回滾。Kubernetes集群工作節(jié)點的管理任務主要有:
- 節(jié)點系統(tǒng)配置、內(nèi)核補丁管理
- docker / kubelet 等組件安裝、升級、卸載
- 節(jié)點終態(tài)和可調(diào)度狀態(tài)管理(如關鍵 DaemonSet 部署完成后才允許開啟調(diào)度)
為實現(xiàn)上述管理任務,在業(yè)務集群中定義了 Machine CRD 來描述工作節(jié)點終態(tài),每一個工作節(jié)點對應一個 Machine 資源,通過修改 Machine 資源來管理工作節(jié)點。 MachineCRD 定義如下圖所示,spec 中描述了節(jié)點需要安裝的組件名和版本,status 中記錄有當前這個工作節(jié)點各組件安裝運行狀態(tài)。除此之外,Machine CRD 還提供了插件式終態(tài)管理能力,用于與其它節(jié)點管理Operators 協(xié)作,這部分會在后文詳細介紹。 工作節(jié)點上的組件版本管理由 MachinePackageVersion CRD 完成。MachinePackageVersion維護了每個組件的 rpm 版本、配置和安裝方法等信息。一個Machine 資源會關聯(lián) N 個不同的MachinePackageVersion,用來實現(xiàn)安裝多個組件。 在 Machine、MachinePackageVersion CRD 基礎上,設計實現(xiàn)了節(jié)點終態(tài)控制器 Machine-Operator。Machine-Operator watchMachine 資源,解析 MachinePackageVersion,在節(jié)點上執(zhí)行運維操作來驅(qū)動節(jié)點達到終態(tài),并持續(xù)守護終態(tài)。 隨著業(yè)務訴求的變化,節(jié)點管理已不再局限于安裝 docker / kubelet 等組件,我們需要實現(xiàn)如等待日志采集DaemonSet 部署完成才可以開啟調(diào)度的需求,而且這類需求變得越來越多。如果將終態(tài)統(tǒng)一交由Machine-Operator 管理,勢必會增加 Machine-Operator 與其它組件的耦合性,而且系統(tǒng)的擴展性會受到影響。因此,我們設計了一套節(jié)點終態(tài)管理的機制,來協(xié)調(diào)Machine-Operator 和其它節(jié)點運維 Operators。設計如下圖所示:全量 ReadinessGates:記錄節(jié)點可調(diào)度需要檢查的 Condition 列表ConditionConfigMap:各節(jié)點運維 Operators 終態(tài)狀態(tài)上報 ConfigMap1. 外部節(jié)點運維 Operators 檢測并上報與自己相關的子終態(tài)數(shù)據(jù)至對應的 ConditionConfigMap;2. Machine-Operator 根據(jù)標簽獲取節(jié)點相關的所有子終態(tài)Condition ConfigMap,并同步至 Machine status 的 conditions中3. Machine-Operator 根據(jù)全量 ReadinessGates 中記錄的 Condition 列表,檢查節(jié)點是否達到終態(tài),未達到終態(tài)的節(jié)點不開啟調(diào)度我們都知道物理機硬件存在一定的故障概率,隨著集群節(jié)點規(guī)模的增加,集群中會常態(tài)出現(xiàn)故障節(jié)點,如果不及時修復上線,這部分物理機的資源將會被閑置。為解決這一問題,我們設計了一套故障發(fā)現(xiàn)、隔離、修復的閉環(huán)自愈系統(tǒng)。如下圖所示,故障發(fā)現(xiàn)方面,采取 Agent 上報和監(jiān)控系統(tǒng)主動探測相結合的方式,保證了故障發(fā)現(xiàn)的實時性和可靠性(Agent上報實時性比較好,監(jiān)控系統(tǒng)主動探測可以覆蓋 Agent 異常未上報場景)。故障信息統(tǒng)一存儲于事件中心,關注集群故障的組件或系統(tǒng)都可以訂閱事件中心事件拿到這些故障信息。節(jié)點故障自愈系統(tǒng)會根據(jù)故障類型創(chuàng)建不同的維修流程,例如:硬件維系流程、系統(tǒng)重裝流程等。維修流程中優(yōu)先會隔離故障節(jié)點(暫停節(jié)點調(diào)度),然后將節(jié)點上 Pod 打上待遷移標簽來通知 PAAS 或 MigrateController 進行 Pod 遷移,完成這些前置操作后,會嘗試恢復節(jié)點(硬件維修、重裝操作系統(tǒng)等),修復成功的節(jié)點會重新開啟調(diào)度,長期未自動修復的節(jié)點由人工介入排查處理。在 Machine-Operator 提供的原子能力基礎上,系統(tǒng)中設計實現(xiàn)了集群維度的灰度變更和回滾能力。此外,為了進一步降低變更風險,Operators 在發(fā)起真實變更時都會進行風險評估,架構示意圖如下。高風險變更操作(如:刪除節(jié)點、重裝系統(tǒng))接入統(tǒng)一限流中心,限流中心維護了不同類型操作的限流策略,若觸發(fā)限流,則熔斷變更。為了評估變更過程是否正常,我們會在變更前后,對各組件進行健康檢查,組件的健康檢查雖然能夠發(fā)現(xiàn)大部分異常,但不能覆蓋所有異常場景。所以,風險評估過程中,系統(tǒng)會從事件中心、監(jiān)控系統(tǒng)中獲取集群業(yè)務指標(如:Pod創(chuàng)建成功率),如果出現(xiàn)異常指標,則自動熔斷變更。本文主要和大家分享了現(xiàn)階段螞蟻金服 Kubernetes 集群管理系統(tǒng)的核心設計,核心組件大量使用 Operator 面向終態(tài)設計模式。 未來我們會嘗試將集群規(guī)模變更切換為 Operator 面向終態(tài)設計模式,探索如何在面向終態(tài)的模式下,做到變更的可監(jiān)控、可灰度和可回滾,實現(xiàn)變更的無人值守。
|