不卡av在线播放_欧美成人AU在线看_亚洲一区二区 视频_五月天亚洲无码伊人

當(dāng)前位置:文章中心>新聞快遞
公告通知 新聞快遞 技術(shù)教程 產(chǎn)品展示

基于K8S,云原生架構(gòu)的成本優(yōu)化指南

發(fā)布時間:2022-04-07 點擊數(shù):750

貨拉拉  技術(shù)中心  核心基礎(chǔ)設(shè)施部

架構(gòu)師

  • 在貨拉拉主導(dǎo)了Kubernetes從0到1落地全過程,致力于探索符合貨拉拉特點的云原生之道。

今天的分享主要包含以下五個方面的內(nèi)容:

一、貨拉拉的基本情況介紹

二、基于K8S的成本優(yōu)化手段

三、符合貨拉拉特點的成本優(yōu)化路線

四、競價實例成本優(yōu)化實踐

五、定時擴縮容成本優(yōu)化實踐

一、貨拉拉的基本情況介紹

在探討成 本優(yōu)化 之前 ,我們 先來 看看 貨拉拉 的基 本情 況,讓 大家 對貨拉拉有一個初步的認(rèn)識。

編輯搜圖

  • 貨拉拉的生產(chǎn)環(huán)境是100%跑在公有云上的,所以我們的成本優(yōu)化也是針對公有云。

  • 貨拉拉是一間全球化的互聯(lián)網(wǎng)公司,我們的業(yè)務(wù)遍布世界各地,在新加坡、印度、拉美和國內(nèi)都有集群,所以我們必定會有多個集群跑在不同的云廠商上,這就決定了我們的所有方案都必須是通用的,不綁定任何云廠商的。

  • 貨拉拉的流量比較規(guī)律,高峰低谷也比較明顯,貨運行業(yè)一般沒有什么突發(fā)事件導(dǎo)致流量突增,不像微博這種服務(wù),某個明星突然丟出一個瓜就引來一大波吃瓜群眾,導(dǎo)致流量突增。同時,同城貨運是個日出而作、日落而息的行業(yè),所以白天高峰期比較穩(wěn)定,晚上低峰期流量也會降到很低,這樣的流量特點可以使我們通過簡單的預(yù)測算法就達到較好的預(yù)測效果,同時低峰期的成本優(yōu)化也將會是我們的優(yōu)化重點。

  • 貨拉拉也會有大量的大數(shù)據(jù)離線任務(wù),大數(shù)據(jù)的離線任務(wù)占了我們公司大概一半的計算資源,并且高峰期正好是業(yè)務(wù)的低峰期,所以如何通過離在線的混合部署提高整體資源利用率也是我們的優(yōu)化方向之一。

二、基于K8S的成本優(yōu)化手段

講完貨拉拉的基本情況,我們再來看一下云原生時代下,一般有哪些成本優(yōu)化手段,我把主流的成本優(yōu)化手段分成四類:

  • 私有云的服務(wù)器成本優(yōu)化

  • 公有云的服務(wù)器成本優(yōu)化

  • 服務(wù)器利用率優(yōu)化

  • 服務(wù)性能優(yōu)化

由于貨拉拉是100%跑在公有云上,所以我們本次不討論私有云方面的優(yōu)化。而服務(wù)性能優(yōu)化是非常個性化的優(yōu)化,所以也不在我們這次討論范圍內(nèi),我們這次主要討論公有云的服務(wù)器成本優(yōu)化和服務(wù)器利用率優(yōu)化。

1、公有云的服務(wù)器成本優(yōu)化

編輯搜圖

所謂公有云的服務(wù)器成本優(yōu)化,其實就是研究如何在保證滿足公司實際需求的前提下,以盡可能低的價格買到服務(wù)器實例。

公有云的服務(wù)器,一般有三種優(yōu)惠模式:

  • 包年包月: 按固定周期購買一臺服務(wù)器,這種模式穩(wěn)定性高,價格實惠,但是彈性不足,特別是晚上想縮容根本縮不動。

  • 節(jié)省計劃: 這種模式其實就是通過承諾每小時最低消費換取折扣,穩(wěn)定性有保障,服務(wù)器也可以隨意伸縮變換,但是每小時的總消費不能低于承諾消費,一般來講公司都會按最低需求購買。

  • 競價實例: 競價實例就是云廠商將閑置的實例通過固定折扣或競價的方式出售,折扣一般能到一折或兩折,競價實例有最便宜的價格以及不輸按需實例的靈活性,但是不穩(wěn)定,隨時有被回收的風(fēng)險,使用這種實例對公司的技術(shù)能力和服務(wù)質(zhì)量都有較高要求。

2、服務(wù)器利用率優(yōu)化

下面我們再來看看提升服務(wù)器利用率的一些常用優(yōu)化手段。

編輯搜圖

1)合理request/limit

如何科學(xué)合理地配置request/limit是每個公司使用k8s都會遇到的問題,request調(diào)整太大節(jié)點利用率低,調(diào)整太小服務(wù)容易OOM或者被驅(qū)逐。一般來講優(yōu)化方式分兩步,第一步是根據(jù)應(yīng)用畫像和過往負(fù)載設(shè)置一個初始值,第二步是建立巡檢機制定期巡檢,根據(jù)實際負(fù)載和策略動態(tài)調(diào)整request/limit配置。

2)HPA 

水平POD自動擴縮容,提前配置好指標(biāo)和閾值,當(dāng)指定指標(biāo)超過閾值時自動擴容,低于閾值時自動縮容,比如CPU高于35%就擴容。HPA在應(yīng)對突發(fā)流量時很不錯,但是HPA的擴容有一定的滯后性,如果負(fù)載增長過快,可能會出現(xiàn)來不及擴容的情況,導(dǎo)致短時間內(nèi)故障或雪崩。

3)CronHPA 

定時水平擴縮容,這種很容易理解,設(shè)置時間點和副本數(shù),到擴容時間點就擴容,到縮容時間點就縮容,適用于可預(yù)期或計劃內(nèi)的場景。

4)智能調(diào)度 

智能調(diào)度是指根據(jù)公司實際需求增強調(diào)度器。k8s默認(rèn)的調(diào)度器比較簡單,但一般不能完全符合公司需求,并且有較大的優(yōu)化空間,例如實際負(fù)載感知、權(quán)重計算增加更多維度、磁盤GPU、優(yōu)化堆疊策略等,通過優(yōu)化更符合公司實際情況的調(diào)度算法,可以有效地提升節(jié)點資源利用率。

5)在離線混合部署 

離在線混合部署是利用離線任務(wù)可以中斷以及高峰期與在線服務(wù)相反的特點,充分利用服務(wù)器算力的一種方式。由于離線任務(wù)一般是在晚上運行,如果將離線任務(wù)和在線服務(wù)整合進一個k8s集群,那剛好可以彌補在線服務(wù)低峰期時的資源浪費,同時,如果離線任務(wù)可以支持隨時中斷,那通過自動避讓以及資源隔離等手段,還可以實現(xiàn)在高峰期利用空閑資源運行離線任務(wù),榨干服務(wù)器最后一滴性能,但是這項能力在大幅度提升服務(wù)器利用率的情況下,也帶來了巨大的技術(shù)挑戰(zhàn)。

三、符合貨拉拉特點的成本優(yōu)化路線

通過結(jié)合上面說的業(yè)界最佳實踐和貨拉拉的實際情況,我們探索出了以下這條貨拉拉成本優(yōu)化演進路線。

編輯搜圖

首先我們通過節(jié)省計劃以相對優(yōu)惠的價格保證了貨拉拉的基礎(chǔ)算力和穩(wěn)定性,然后使用價格低廉且伸縮靈活的競價實例來提供彈性伸縮的算力,當(dāng)然我們也做好了準(zhǔn)備面對競價實例帶來的穩(wěn)定性挑戰(zhàn),到此基本上解決了服務(wù)器價格的優(yōu)化問題。

接下來我們就需要解決服務(wù)器利用率的問題。

首先我們需要解決低峰期資源浪費的問題。剛剛講過貨拉拉的流量是很有規(guī)律的,所以我們通過自研CronHPA實現(xiàn)可預(yù)測和計劃內(nèi)的彈性伸縮,同時通過HPA實現(xiàn)流量突增時的緊急擴容。這是我們已經(jīng)做完的內(nèi)容。

我們目前正在做的是智能request,通過應(yīng)用畫像和過去的指標(biāo)計算出合理的request和limit,期望通過這個功能提高高峰期的節(jié)點資源利用率。

當(dāng)我們完成前面這幾項后,我相信我們已經(jīng)極大的提高了節(jié)點的資源利用率,剩下的就是走完最后一公里,通過智能調(diào)度和在離線混合部署榨干服務(wù)器的最后一滴性能,我們計劃在2023年完成這些功能,之后再整體不斷優(yōu)化。

接下來我將重點介紹下我們已經(jīng)做完的兩點優(yōu)化, 競價實例  定時擴縮容。

四、競價實例

1、什么是競價實例

編輯搜圖

我們都知道云廠商提供的服務(wù)器實例都是他們的物理機房虛擬化出來的,那既然是物理機房,服務(wù)器就是相對固定的,能夠提供的算力也是固定的,但是我們購買的實例數(shù)卻是浮動的,所以云廠商總有些算力是閑置的,而閑置的服務(wù)器產(chǎn)生的經(jīng)濟價值就是0,所以云廠商就將這些閑置的算力拿出來打折或競價銷售,這些打折或競價銷售的實例就是競價實例。

競價實例的由來所有云廠都是一樣的,但是各個云廠商對競價實例的價格計算方式卻存在差異,主要有兩種方式:一種是 固定折扣 ,基本上都是打兩折,這個很好理解;另外一種是 競價 ,競價比較難理解。下面我介紹一下競價的基本過程。

2、競價方式介紹

編輯搜圖

我們購買競價實例時,會填寫一個可接受的最高價格,然后云廠商會根據(jù)所有人的報價和庫存情況計算出一個價格,出價高于或等于這個價格的人就能以這個價格買到實例,低于價格則購買失敗。上圖有個細(xì)節(jié)不知道大家有沒有發(fā)現(xiàn),整幅圖只有定價這里我是用了黑色,那是因為這個價格到底是怎么計算出來的完全是個黑盒,其中的算法只有云廠商自己知道,我們只能知道他最后得出來一個價格,這個價格最低可以低到1折,最高可以等于沒打折。

3、競價實例原理

下面我講講使用競價實例的基本原理。

編輯搜圖

首先我們帶著機器型號和一個能接受的最高價向云廠商提出購買申請,云廠商如果判斷指定型號有庫存并且價格在我們的報價之下,則給我們分配實例,購買完成,這時我們就可以正常使用了。

在我們正常使用該競價實例的過程中,云廠商會一直監(jiān)控庫存和價格變化,當(dāng)發(fā)現(xiàn)價格實時價格高于我們的報價或庫存不足時,將向我們發(fā)送中斷信號,收到信號后我們需要做一些措施保證該實例被回收不影響業(yè)務(wù),在我們收到中斷信號的幾分鐘后,實例就會被回收。

不同云廠商在回收機制上有些不同。aws會有預(yù)測算法,在預(yù)測到庫存不足時提前通知你,讓你有更多反應(yīng)時間;阿里云有一小時保護機制,競價實例運行的第一個小時能保證不被回收。但是都不會等我們做完我們想做的事再回收,無一例外。比如我們想再買臺機器將服務(wù)遷移過去,但是可能還沒遷移就被回收了,所以我們應(yīng)對突然中斷的手段一定要足夠快,才能避免對業(yè)務(wù)產(chǎn)生影響。

4、競價實例特點

編輯搜圖

介紹完競價實例的基本原理,我們再總結(jié)一下競價實例的特點:

  • 性價比高。 和按需實例對比,競價實例通常僅是其價格的10-20%。和預(yù)留實例對比,競價實例通常僅是其價格的30-60%。

  • 競價實例是將閑置資源打折出售。 當(dāng)沒有閑置資源時,也就無法購買了,不是你什么時候想買云廠商都有貨。

  • 隨時中斷。 云廠商會動態(tài)檢測當(dāng)前的市場價格和庫存,一旦庫存不足,或者你的出價小于市場價格,云供應(yīng)商可以在任何時候回收這些實例。

性價比高是我們使用競價實例的目標(biāo),庫存沒保障和隨時中斷是我們需要解決的問題。

5、競價實例結(jié)合K8S 落地

下面我將介紹競價實例如何結(jié)合K8S落地,以及如何解決競價實例帶來的穩(wěn)定性問題。

編輯搜圖

首先從圖中我們可以看到,我將k8s的節(jié)點分成了多個節(jié)點組,然后通過cluster autoscaler進行彈性伸縮。節(jié)點組中有按需實例的節(jié)點組,也有競價實例的節(jié)點組,這是因為并不是所有服務(wù)都適合部署在競價實例上,我們需要一些更穩(wěn)定性的節(jié)點部署跑不適合跑在競價實例上的服務(wù),同時我們也需要在競價實例庫存不足時有按需實例的節(jié)點組提供足夠的算力支持業(yè)務(wù)正常運行。

然后我們再來看中斷回收部分。當(dāng)競價實例需要中斷時,云廠商會發(fā)送一個中斷信號,如果是托管集群,云廠商會自己處理這個中斷信號,幫我們起一個新的節(jié)點并回收舊節(jié)點,但如果是自建集群,我們則需要自己實現(xiàn)一個中斷信號處理服務(wù),在該服務(wù)中處理中斷問題。

在貨拉拉雖然我們是托管集群,但是我們還是自己開發(fā)了一個notify handler,該服務(wù)主要是為了收集中斷信號,用于監(jiān)控中斷頻率以便后續(xù)用于告警和觸發(fā)應(yīng)急預(yù)案。

整體架構(gòu)還是比較簡單的,但是我們在實際使用過程中還是發(fā)現(xiàn)有不少地方需要優(yōu)化,下面我就介紹下幾個主要的優(yōu)化點。

6、競價實例優(yōu)化點

1)增加競價實例的型號

上面我們講過競價實例的庫存沒有保障,所以我們能做的就是擴大這個池子,池子越多,庫存不足的概率就越低,所以我們創(chuàng)建的節(jié)點組需要覆蓋更多的可用區(qū)和更多的實例型號。但是需要注意的是,受到cluster autoscaler的限制,同一個節(jié)點組里的節(jié)點cpu和內(nèi)存必須一致。

2)設(shè)置節(jié)點組優(yōu)先級

目前我們的集群中有按需實例節(jié)點組和競價實例節(jié)點組,我們希望資源不足時優(yōu)先彈出競價實例,只有當(dāng)競價實例無法彈出時才彈出按需實例,這樣可以確保最大化的利用競價實例,同時又能確保競價實例庫存不足時及時彈出按需實例保證業(yè)務(wù)穩(wěn)定運行。

這里用到的是cluster autoscaler的優(yōu)先級配置,我們在cluster autoscaler的一個configmap中配置節(jié)點組的優(yōu)先級,將競價實例的優(yōu)先級設(shè)置成20,其他節(jié)點組是10,這樣ca就會優(yōu)先彈出競價實例,彈不出競價實例時彈出按需實例。

編輯搜圖

3)設(shè)置pod親和性

由于競價實例隨時可能被中斷,且一旦中斷很有可能是同一個型號的節(jié)點同時被中斷,所以我們要避免把雞蛋放在一個籃子里,盡量把同一個服務(wù)的pod分散在不同實例、不同型號甚至是不同的可用區(qū)中,避免某一個服務(wù)所有的pod被同時驅(qū)逐,造成服務(wù)不可用。

這里用到的就是pod的親和性配置。從配置上我們可以看到,我們給了可用區(qū)最大的權(quán)重,其次是實例型號,最后是實例名,這樣k8s會盡量將同一個app的pod分散到不同的可用區(qū),如果沒有合適的節(jié)點則分散到不同的實例類型,依然沒有合適的再分散到不同的實例,這樣可以最大化地打散同一個服務(wù)的pod,避免由于競價實例中斷導(dǎo)致服務(wù)不可用。

編輯搜圖

4)配置PDB

盡管我們之前已經(jīng)做了很多措施,避免同一個服務(wù)的pod在同一時間由于實例中斷被驅(qū)逐,但是沒有哪一項是能100%避免這種情況的,所以我們需要再上一層保險,這層保險就是PDB,通過PDB我們可以設(shè)置同一個服務(wù)的pod必須保證同一時間有多少副本是可用的。像下面這張圖的配置里面就保證了服務(wù)70%的副本是正常的,這樣就算遇到需要同時驅(qū)逐的情況,k8s也會在強制保證至少有70%的副本可用的情況下滾動驅(qū)逐,確保整個過程服務(wù)都是可用的狀態(tài)。

但是需要注意的是,這個配置會導(dǎo)致本來可以并發(fā)的驅(qū)逐變成串行,這會影響到排空節(jié)點的時間,所以這個需要服務(wù)的啟動速度足夠快,在節(jié)點被真正回收前執(zhí)行完整個遷移過程。

編輯搜圖

5)利用低優(yōu)先級的pause pod給集群預(yù)留空間

上面我們講過,競價實例從收到中斷信號到真的被回收就那么兩三分鐘時間,時間一到不管我們是什么情況實例都會被回收,所以我們必須保證在實例被回收前完成整個遷移動作,那這兩三分鐘的每一秒是很珍貴的,我們必須想方設(shè)法提高遷移的效率,但是創(chuàng)建一個新的節(jié)點少則幾十秒,多則一兩分鐘,等新節(jié)點準(zhǔn)備好其實已經(jīng)浪費了很多時間,所以我們需要想辦法在收到中斷信號的時候就直接將舊節(jié)點排空,但是要排空節(jié)點就需要保證集群隨時有足夠的空間運行被驅(qū)逐的pod。而保證有足夠空間的做法就是我們現(xiàn)在講的這個利用低優(yōu)先級的pause pod給集群預(yù)留空間。

k8s里面的pod有一個優(yōu)先級的概念,高優(yōu)先級的pod可以在資源不足時搶占低優(yōu)先級的pod。從下面這張圖我們可以看到,我們在Node1和Node2都放置了一些低優(yōu)先級的Pod,當(dāng)Node1被中斷回收后,高優(yōu)先級的pod會直接搶占低優(yōu)先級的pod從而實現(xiàn)快速啟動,而不需要等新的節(jié)點準(zhǔn)備就緒,而低優(yōu)先級的pod則會全部變成pending狀態(tài)觸發(fā)擴容或等待新的節(jié)點ready后啟動,從而重新創(chuàng)建了一塊預(yù)留空間。

編輯搜圖

下面是具體的yaml,這里面優(yōu)先級不必非得是-1,只要保證比正常pod的優(yōu)先級小即可,低優(yōu)先級pod主要是要把PriorityClassName填對,然后根據(jù)實際情況設(shè)置副本數(shù)和request即可。

編輯搜圖

編輯搜圖

7、不適宜部署在競價實例的服務(wù)

  • 單副本服務(wù)。 這個不用解釋大家都明白。

  • 啟動時間過長的服務(wù)。 因為需要保證服務(wù)能在實例被回收之前啟動完成,所以服務(wù)的啟動時間不能太長。

  • 無法容忍任何非優(yōu)雅停止的服務(wù)。 我們需要認(rèn)識到不管我們做了多少措施,都不能完全杜絕實例在沒有排空之前就被回收,所以對于不能優(yōu)雅停止無法容忍的服務(wù)也不適合部署在競價實例上。

  • 有狀態(tài)的服務(wù)。 有狀態(tài)的服務(wù)遷移起來遠(yuǎn)沒有無狀態(tài)的服務(wù)靈活,為避免出現(xiàn)各種各樣的問題,也不建議有狀態(tài)的服務(wù)部署在競價實例上。

五、定時擴縮容

1、背景

彈性伸縮的本質(zhì)是為了提高服務(wù)器的利用率,那我們來看看貨拉拉一個沒有任何優(yōu)化的集群的CPU利用率是怎么樣的。

編輯搜圖

從這個圖我們可以看到,這個集群在白天最高峰時的CPU利用率是35%,半夜低峰期的CPU利用率卻只有2.5%,2點的時候還有一個小高峰,是因為我們在這個時候有大量定時任務(wù)在執(zhí)行,可以先不用考慮。目前這個利用率如果是放在虛擬機時代,還算是一個比較能接受的利用率,但是放在云原生時代,我們還是有很多手段可以提升這個利用率。

我們的優(yōu)化目標(biāo)是希望把高峰期節(jié)點CPU平均利用率達到50%,低峰期節(jié)點CPU平均利用率達到30%。

2、默認(rèn)HPA的不足

按照正常做法,我們把HPA套上去應(yīng)該就可以解決這些問題,隨著流量上升自動擴容,流量下降后自動縮容,事實上我們也這樣做過,但是很快就發(fā)現(xiàn)了問題。

編輯搜圖

第一個問題是 擴容有一定滯后。 HPA需要等負(fù)載上來觸發(fā)閾值后才開始擴容,而負(fù)載升得太快可能會導(dǎo)致擴容不及時,我們每天早上9點和下午2點都有一波很迅速的流量上升,這時HPA會大量擴容,但是大量擴容就需要先大量擴節(jié)點,導(dǎo)致這兩個時間點擴容總是太慢,每天這兩個時間點都會有些報錯,然后觸發(fā)告警。

第二個問題是 擴容閾值受到限制 。為了白天流量上升時擴容盡量穩(wěn)定,我們不能把最小副本數(shù)設(shè)置得太低,這就導(dǎo)致我們晚上的CPU利用率上不去。而為了擴容及時,我們也不能把CPU的閾值設(shè)置得太高,因為越高就意味擴容時反應(yīng)約遲鈍,而設(shè)置得太低又導(dǎo)致高峰期CPU利用率上不去,例如我們在HPA把CPU的閾值設(shè)置為35%,那我們的pod的CPU使用率基本上都不能超過35%,因為超過就會擴容,然后把CPU利用率拉下來。

第三個問題是 擴縮容時機無法控制。 HPA是完全根據(jù)配置的指標(biāo)和閾值來擴容,無法根據(jù)企業(yè)特點定制策略,例如貨拉拉的流量白天還是比較穩(wěn)定的,我們在白天高峰期時就算浪費點資源也不希望出現(xiàn)過多擴縮容影響穩(wěn)定性,但是HPA并沒有提供這樣的配置。

3、CronHPA+HPA

結(jié)合我們對HPA的實踐經(jīng)驗和貨拉拉的業(yè)務(wù)特點,我們總結(jié)探索出了符合貨拉拉特點的水平彈性伸縮方式,那就是自研的CronHPA+HPA組合。

編輯搜圖

CronHPA是根據(jù)設(shè)定好的時間調(diào)整對應(yīng)HPA 的最小副本數(shù),實現(xiàn)可預(yù)期或計劃內(nèi)的彈性伸縮。

考慮到貨拉拉流量規(guī)律的特點,我們在自研的CronHPA中通過定時+過往指標(biāo)分析+簡單預(yù)測算法可以做到比較高質(zhì)量的預(yù)擴容以及定時縮容。例如早上9點流量開始快速上升,我們可以在7點到8點就提前把集群擴容到高峰期的水平,晚上10點后流量已經(jīng)下降了很多,我們可以放心地縮容,并且有了預(yù)擴容打底,我們晚上可以把副本數(shù)縮到一個極低的水平而不用擔(dān)心白天來不及擴容。

CronHPA沒有直接操作deployment的副本數(shù),而是操作HPA的最低副本數(shù),是因為盡管CronHPA可以覆蓋我們99%的擴縮容需求,但是仍然需要HPA的自動擴縮容來解決1%偶發(fā)流量突增的問題,盡管我們很少遇到流量突增的情況,但是有了HPA可以讓我們在縮容或者設(shè)置高峰期副本數(shù)時不必為偶發(fā)的流量突增添加額外的buff,從而提升整體的資源利用率。

4、架構(gòu)

講完定時擴縮容的原理,我們再來講講定時擴縮容的架構(gòu)。

編輯搜圖

我們在K8S部署了一個自研的hll-cronhpa-controller,并且添加了一個CronHPA的CRD,用戶主要是設(shè)置CronHPA的CRD來設(shè)置彈性伸縮,并不直接設(shè)置HPA和deployment副本數(shù),hll-cronhpa-controller會監(jiān)聽CronHPA CRD對象的變化,當(dāng)發(fā)現(xiàn)有新增或者更新時,就會同步修改HPA對象,其中除了最小副本數(shù)其他都是直接透傳,CronHPA的所有業(yè)務(wù)邏輯最終都會體現(xiàn)在HPA最小副本數(shù)的變化上。

而CronHPA的業(yè)務(wù)邏輯主要是hll-cronhpa-controller根據(jù)cronHPA對象的配置,從Prometheus拉取過往指標(biāo)分析,同時結(jié)合從應(yīng)用管理平臺拉取的應(yīng)用畫像以及從配置中心拉取的擴縮容策略綜合分析后在合適的時間點為對應(yīng)的HPA對象設(shè)置一個合適的最小副本數(shù),這么說可能有點抽象。

舉個例子,假設(shè)我目前有個服務(wù)設(shè)置了晚上需要縮容,我們通過分析該服務(wù)過往夜間資源利用率得出晚上可以縮到剩下2個副本,同時我們從應(yīng)用畫像中查到該服務(wù)是核心服務(wù),而配置中心的擴縮容策略是核心服務(wù)最低不能少于5個副本,那綜合分析我們夜間需要給他設(shè)置的副本數(shù)就是5。

5、實現(xiàn)路徑

下面講一下我們的實現(xiàn)路徑。我們最開始自研的時候就確定了cronHPA+HPA的架構(gòu)。

編輯搜圖

第一階段是純手工配置的,我們通過分析流量設(shè)置了一個全局縮容時間點和全局?jǐn)U容時間點,然后各個服務(wù)根據(jù)經(jīng)驗人工估算出一個縮容比例。這個階段由于全局是在同一個時間點同時擴縮容,在擴容瞬間對基礎(chǔ)設(shè)施的壓力比較大,同時人工估算出來的縮容比例還是過于保守。

第二階段是根據(jù)過往指標(biāo)分析自動設(shè)置擴縮容的時機,這樣可以有效分散擴縮容壓力,同時讓擴縮容時機更為合理。例如有些服務(wù)可能晚上6點就沒流量了,階段一還需要等到晚上10點才縮容。

第三階段是根據(jù)appid自動計算縮容比例。人工估算縮容比例還是過于保守,例如高峰期100個pod,晚上其實可能只需要10個,但是一般人工評估只會縮到50個,但是通過算法自動計算就會相對科學(xué)很多,同時自動計算還可以通過分析過往指標(biāo)不斷修正,例如某個pod經(jīng)過計算晚上縮容到2個pod,但是通過分析過往指標(biāo)發(fā)現(xiàn)過去7天晚上都會通過HPA擴容到3個pod,那第八天就把縮容副本數(shù)自動調(diào)整到3個。

第四階段是自動識別低峰期。原來手工設(shè)置低峰期時間段,程序在從這個時間段里選擇擴縮容時機,到了這一階段,我們可以自動識別每個服務(wù)自己的業(yè)務(wù)低峰期,做到個性化縮容。

第五階段是自動分階段擴縮容,前幾個階段都是確定一個擴縮容時間點,直接把副本數(shù)擴縮到目標(biāo)副本數(shù),但流量其實是逐漸變化的,通過這個階段我們可以實現(xiàn)服務(wù)在高峰期來臨前隨著流量上升逐步把副本數(shù)提上去,而在低峰期,隨時流量降低逐步降低副本數(shù),這個階段與HPA最大的不同在于,HPA是基于指標(biāo)和閾值,而cronHPA是基于預(yù)測。

6、未來規(guī)劃

編輯搜圖

最后講一下我們對于彈性伸縮的未來規(guī)劃,我們希望未來彈性伸縮可以形成這樣一個機制,服務(wù)初始化時可以通過應(yīng)用畫像自動設(shè)置reqeust/limit和副本數(shù),然后自動在高低峰通過過往指標(biāo)分析和算法實現(xiàn)預(yù)擴容和及時縮容。

如果遇到突發(fā)流量可以通過原地升配實現(xiàn)快速縱向擴容,原地升配對比VPA最大的區(qū)別在于不用重啟pod,所以可以做到秒級擴容。如果所在節(jié)點資源不足則通過HPA橫向擴容,同時根據(jù)指標(biāo)分析不斷修正服務(wù)的reqeust/limit和副本數(shù),實現(xiàn)全自動的彈性伸縮閉環(huán)。