[陳博豪 李凌]
隨著微服務(wù)技術(shù)的不斷成熟,越來(lái)越多的大中型工業(yè)互聯(lián)網(wǎng)企業(yè)開(kāi)始采用k8s 來(lái)實(shí)現(xiàn)和管理應(yīng)用及相關(guān)服務(wù)。k8s 作為一種全新的基于容器技術(shù)的分布式架構(gòu)解決方案,具有完備的集群管理能力,提供了一個(gè)可彈性運(yùn)行分布式系統(tǒng)的框架,可以給用戶提供服務(wù)發(fā)現(xiàn)和負(fù)載均衡、存儲(chǔ)編排、自動(dòng)部署和回滾、自我修復(fù)、秘鑰與配置管理等一系列的功能。
k8s 在Node 上管理的最小運(yùn)行單元是pod,它解決了傳統(tǒng)IT 系統(tǒng)中服務(wù)擴(kuò)容和升級(jí)的兩大難題,將復(fù)雜的服務(wù)級(jí)別的伸縮容問(wèn)題簡(jiǎn)化為pod 副本數(shù)量的變動(dòng)。k8s還具有水平自動(dòng)擴(kuò)展特性,通常對(duì)k8s 集群的監(jiān)控主要是對(duì)業(yè)務(wù)型的Pod 等資源的監(jiān)控和彈性伸縮,其依賴于監(jiān)控組件提供的監(jiān)控?cái)?shù)據(jù)。k8s 集群的監(jiān)控組件是其核心組件之一,可以實(shí)現(xiàn)對(duì)k8s 集群中的各種資源(例如pod、Node、Deployment 等)進(jìn)行監(jiān)控,監(jiān)控項(xiàng)包括CPU、內(nèi)存、流量、健康狀況、磁盤使用率等。監(jiān)控?cái)?shù)據(jù)可作為其他組件的基礎(chǔ)數(shù)據(jù),為其他組件提供決策支持。
Pod 水平自動(dòng)擴(kuò)縮特性由k8 的API 資源和控制器實(shí)現(xiàn)。資源決定了控制器的行為,控制器會(huì)周期性地調(diào)整副本控制器或 deployment 中的副本數(shù)量,以使得類似 Pod平均 CPU 利用率、平均內(nèi)存利用率這類觀測(cè)到的度量值與用戶所設(shè)定的目標(biāo)值匹配。
水平自動(dòng)擴(kuò)展(Horizontal Pod Autoscaling,HPA)是一種自動(dòng)擴(kuò)展,是pod 的水平自動(dòng)擴(kuò)展,HPA 的操作對(duì)象是RC、RS 或Deployment 對(duì)應(yīng)的Pod,根據(jù)Pod 當(dāng)前系統(tǒng)的負(fù)載來(lái)自動(dòng)水平擴(kuò)容。如果系統(tǒng)負(fù)載超過(guò)預(yù)定值,就開(kāi)始增加Pod 的個(gè)數(shù);如果低于某個(gè)值,就自動(dòng)減少Pod的個(gè)數(shù)。目前k8s 的HPA 只能根據(jù)CPU 等資源使用情況去度量系統(tǒng)的負(fù)載。
但并不是所有的業(yè)務(wù)系統(tǒng)都適用于這種常規(guī)的擴(kuò)縮方法,有些應(yīng)用的類型特殊,無(wú)法估計(jì)正確的業(yè)務(wù)峰值、平均值所需資源,而且不同的業(yè)務(wù)系統(tǒng)在不同的時(shí)段對(duì)不同的資源(CPU、內(nèi)存、網(wǎng)絡(luò))消耗是不同的,再加上采集服務(wù)的周期性非常密集,如最小周期是5 分鐘,出現(xiàn)業(yè)務(wù)峰值的頻度比較密集,常規(guī)的擴(kuò)縮容方法無(wú)法滿足要求。
此時(shí)對(duì)采集任務(wù)的監(jiān)控就變得尤為重要,監(jiān)測(cè)采集任務(wù)池中的任務(wù)負(fù)載,把采集任務(wù)的阻塞情況也作為擴(kuò)縮容的一個(gè)重要指標(biāo),利用特殊的擴(kuò)縮容算法并結(jié)合pod 水平自動(dòng)擴(kuò)縮特性來(lái)計(jì)算擴(kuò)縮容實(shí)例的個(gè)數(shù),根據(jù)任務(wù)運(yùn)行信息按需合理分配資源,能夠解決周期性業(yè)務(wù)峰值而導(dǎo)致的頻繁擴(kuò)縮容問(wèn)題,并最終能夠滿足采集業(yè)務(wù)系統(tǒng)的所有任務(wù)量。
當(dāng)采集服務(wù)的周期非常密集,出現(xiàn)業(yè)務(wù)峰值的頻度比較集中的時(shí)候,使用HPA 管理一組副本擴(kuò)縮時(shí),有可能因?yàn)橹笜?biāo)動(dòng)態(tài)的變化造成副本數(shù)量頻繁的變化,有時(shí)這被稱為抖動(dòng)(Thrashing),可以設(shè)置縮容冷卻時(shí)間窗口長(zhǎng)度來(lái)緩解。但是調(diào)整這些參數(shù)時(shí),如果延遲(冷卻)時(shí)間設(shè)置的太長(zhǎng),HPA 可能會(huì)不能很好的改變負(fù)載;如果延遲(冷卻)時(shí)間設(shè)置的太短,那么副本數(shù)量有可能跟以前一樣出現(xiàn)抖動(dòng)。
所以利用k8s 的水平自動(dòng)擴(kuò)展特性,使用HPA 來(lái)管理副本擴(kuò)縮的時(shí)候,只根據(jù)系統(tǒng)負(fù)載的大小即資源的使用情況來(lái)判斷是否擴(kuò)縮容,容易導(dǎo)致頻繁擴(kuò)縮帶來(lái)的抖動(dòng)問(wèn)題,并且調(diào)整縮容冷卻時(shí)間窗口長(zhǎng)度又不能很好地改善負(fù)載或者沒(méi)有作用的時(shí)候,此時(shí)對(duì)資源的消耗很大而且增加了系統(tǒng)的開(kāi)銷,采集任務(wù)的延遲可能會(huì)增大,資源分配不均又可能導(dǎo)致采集任務(wù)不能在周期內(nèi)完成。這時(shí)就需要結(jié)合采集任務(wù)的阻塞情況來(lái)調(diào)整策略,增加采集任務(wù)監(jiān)控模塊監(jiān)控采集任務(wù)的負(fù)載,并要制定特殊的擴(kuò)縮容算法,如圖1 所示。
圖1 HPA 資源擴(kuò)縮容方法
如圖2 所示,增加采集任務(wù)監(jiān)控模塊,其作用是:監(jiān)控采集任務(wù)池中任務(wù)負(fù)載,計(jì)算任務(wù)總量并記錄每個(gè)任務(wù)的執(zhí)行時(shí)間,計(jì)算單個(gè)采集服務(wù)實(shí)例所能執(zhí)行的任務(wù)數(shù)。在采集服務(wù)周期內(nèi),認(rèn)定沒(méi)有執(zhí)行完以及執(zhí)行時(shí)間超過(guò)采集服務(wù)周期的是阻塞任務(wù),再根據(jù)收集到的采集服務(wù)的資源使用率,如CPU、內(nèi)存的使用情況,通過(guò)這一系列條件,使用特殊的資源擴(kuò)縮容算法,采集任務(wù)監(jiān)控模塊會(huì)判斷是否該觸發(fā)資源擴(kuò)縮容機(jī)制。
圖2 基于采集任務(wù)運(yùn)行信息的資源擴(kuò)縮容方法
當(dāng)采集任務(wù)阻塞,并且阻塞任務(wù)超過(guò)設(shè)定閾值時(shí),采集任務(wù)監(jiān)控模塊觸發(fā)擴(kuò)容機(jī)制,根據(jù)算法來(lái)調(diào)整需要擴(kuò)容副本的個(gè)數(shù);當(dāng)采集任務(wù)沒(méi)有阻塞時(shí),并且CPU、內(nèi)存等使用率等系統(tǒng)負(fù)載低于下閾值的時(shí)候,采集任務(wù)監(jiān)控模塊觸發(fā)縮容機(jī)制,根據(jù)算法來(lái)調(diào)整需要縮容副本的個(gè)數(shù),使得既能夠滿足采集業(yè)務(wù)系統(tǒng)的任務(wù)量,也能夠降低任務(wù)等待延時(shí),解決周期性業(yè)務(wù)峰值而導(dǎo)致的頻繁擴(kuò)縮容問(wèn)題,也能夠改善資源使用不飽和的情況,提升業(yè)務(wù)系統(tǒng)的可靠性和穩(wěn)定性。
在采集服務(wù)周期內(nèi),認(rèn)定沒(méi)有執(zhí)行完以及執(zhí)行時(shí)間超過(guò)采集服務(wù)周期的是阻塞任務(wù),我們通過(guò)采集任務(wù)監(jiān)控模塊已經(jīng)統(tǒng)計(jì)出來(lái)采集任務(wù)池中的任務(wù)負(fù)載,即任務(wù)總數(shù),以及計(jì)算單個(gè)采集服務(wù)實(shí)例滿負(fù)荷所能執(zhí)行的任務(wù)數(shù),還有在一個(gè)采集周期內(nèi),計(jì)算出來(lái)的阻塞任務(wù)的個(gè)數(shù),并設(shè)定一個(gè)擴(kuò)容條件的閾值threshold,即阻塞任務(wù)大于這個(gè)閾值時(shí)才擴(kuò)容。根據(jù)任務(wù)隊(duì)列阻塞情況以及資源池?cái)?shù)據(jù)指標(biāo)情況(CPU、內(nèi)存使用率等信息)來(lái)作為擴(kuò)縮容算法的重要變量。
當(dāng)沒(méi)有阻塞任務(wù)時(shí),CPU 等使用率小于設(shè)定的下閾值時(shí),會(huì)觸發(fā)縮容機(jī)制,騰出資源給其他的采集服務(wù)使用;而CPU 等使用率大于設(shè)定的上閾值的時(shí)候,這時(shí)普通k8s水平自動(dòng)擴(kuò)展特性會(huì)擴(kuò)容,而本算法在這種情況下不做處理,讓資源滿負(fù)荷運(yùn)轉(zhuǎn),可以解決頻繁擴(kuò)縮容所帶來(lái)的抖動(dòng)。
采集任務(wù)隊(duì)列不阻塞,CPU使用率小于下閾值時(shí)縮容:
當(dāng)存在阻塞任務(wù),并且數(shù)量大于設(shè)定的擴(kuò)容條件閾值的時(shí)候,這時(shí)候資源負(fù)載肯定很大,所以直接根據(jù)阻塞任務(wù)數(shù)來(lái)確定擴(kuò)容的實(shí)例數(shù),使得采集服務(wù)資源足以承受周期內(nèi)的任務(wù)量。
采集任務(wù)隊(duì)列阻塞,阻塞任務(wù)數(shù)大于擴(kuò)容條件閾值時(shí)擴(kuò)容:
在使用k8s 自帶的水平自動(dòng)擴(kuò)展方法時(shí),遇到采集周期密集、負(fù)載峰值頻率集中的情況下,服務(wù)實(shí)例數(shù)會(huì)頻繁擴(kuò)縮造成抖動(dòng),既容易浪費(fèi)系統(tǒng)資源,又容易增大系統(tǒng)的開(kāi)銷。雖然可以設(shè)置縮容冷卻時(shí)間窗口長(zhǎng)度來(lái)緩解抖動(dòng),但是設(shè)置的長(zhǎng)短難以控制,并不能有效解決問(wèn)題,達(dá)不到資源的合理分配,也不能改善負(fù)載峰值時(shí)任務(wù)的堆積。如在5 min 采集周期的服務(wù)下,系統(tǒng)負(fù)載如CPU、內(nèi)存等的使用率也呈現(xiàn)5 min 周期的峰值變化,副本擴(kuò)縮依賴負(fù)載的大小,導(dǎo)致服務(wù)實(shí)例數(shù)量呈周期性大幅度增減,造成劇烈的抖動(dòng)。
使用新的擴(kuò)縮容算法,將采集任務(wù)監(jiān)控與水平自動(dòng)擴(kuò)展的方法結(jié)合起來(lái),根據(jù)是否存在阻塞任務(wù)來(lái)判定是否擴(kuò)縮容。沒(méi)有阻塞任務(wù)時(shí),即使系統(tǒng)負(fù)載很大也不擴(kuò)容,讓服務(wù)實(shí)例滿負(fù)荷運(yùn)轉(zhuǎn);當(dāng)有阻塞任務(wù)時(shí),只有在阻塞任務(wù)數(shù)超過(guò)設(shè)定閾值時(shí)才去擴(kuò)容,這樣服務(wù)實(shí)例不會(huì)頻繁擴(kuò)縮,減少了抖動(dòng),在集群資源有限的情況下可以充分利用資源。特殊的擴(kuò)縮容算法也可以根據(jù)任務(wù)運(yùn)行信息按需合理分配資源,能夠滿足采集周期內(nèi)所有的采集任務(wù),使得網(wǎng)絡(luò)運(yùn)營(yíng)數(shù)據(jù)采集能夠穩(wěn)定高效地運(yùn)行。在同樣5 min 采集周期的服務(wù)下,大量任務(wù)堆積使得系統(tǒng)負(fù)載也呈現(xiàn)周期性的峰值變化,新的擴(kuò)縮容算法不論系統(tǒng)負(fù)載有多大都會(huì)讓服務(wù)實(shí)例滿負(fù)荷運(yùn)轉(zhuǎn),直到采集任務(wù)監(jiān)控模塊觀察到阻塞任務(wù)超過(guò)設(shè)定的閾值才擴(kuò)容,并按照阻塞任務(wù)情況來(lái)分配資源,這時(shí)副本的擴(kuò)縮變緩、幅度減小并且抖動(dòng)減少,使得系統(tǒng)資源能夠充分利用。
對(duì)于所有周期密集、負(fù)載很高、并容忍一定任務(wù)阻塞的業(yè)務(wù)場(chǎng)景,使用基于任務(wù)運(yùn)行信息的資源擴(kuò)縮容方法,會(huì)緩解k8s 的水平自動(dòng)擴(kuò)展特性會(huì)對(duì)副本數(shù)量頻繁擴(kuò)縮而形成的抖動(dòng),讓資源分配更加合理,最終讓任務(wù)能夠及時(shí)完成。
網(wǎng)絡(luò)運(yùn)營(yíng)要求采集系統(tǒng)會(huì)對(duì)網(wǎng)元告警、性能、配置、日志等運(yùn)行數(shù)據(jù)實(shí)時(shí)采集,需要及時(shí)對(duì)這些網(wǎng)絡(luò)運(yùn)行數(shù)據(jù)進(jìn)行處理,才能夠?qū)崟r(shí)反應(yīng)出網(wǎng)絡(luò)的狀態(tài),以及是否發(fā)生異常。隨著運(yùn)營(yíng)商要求的提高,網(wǎng)絡(luò)運(yùn)營(yíng)數(shù)據(jù)采集的周期也會(huì)更加密集,涉及到的數(shù)據(jù)類型也會(huì)更加繁雜,使用基于采集任務(wù)運(yùn)行信息的資源擴(kuò)縮容方法,就能很好地應(yīng)對(duì)這些采集對(duì)象多、采集時(shí)間間隔短的場(chǎng)景。
各大運(yùn)營(yíng)商都有各自的運(yùn)營(yíng)監(jiān)控系統(tǒng),在國(guó)家鼓勵(lì)企業(yè)上云的趨勢(shì)下,相繼轉(zhuǎn)為云化遷移部署,在這種特殊的環(huán)境下,IP 網(wǎng)關(guān)監(jiān)控、傳輸網(wǎng)關(guān)監(jiān)控等的需求也就變得愈發(fā)重要,對(duì)于這種周期內(nèi)任務(wù)完成率要求高、數(shù)據(jù)量大、周期密集的監(jiān)控指標(biāo)數(shù)據(jù)采集的場(chǎng)景,結(jié)合采集任務(wù)運(yùn)行信息,并根據(jù)阻塞任務(wù)的情況來(lái)制定擴(kuò)縮容規(guī)則,實(shí)現(xiàn)資源的合理分配,讓所有采集任務(wù)都可以在各自的采集周期內(nèi)完成,減少任務(wù)等待對(duì)采集的影響,能夠完成大量數(shù)據(jù)、密集周期的的采集,最終提升運(yùn)營(yíng)監(jiān)控系統(tǒng)的性能和可靠性。
網(wǎng)絡(luò)運(yùn)營(yíng)要求采集系統(tǒng)會(huì)對(duì)網(wǎng)元告警、性能、配置、日志等運(yùn)行數(shù)據(jù)實(shí)時(shí)采集,不管周期是否密集,業(yè)務(wù)峰值出現(xiàn)多么頻繁,只要對(duì)采集任務(wù)運(yùn)行信息進(jìn)行實(shí)時(shí)監(jiān)控,把任務(wù)隊(duì)列是否阻塞作為重要條件,使用特殊的算法對(duì)資源擴(kuò)縮容,能夠滿足網(wǎng)絡(luò)運(yùn)營(yíng)數(shù)據(jù)采集系統(tǒng)的任務(wù)量,也能夠降低任務(wù)等待延時(shí),不僅可以解決周期性業(yè)務(wù)峰值而導(dǎo)致的頻繁擴(kuò)縮容問(wèn)題,也能夠改善資源使用不飽和的情況,提升業(yè)務(wù)系統(tǒng)的可靠性和穩(wěn)定性。