[陳博豪 李凌]
隨著微服務技術的不斷成熟,越來越多的大中型工業互聯網企業開始采用k8s 來實現和管理應用及相關服務。k8s 作為一種全新的基于容器技術的分布式架構解決方案,具有完備的集群管理能力,提供了一個可彈性運行分布式系統的框架,可以給用戶提供服務發現和負載均衡、存儲編排、自動部署和回滾、自我修復、秘鑰與配置管理等一系列的功能。
k8s 在Node 上管理的最小運行單元是pod,它解決了傳統IT 系統中服務擴容和升級的兩大難題,將復雜的服務級別的伸縮容問題簡化為pod 副本數量的變動。k8s還具有水平自動擴展特性,通常對k8s 集群的監控主要是對業務型的Pod 等資源的監控和彈性伸縮,其依賴于監控組件提供的監控數據。k8s 集群的監控組件是其核心組件之一,可以實現對k8s 集群中的各種資源(例如pod、Node、Deployment 等)進行監控,監控項包括CPU、內存、流量、健康狀況、磁盤使用率等。監控數據可作為其他組件的基礎數據,為其他組件提供決策支持。
Pod 水平自動擴縮特性由k8 的API 資源和控制器實現。資源決定了控制器的行為,控制器會周期性地調整副本控制器或 deployment 中的副本數量,以使得類似 Pod平均 CPU 利用率、平均內存利用率這類觀測到的度量值與用戶所設定的目標值匹配。
水平自動擴展(Horizontal Pod Autoscaling,HPA)是一種自動擴展,是pod 的水平自動擴展,HPA 的操作對象是RC、RS 或Deployment 對應的Pod,根據Pod 當前系統的負載來自動水平擴容。如果系統負載超過預定值,就開始增加Pod 的個數;如果低于某個值,就自動減少Pod的個數。目前k8s 的HPA 只能根據CPU 等資源使用情況去度量系統的負載。
但并不是所有的業務系統都適用于這種常規的擴縮方法,有些應用的類型特殊,無法估計正確的業務峰值、平均值所需資源,而且不同的業務系統在不同的時段對不同的資源(CPU、內存、網絡)消耗是不同的,再加上采集服務的周期性非常密集,如最小周期是5 分鐘,出現業務峰值的頻度比較密集,常規的擴縮容方法無法滿足要求。
此時對采集任務的監控就變得尤為重要,監測采集任務池中的任務負載,把采集任務的阻塞情況也作為擴縮容的一個重要指標,利用特殊的擴縮容算法并結合pod 水平自動擴縮特性來計算擴縮容實例的個數,根據任務運行信息按需合理分配資源,能夠解決周期性業務峰值而導致的頻繁擴縮容問題,并最終能夠滿足采集業務系統的所有任務量。
當采集服務的周期非常密集,出現業務峰值的頻度比較集中的時候,使用HPA 管理一組副本擴縮時,有可能因為指標動態的變化造成副本數量頻繁的變化,有時這被稱為抖動(Thrashing),可以設置縮容冷卻時間窗口長度來緩解。但是調整這些參數時,如果延遲(冷卻)時間設置的太長,HPA 可能會不能很好的改變負載;如果延遲(冷卻)時間設置的太短,那么副本數量有可能跟以前一樣出現抖動。
所以利用k8s 的水平自動擴展特性,使用HPA 來管理副本擴縮的時候,只根據系統負載的大小即資源的使用情況來判斷是否擴縮容,容易導致頻繁擴縮帶來的抖動問題,并且調整縮容冷卻時間窗口長度又不能很好地改善負載或者沒有作用的時候,此時對資源的消耗很大而且增加了系統的開銷,采集任務的延遲可能會增大,資源分配不均又可能導致采集任務不能在周期內完成。這時就需要結合采集任務的阻塞情況來調整策略,增加采集任務監控模塊監控采集任務的負載,并要制定特殊的擴縮容算法,如圖1 所示。

圖1 HPA 資源擴縮容方法
如圖2 所示,增加采集任務監控模塊,其作用是:監控采集任務池中任務負載,計算任務總量并記錄每個任務的執行時間,計算單個采集服務實例所能執行的任務數。在采集服務周期內,認定沒有執行完以及執行時間超過采集服務周期的是阻塞任務,再根據收集到的采集服務的資源使用率,如CPU、內存的使用情況,通過這一系列條件,使用特殊的資源擴縮容算法,采集任務監控模塊會判斷是否該觸發資源擴縮容機制。

圖2 基于采集任務運行信息的資源擴縮容方法
當采集任務阻塞,并且阻塞任務超過設定閾值時,采集任務監控模塊觸發擴容機制,根據算法來調整需要擴容副本的個數;當采集任務沒有阻塞時,并且CPU、內存等使用率等系統負載低于下閾值的時候,采集任務監控模塊觸發縮容機制,根據算法來調整需要縮容副本的個數,使得既能夠滿足采集業務系統的任務量,也能夠降低任務等待延時,解決周期性業務峰值而導致的頻繁擴縮容問題,也能夠改善資源使用不飽和的情況,提升業務系統的可靠性和穩定性。
在采集服務周期內,認定沒有執行完以及執行時間超過采集服務周期的是阻塞任務,我們通過采集任務監控模塊已經統計出來采集任務池中的任務負載,即任務總數,以及計算單個采集服務實例滿負荷所能執行的任務數,還有在一個采集周期內,計算出來的阻塞任務的個數,并設定一個擴容條件的閾值threshold,即阻塞任務大于這個閾值時才擴容。根據任務隊列阻塞情況以及資源池數據指標情況(CPU、內存使用率等信息)來作為擴縮容算法的重要變量。
當沒有阻塞任務時,CPU 等使用率小于設定的下閾值時,會觸發縮容機制,騰出資源給其他的采集服務使用;而CPU 等使用率大于設定的上閾值的時候,這時普通k8s水平自動擴展特性會擴容,而本算法在這種情況下不做處理,讓資源滿負荷運轉,可以解決頻繁擴縮容所帶來的抖動。
采集任務隊列不阻塞,CPU使用率小于下閾值時縮容:

當存在阻塞任務,并且數量大于設定的擴容條件閾值的時候,這時候資源負載肯定很大,所以直接根據阻塞任務數來確定擴容的實例數,使得采集服務資源足以承受周期內的任務量。
采集任務隊列阻塞,阻塞任務數大于擴容條件閾值時擴容:

在使用k8s 自帶的水平自動擴展方法時,遇到采集周期密集、負載峰值頻率集中的情況下,服務實例數會頻繁擴縮造成抖動,既容易浪費系統資源,又容易增大系統的開銷。雖然可以設置縮容冷卻時間窗口長度來緩解抖動,但是設置的長短難以控制,并不能有效解決問題,達不到資源的合理分配,也不能改善負載峰值時任務的堆積。如在5 min 采集周期的服務下,系統負載如CPU、內存等的使用率也呈現5 min 周期的峰值變化,副本擴縮依賴負載的大小,導致服務實例數量呈周期性大幅度增減,造成劇烈的抖動。
使用新的擴縮容算法,將采集任務監控與水平自動擴展的方法結合起來,根據是否存在阻塞任務來判定是否擴縮容。沒有阻塞任務時,即使系統負載很大也不擴容,讓服務實例滿負荷運轉;當有阻塞任務時,只有在阻塞任務數超過設定閾值時才去擴容,這樣服務實例不會頻繁擴縮,減少了抖動,在集群資源有限的情況下可以充分利用資源。特殊的擴縮容算法也可以根據任務運行信息按需合理分配資源,能夠滿足采集周期內所有的采集任務,使得網絡運營數據采集能夠穩定高效地運行。在同樣5 min 采集周期的服務下,大量任務堆積使得系統負載也呈現周期性的峰值變化,新的擴縮容算法不論系統負載有多大都會讓服務實例滿負荷運轉,直到采集任務監控模塊觀察到阻塞任務超過設定的閾值才擴容,并按照阻塞任務情況來分配資源,這時副本的擴縮變緩、幅度減小并且抖動減少,使得系統資源能夠充分利用。
對于所有周期密集、負載很高、并容忍一定任務阻塞的業務場景,使用基于任務運行信息的資源擴縮容方法,會緩解k8s 的水平自動擴展特性會對副本數量頻繁擴縮而形成的抖動,讓資源分配更加合理,最終讓任務能夠及時完成。
網絡運營要求采集系統會對網元告警、性能、配置、日志等運行數據實時采集,需要及時對這些網絡運行數據進行處理,才能夠實時反應出網絡的狀態,以及是否發生異常。隨著運營商要求的提高,網絡運營數據采集的周期也會更加密集,涉及到的數據類型也會更加繁雜,使用基于采集任務運行信息的資源擴縮容方法,就能很好地應對這些采集對象多、采集時間間隔短的場景。
各大運營商都有各自的運營監控系統,在國家鼓勵企業上云的趨勢下,相繼轉為云化遷移部署,在這種特殊的環境下,IP 網關監控、傳輸網關監控等的需求也就變得愈發重要,對于這種周期內任務完成率要求高、數據量大、周期密集的監控指標數據采集的場景,結合采集任務運行信息,并根據阻塞任務的情況來制定擴縮容規則,實現資源的合理分配,讓所有采集任務都可以在各自的采集周期內完成,減少任務等待對采集的影響,能夠完成大量數據、密集周期的的采集,最終提升運營監控系統的性能和可靠性。
網絡運營要求采集系統會對網元告警、性能、配置、日志等運行數據實時采集,不管周期是否密集,業務峰值出現多么頻繁,只要對采集任務運行信息進行實時監控,把任務隊列是否阻塞作為重要條件,使用特殊的算法對資源擴縮容,能夠滿足網絡運營數據采集系統的任務量,也能夠降低任務等待延時,不僅可以解決周期性業務峰值而導致的頻繁擴縮容問題,也能夠改善資源使用不飽和的情況,提升業務系統的可靠性和穩定性。