一、背景
B站基于k8s構建的私有云平臺已達萬級節點規模,托管了公司大部分的在線業務以及機器學習、大數據、轉碼等離線業務。在推進降本增效的過程中,我們發現業務申請的容器資源規格存在不合理的現象,通常設置的資源配額會比實際負載偏大很多。這就造成節點的cpu分配率很高,已經無法調度新容器,但是節點的實際cpu峰值利用率卻很低(如圖所示)。
這種不合理的容器規格導致整體集群資源產生了很大的浪費。面對這個問題,我們主要從兩個角度進行解決:一是利用混部技術,通過調用一些低優業務到這類機器上,實現對閑置資源的有效利用,在之前的文章《B站云原生混部技術實踐》【1】 中有詳細介紹;二是從業務容器本身出發,采用垂直彈性伸縮(Vertical Pod Autoscaler,簡稱VPA)技術,基于業務的歷史真實負載計算得到推薦的資源量,并自動調整容器資源規格。從我們的大規模實踐效果來看,VPA技術有效地釋放出了節點的空閑算力資源,滿足了新增業務的資源需求,降低了新機器的采購成本。同時,作為一種自動化調整的機制,也極大地降低了人工進行容量管理的成本。下面,我們將詳細介紹VPA技術的一些具體技術細節和實踐經驗。
二、業界現狀
VPA一般需要具備以下三種關鍵能力:
1、容器資源規格推薦?;趹玫恼鎸嵷撦d,根據特定的算法計算出容器的合理資源規格。
2、對于新創建的Pod,需要基于k8s webhook,在創建Pod對象的過程中將資源規格修改為推薦值。
3、對于已經創建的Pod,需要定時動態調整容器的資源規格。
目前,社區開源的VPA技術只支持上述1和2,存量pod如果要進行VPA,必須先驅逐,從而在重建時修改pod資源規格。很多業務不希望VPA調整資源配額時發生pod驅逐,因此業界也有部分公司選擇修改K8S源代碼來支持in-place VPA的能力,從而實現動態修改容器資源規格。K8S社區對于 in-place VPA已經有相關issue討論 【2】,預計后續的k8s版本會合入該特性。目前,我們也是選擇通過修改K8S源碼來支持in-place VPA功能,同時自研了整體VPA的控制框架和管理平臺,使得整體功能更加穩定易用。
三、VPA原理
3.1 整體架構
VPA相關CRD
VPA Generator對象:由VPA管理平臺創建的VPA策略模板對象,該對象基于label selector匹配業務應用的Pod,并創建應用維度的VPA對象。
VPA 對象:由控制器根據VPA Generator對象自動生成。主要包含Pod的匹配信息、推薦值算法相關的參數、當前的資源推薦值、容器資源的更新模式等。
VPA核心組件
VPA Generator控制器。主要用于降低VPA的管理復雜度,我們可以針對同一類的應用創建一個VPA策略模板對象VPA Generator,由控制器自動匹配這一類應用,并逐個創建出每個應用關聯的VPA對象。
VPA Recommender控制器。主要是獲取VPA對象所關聯應用的歷史負載值,計算出業務容器推薦的資源規格,并記錄到VPA對象的Status字段中。
VPA Updater控制器。當VPA對象調整資源請求量的模式為自動模式或者直接更新模式時,該控制器會把VPA對象中Status字段里記錄的資源推薦值更新到存量的業務Pod中,并立即生效。
VPA Webhook服務。當VPA對象調整資源請求量的模式為自動模式或者初始化模式時,該組件會把VPA對象中Status字段里記錄的資源推薦值更新到新創建的業務Pod中。
VPA-API服務。作為VPA管理平臺和kube-apiserver服務進行交互的中間代理,實現對K8S集群中VPA Generator對象的增刪改查操作,同時也負責匯總收集VPA相關的可觀測數據。
其他依賴模塊
Kube-apiserver服務:是K8S集群的API訪問入口。
Cadvisor服務:用于采集pod中每個容器的資源使用量指標。
Prometheus服務:用于聚合匯總Cadvisor采集的資源指標,供VPA Recommender控制器查詢業務容器的歷史資源使用量。
下面分別介紹一下VPA Generator控制器、VPA Updater控制器和VPA Recommender控制器。
3.2 VPA Generator控制器
一般業界的VPA系統只會定義VPA CRD,會給每個應用建一個VPA。但實際場景中應用數量非常多,如果逐個應用維護VPA對象會產生較大的運維成本。B站內部業務是區分服務等級的,而相同服務等級的應用通常所需的VPA推薦策略是一樣的,因此我們考慮引入VPA Generator CRD,在其中定義某一類VPA的生成策略,然后通過控制器來動態維護VPA對象的生命周期。上層不再需要關心每個應用的VPA怎么配置,而只需要為不同服務等級的應用制定好VPA策略即可。
VPA Generator控制器的主要邏輯如下:
1、VPA Generator控制器監聽管理平臺創建的策略模板VPA Generator對象,根據其中的selector信息匹配到集群中的相關pod;
2、將步驟1中匹配到的pod按所屬應用分組,分別創建應用級別的VPA對象;
3、對于已經下線的業務Pod,相關聯的VPA對象會保留一段時間,之后控制器會自動刪除這批VPA對象。
如下圖所示,VPA Generator對象的分組標簽是:level=L0,它會命中集群中所有level=L0的服務,并劃歸為一個服務群,這樣控制器就會為這個服務群的所有應用創建出關聯的VPA對象?;谶@個策略,業務SRE針對同一個應用等級的服務群,只需要維護一個VPA Generator對象,控制器可以動態創建或者刪除該服務群對應的VPA對象,減少對VPA對象的管理運維成本。
3.3 VPA Updater控制器
VPA Updater控制器會根據VPA對象中的匹配策略,過濾出VPA對象關聯的業務Pod,并結合設定的更新模式,完成業務Pod資源量的更新動作。這里更新模式包含四種:預跑模式、初始化模式、直接更新模式和自動模式。各個模式分別適用于不同的應用場景。
模式一:預跑模式,僅僅對創建的VPA對象進行推薦值計算,不進行Pod資源配額的動態更新,主要用在VPA策略預估和對照的場景。
模式二:初始化模式,在創建Pod的時候,VPA Webhook根據pod的標簽信息匹配到對應的VPA對象,然后根據VPA對象中的資源推薦值來更新Pod的資源配額。由于公有云不支持in-place Vpa能力,一般只能使用這種模式。
模式三:直接更新模式,VPA Updater控制器直接動態更新存量pod的資源配額。IDC內部k8s集群(私有云)支持了in-place Vpa能力,因此可以開啟該模式。
模式四:自動模式,這個模式相當于同時開啟了模式二和模式三,可以更新增量Pod或者存量Pod的資源配額。我們內部集群一般使用該模式。
如下圖所示,模式二代表VPA Webhook組件監聽到創建Pod的動作,然后根據VPA對象設定的模式來決定是否更新Pod的資源配額。模式三代表VPA Updater組件監聽到VPA對象中的推薦值被更新之后,會根據VPA對象設定的模式決定是否直接更新存量Pod的資源配額。通過多種更新模式,很好地支撐了私有云和公有云場景的VPA需求。
3.4 VPA Recommender控制器
VPA Recommender控制器根據VPA對象的指標策略,從Prometheus服務中獲取業務服務的歷史負載,然后結合推薦值算法計算出業務Pod的資源推薦值,并更新到VPA對象的Status中。其中可以根據VPA對象中設定的Schedule字段,約定VPA計算資源推薦值的周期,控制資源推薦值更新的節奏。
目前VPA推薦組件的推薦算法主要覆蓋了兩個場景。
場景一:自動化調整業務實例的資源request值,釋放空閑資源,提高集群資源利用率
我們引入容器資源飽和率的概念,即“容器的資源使用量/資源request”。假設當前VPA對象使用業務容器的7天資源使用量的95分位值作為歷史負載targetUsed,以及bufferFactor表示預期的資源飽和率,我們按如下公式計算得到推薦的資源值targetRequest,并更新到VPA對象的Status中??梢钥吹?,預期資源飽和率實際上決定了給容器留多少配額buffer。對于服務等級較高的應用,我們希望其峰值飽和率相對較低,例如40%,以確保其在流量突發等場景下的穩定性;對于服務等級較低的應用,我們會把預期飽和率設的高一些,雖然犧牲了一定的穩定性,但是可以節省更多的配額資源。
在計算推薦值targetRequest時,需要約束推薦值的邊界值,一般在生產環境中推薦下限MinAllowed默認為0.1C或者0.1G,推薦上限值MaxAllowed=資源的limit值-資源預留值,這樣保證業務容器的推薦資源值合理有效。
場景二:業務Pod發生OOM事件,自動調整資源的limit值,提高運維效率
業務容器因為資源評估不準確,內存的limit值設置的較低而觸發OOM事件,如果不及時調整limit值,業務容器會頻繁OOM重啟。針對這個現象,VPA Recommender控制器可以實時捕捉到Pod的OOM事件,并利用下面的公式評估出新的內存limit值。方式是根據最近內存使用量memoryUsed、擴容因子oomFactor以及發生內存泄漏的次數oomCount,計算出新的內存limit值,保證重建的Pod不會頻繁發生OOM事件。
四、VPA管理平臺
VPA管理平臺基于Paas層的VPA技術,實現對集群資源的自動化治理能力。該平臺主要負責VPA策略調優,VPA策略避讓,VPA效果分析以及VPA異常檢測等功能,下圖展示了VPA管理平臺的功能矩陣。
VPA策略調優,主要包含業務容器資源指標管理,維護VPA策略模板以及VPA策略預估和對照分析。
VPA策略避讓,主要用于在壓測、活動等場景中臨時關閉某些應用的VPA策略。
VPA效果分析,主要用于VPA策略的數據運營和分析工作,著重統計了資源的覆蓋率,VPA調整前后的資源量以及調整記錄。
VPA異常檢測,主要用來監控VPA策略的一些異常行為,比如調整業務容器資源發生失敗,單個應用命中了多個VPA策略等異常事件。
4.1 VPA策略管理
業務容器資源指標
資源指標用于計算業務容器的歷史負載情況,一般約定容器前7天資源使用量的95分位值(指標名字:app_cpu_usage_7day_p95)作為VPA策略中的指標策略,同時根據當前策略的調整效果可以靈活變更指標策略。
VPA策略模板
VPA策略模板主要是定義了VPA Generator對象的核心屬性,比如匹配的應用等級、自動擴縮的執行周期、資源推薦值上下限值、指標策略以及預期資源飽和率。平臺可以根據VPA的策略模板在K8s集群中創建出VPA Generater對象。
VPA的預跑和對照能力
基于VPA對象的預跑模式,平臺可以下發預跑的VPA策略,用于分析該策略的效果是否符合預期,確保完全符合預期后再下發正式的VPA策略。對于已經生效的VPA策略,我們也可以下發一個預跑模式的VPA策略作為對照組,精細化對比分析VPA調整效果,最終選取出最優的VPA策略。
4.2 VPA策略避讓
在生產環境中,存在部分場景需要臨時關閉某些應用的VPA策略。例如業務經常會針對大型活動進行提前壓測,在壓測期間,業務流量比平時高出多倍,相應的業務容器的資源負載也會增加不少。此時VPA如果繼續按歷史峰值來計算推薦值,會造成資源池的分配率突增。因此,VPA管理平臺聯動壓測平臺,支持了策略避讓的能力,可以指定具體的應用以及避讓的時間窗口。
4.3 VPA效果分析
VPA效果分析主要記錄了一些關鍵的運營數據,可用于評估VPA策略是否符合預期。運營數據包含以下幾個關鍵指標:覆蓋的應用數量、覆蓋的資源量以及資源擴縮記錄等。
VPA策略覆蓋的應用數量,下圖記錄了VPA策略命中應用數量的趨勢圖,其中區分了VPA可以調整的應用數量和不可調整的應用數量
VPA策略覆蓋的資源量(以cpu為例),下圖記錄了VPA策略命中的所有應用占用資源請求量的趨勢圖(即覆蓋cpu容量),其中包含VPA策略預估調整之后應用所占cpu容量和不可被調整的cpu容量。通過趨勢圖的對比可以看出該VPA策略預估應用被調整后所占cpu容量和覆蓋cpu容量比較接近,說明資源調整的比較充分。
VPA策略調整記錄明細,記錄了VPA策略命中的每個應用擴縮資源請求量的情況。其中包含應用資源調整前后的容量和變化量,以及該策略覆蓋的應用數,整體釋放的空閑資源容量。
資源的飽和度指標,記錄了業務服務的資源飽和度(即資源使用量/資源請求量)的變化趨勢圖。VPA就是根據預期的資源飽和度進行資源推薦值計算的,因此我們根據服務的實際資源飽和率趨勢圖,可以有效地評估VPA的整體調整效果。
4.4 VPA異常檢測
VPA異常檢測主要是通過對VPA核心組件錯誤日志、錯誤事件的自動分析以及定期對關鍵指標的巡檢來實現。例如VPA強依賴于監控系統的可用性,如果VPA Recommender控制器獲取容器歷史指標的錯誤日志頻率超過了閾值,值班同學就會收到告警。此外,系統底層也記錄了非常詳細的應用資源使用率數據、VPA調整明細數據等,基于這些數據,VPA管理平臺可以靈活地自定義一些巡檢規則,例如VPA策略命中的應用是否能達到預期的峰值飽和率、VPA調整失敗率是否高于閾值等。這一系列的異常檢測和報警手段,使得我們能快速感知到VPA系統存在的潛在風險并及時介入處理。
五、基于VPA的集群資源治理
集群容量管理是一個逐步優化的過程,有了這套VPA系統之后,我們仍然需要持續地優化VPA策略,以及治理業務方的一些不合理的資源配置。
1、VPA存在一些無法生效的場景,VPA管理平臺會把這部分問題記錄下來,便于制定優化資源調整的策略。比如某些低服務等級的應用,其Pod Qos等級卻是guaranteed,此時VPA是無法調整業務容器的資源請求量的。對于這類問題,我們會梳理出應用列表,找業務服務的負責人進行溝通并修改配置。當然對于新增應用,我們也會在應用創建時增加一些預檢措施,提前規避此類問題。
2、優化業務容器指標。我們一開始采用前一天的99分位值作為歷史負載來計算推薦值,忽略了周末的流量高峰對第二天推薦值的影響,導致資源推薦值波動比較大。替換為前七天的95分位值作為歷史負載計算推薦值之后,整體推薦值變得平穩很多。
3、精細化配置VPA策略的預期飽和率,不同保障等級的應用期望飽和率不盡相同。例如,對于多活場景下的應用,保證VPA對象的資源飽和率設置低于50%,確保單機房故障之后,多活機房可以承載全部流量。對于非多活場景下的非高保障的應用,VPA對象的資源飽和率設置為70%~80%,從而減少資源浪費。
六、相關收益
基于上述VPA技術,我們較好地解決了IDC以及公有云集群中的容器規格不合理問題,從而在存量機器中釋放出了大量閑置資源。在測試集群中,整體釋放了約60%的cpu容量空間以及30%的內存容量空間;在生產集群中,釋放了約30%的cpu容量空間,累計節省了超千臺機器的采購成本。
七、總結與展望
本文介紹了B站云平臺垂直彈性伸縮(VPA)的技術實踐,主要涉及VPA的核心控制器邏輯,包括策略生成模板、推薦值計算、推薦值更新模式等。同時介紹了VPA管理平臺的VPA策略調優、VPA策略避讓、VPA效果分析以及VPA異常檢測等功能。我們充分結合了實際的業務場景,將VPA技術產品化并推廣落地。在未來的VPA技術迭代過程中,我們會結合應用畫像、算力標準化等技術能力,制定精細化的VPA策略,進一步助力降本增效。
參考資料:
[1] https://mp.weixin.qq.com/s/pPEkfrLm0XEpgMU1KjiD4A
[2] https://github.com/kubernetes/enhancements/issues/1287
本期作者
許龍
嗶哩嗶哩資深開發工程師
崔超杰
嗶哩嗶哩高級開發工程師
張鶴
嗶哩嗶哩資深SRE工程師