騰訊云應(yīng)用彈性管理最佳實(shí)踐

來(lái)源: 騰訊云云函數(shù)
作者:TEM團(tuán)隊(duì)
時(shí)間:2021-12-09
14304
生產(chǎn)環(huán)境中,業(yè)務(wù)面臨的負(fù)載壓力變化是不定的,為了保障業(yè)務(wù)的穩(wěn)定性,需要根據(jù)負(fù)載大小的變化調(diào)整應(yīng)用實(shí)例的數(shù)量或資源規(guī)格,同時(shí)從資源成本角度考慮,需要在保障業(yè)務(wù)穩(wěn)定性的同時(shí),盡量減少不必要的資源占用。

pexels-photo-6829512.jpg

01.

背景

生產(chǎn)環(huán)境中,業(yè)務(wù)面臨的負(fù)載壓力變化是不定的,為了保障業(yè)務(wù)的穩(wěn)定性,需要根據(jù)負(fù)載大小的變化調(diào)整應(yīng)用實(shí)例的數(shù)量或資源規(guī)格,同時(shí)從資源成本角度考慮,需要在保障業(yè)務(wù)穩(wěn)定性的同時(shí),盡量減少不必要的資源占用。

為了滿足上述兩方面的訴求,應(yīng)用管理平臺(tái)需要提供彈性能力。下述將整體分析彈性技術(shù)以及K8s中的實(shí)現(xiàn),并通過(guò)一款云產(chǎn)品做演示,從業(yè)務(wù)視角使用彈性能力。

02.

彈性技術(shù)

對(duì)于彈性技術(shù),一般會(huì)從兩個(gè)維度進(jìn)行考慮:

·彈性策略

·彈性效率

彈性策略重點(diǎn)關(guān)注如何管理觸發(fā)彈性行為的發(fā)生,以及彈性行為作用的維度,彈性效率重點(diǎn)關(guān)注彈性行為觸發(fā)后多快完成彈性任務(wù)。

1.彈性策略

彈性策略主要關(guān)注彈性觸發(fā)、彈性作用維度,常見(jiàn)的包括:

·彈性觸發(fā):定時(shí)彈性,基于資源的彈性,基于業(yè)務(wù)指標(biāo)的彈性,基于事件的彈性。

·彈性作用維度:HPA(Horizontal Pod Autoscale,水平彈性伸縮),VPA(Vertical Pod Autoscale,垂直彈性伸縮)

1.1 應(yīng)用彈性觸發(fā)的場(chǎng)景

場(chǎng)景1:很多應(yīng)用負(fù)載與時(shí)間有關(guān),如多媒體處理應(yīng)用、游戲、電商等,會(huì)呈現(xiàn)出有明顯規(guī)律的請(qǐng)求流量高峰、低谷現(xiàn)象,且高峰、低谷持續(xù)的時(shí)間相對(duì)是連續(xù)的。

對(duì)于這種場(chǎng)景,可以考慮定時(shí)彈性策略,在指定的時(shí)間段內(nèi)維持固定數(shù)量的應(yīng)用數(shù)量,請(qǐng)求高峰時(shí)段保持較多的應(yīng)用實(shí)例,請(qǐng)求低峰時(shí)段保持較少的應(yīng)用實(shí)例,同時(shí)避免應(yīng)用實(shí)例數(shù)量在時(shí)間段內(nèi)波動(dòng)。

場(chǎng)景2:應(yīng)用實(shí)例處理能力是有限的,在請(qǐng)求量增大時(shí),若CPU/Memory等資源使用量超過(guò)一定限度,會(huì)影響應(yīng)用的服務(wù)性能。

對(duì)于這種場(chǎng)景,可以考慮基于資源使用率的彈性策略,定時(shí)計(jì)算應(yīng)用實(shí)例的CPU/Memory等資源的使用率,動(dòng)態(tài)調(diào)整應(yīng)用實(shí)例數(shù)量,靈敏應(yīng)對(duì)突發(fā)流量。

場(chǎng)景3:應(yīng)用通常會(huì)有業(yè)務(wù)指標(biāo),如QPS/RT/消息堆積數(shù)等,業(yè)務(wù)指標(biāo)的變化會(huì)影響業(yè)務(wù)服務(wù)質(zhì)量,而資源使用率不一定能夠反映出業(yè)務(wù)指標(biāo)的變化,需要考慮其他方法應(yīng)對(duì)這種情況。

對(duì)于這種場(chǎng)景,可以考慮基于業(yè)務(wù)指標(biāo)的彈性,定時(shí)計(jì)算QPS/RT/消息堆積數(shù)等業(yè)務(wù)維度的指標(biāo)壓力,動(dòng)態(tài)調(diào)整應(yīng)用實(shí)例數(shù)量,滿足業(yè)務(wù)服務(wù)質(zhì)量的需求。

場(chǎng)景4:實(shí)際生產(chǎn)中,時(shí)間因素、資源使用率、業(yè)務(wù)指標(biāo)不是互斥的,通常是混合出現(xiàn)。如在業(yè)務(wù)潮汐流量階段,會(huì)出現(xiàn)資源使用率、業(yè)務(wù)指標(biāo)飆升情況,此時(shí)需要更為靈敏的基于資源的彈性策略和基于業(yè)務(wù)指標(biāo)的彈性策略。

對(duì)于這種場(chǎng)景,可以將時(shí)間、資源使用率、業(yè)務(wù)指標(biāo)作為無(wú)差別的事件,根據(jù)事件做彈性行為觸發(fā)的判斷,即基于事件的彈性。

1.2 彈性作用維度

在彈性行為發(fā)生時(shí),通常的做法是調(diào)整實(shí)例數(shù)量,做水平伸縮。在固定資源規(guī)格情況下,單個(gè)實(shí)例處理能力有限且可以預(yù)期的,通過(guò)調(diào)整實(shí)例數(shù)量來(lái)控制應(yīng)用整體的處理能力,這種做法更為普適和可控,即HPA。

還有一種方式是調(diào)整實(shí)例規(guī)格,如調(diào)大、調(diào)小實(shí)例的CPU/Memory等資源的上限,提升單個(gè)實(shí)例的處理能力,即VPA。

當(dāng)前HPA比VPA更易理解、滿足預(yù)期和更強(qiáng)的可控性,通常在彈性策略執(zhí)行時(shí),會(huì)通過(guò)HPA的方式作用于應(yīng)用實(shí)例。

2.彈性效率

彈性效率關(guān)注彈性策略執(zhí)行時(shí),多長(zhǎng)時(shí)間可以執(zhí)行完成。下述以HPA場(chǎng)景為例,分析影響彈性效率的因素和改善措施。

在容器場(chǎng)景下,實(shí)例的運(yùn)行通常會(huì)有如下階段:

640.webp.jpg

整體的流程會(huì)分為3個(gè)階段:

1.鏡像構(gòu)建:對(duì)于代碼包(如war/jar)形態(tài)的交付物,需要有個(gè)構(gòu)建過(guò)程,將代碼包構(gòu)建成鏡像

2.實(shí)例調(diào)度:將應(yīng)用實(shí)例調(diào)度到適合的節(jié)點(diǎn)

3.實(shí)例啟動(dòng):這個(gè)過(guò)程通常會(huì)涉及到鏡像處理+啟動(dòng)兩個(gè)階段,先將鏡像拉取到節(jié)點(diǎn)上,然后啟動(dòng)容器。

可以針對(duì)上述每個(gè)階段進(jìn)行優(yōu)化,提升彈性效率。

鏡像構(gòu)建階段,可采用具有高效構(gòu)建的服務(wù),如buildkit,充分利用build cache、concurrent dependency resolution等能力提升鏡像構(gòu)建效率。針對(duì)Java類應(yīng)用,也可以采用類似jib等項(xiàng)目加速Java類鏡像的構(gòu)建。鏡像構(gòu)建好之后,需要將鏡像推送到指定的registry中,也可以考慮通過(guò)buildkit工具控制是否壓縮層數(shù)據(jù)和推送層的并發(fā)量來(lái)提升效率。

實(shí)例調(diào)度階段,若調(diào)度過(guò)程中涉及資源準(zhǔn)備等,可通過(guò)K8s Scheduler Framework提供的插件機(jī)制進(jìn)行擴(kuò)展,將多個(gè)流程并行處理。也可以考慮在這個(gè)過(guò)程中實(shí)現(xiàn)鏡像預(yù)熱,在實(shí)例調(diào)度到的節(jié)點(diǎn)確定后,對(duì)于目標(biāo)節(jié)點(diǎn)發(fā)起鏡像拉取操作,可考慮使用OpenKruise提供的ImagePullJob實(shí)現(xiàn)鏡像預(yù)熱。

實(shí)例啟動(dòng)階段,會(huì)涉及鏡像處理和啟動(dòng)兩個(gè)階段,在鏡像處理過(guò)程中,又會(huì)有鏡像拉取和鏡像解壓兩個(gè)階段,需要分別考慮優(yōu)化措施。參考下圖,鏡像拉取時(shí)涉及到鏡像層下載和解壓。

640.webp (1).jpg

containerd支持調(diào)整拉取鏡像層的并發(fā)量,配置可參見(jiàn)config,通過(guò)該配置調(diào)節(jié)拉取鏡像層的并發(fā)量。詳細(xì)鏈接:

https://github.com/containerd/containerd/blob/main/docs/cri/config.md

containerd從1.2版本開(kāi)始支持pigz,節(jié)點(diǎn)上安裝unpigz工具后,會(huì)優(yōu)先用其進(jìn)行解壓。通過(guò)這種方法,可通過(guò)節(jié)點(diǎn)多核能力提升鏡像解壓效率。

上述思路是將鏡像完整拉到節(jié)點(diǎn)后再啟動(dòng)容器,還可參考業(yè)界《Slacker:Fast Distribution with Lazy Docker Containers》paper,采用邊拉鏡像邊啟動(dòng)容器的方法進(jìn)一步提升容器啟動(dòng)效率。

社區(qū)有類似的實(shí)現(xiàn),參見(jiàn)stargz-snapshotter。目前國(guó)內(nèi)各大云廠商也有相應(yīng)的技術(shù)實(shí)現(xiàn),如騰訊云ImageApparate等。

容器啟動(dòng)后會(huì)涉及到應(yīng)用程序的啟動(dòng),對(duì)于Java類應(yīng)用,可以考慮采用啟動(dòng)效率優(yōu)化的JVM Runtime,如騰訊云KonaJDK等。

【詳細(xì)鏈接】

1.Slacker:Fast Distribution with Lazy Docker Container:https://www.usenix.org/conference/fast16/technical-sessions/presentation/harter

2.stargz-snapshotter:https://github.com/containerd/stargz-snapshotter

3.ImageApparate:https://mp.weixin.qq.com/s?__biz=Mzg5NjA1MjkxNw%3D%3D&mid=2247492105&idx=1&sn=26c2f4eabde8975e2e4974a33622dcde

4.KonaJDK:https://github.com/Tencent/TencentKona-11

03.

K8s中的彈性能力實(shí)現(xiàn)

1.HPA

1.1 原生實(shí)現(xiàn)

通過(guò)Kubernetes monitoring architecture可了解到K8s HPA的實(shí)現(xiàn):

640.webp (2).jpg

如上圖所示,K8s中有2條metrics數(shù)據(jù)采集鏈路Core Metrics Pipeline和Monitoring Pipeline,分別對(duì)應(yīng)基于資源的彈性策略和基于指標(biāo)的彈性策略。

對(duì)于Core Metrics Pipeline,kube-apiserver通過(guò)metrics-server組件獲取Pod的cpu/memory使用情況,然后由kube-controller-manager(簡(jiǎn)稱kcm)訪問(wèn)kube-apiserver獲取workload的資源利用率,根據(jù)算法判斷是否要對(duì)目標(biāo)workload進(jìn)行擴(kuò)縮容操作,處理詳情可參見(jiàn)Horizontal Pod Autoscaler:https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/

其中metrics-server是K8s社區(qū)維護(hù)的項(xiàng)目,K8s集群中部署metrics-server組件后,立即可以使用基于資源的彈性能力。

對(duì)于Monitoring Pipeline,實(shí)現(xiàn)流程為:

1.業(yè)務(wù)方實(shí)現(xiàn)metrics-adapter:metrics-adapter提供Custom Metrics API或External Metrics API,滿足外部查詢指定metrics的需求;metrics-adapter從第三方獲取相應(yīng)的metrics數(shù)據(jù)。

2.業(yè)務(wù)方通過(guò)APIService資源進(jìn)行注冊(cè):將對(duì)kube-apiserver的指標(biāo)請(qǐng)求與metrics-adapter關(guān)聯(lián),便于kube-apiserver將請(qǐng)求轉(zhuǎn)發(fā)到metrics-adapter。

3.kcm中的HPA Controller按照配置和HPA資源,請(qǐng)求kube-apiserver獲取當(dāng)前metrics數(shù)據(jù),計(jì)算是否需要對(duì)指定的workload進(jìn)行擴(kuò)縮,若需要,則調(diào)用指定workload的/scale接口進(jìn)行擴(kuò)縮。

K8s社區(qū)為了簡(jiǎn)化metrics-adapter實(shí)現(xiàn)成本,提供了一個(gè)開(kāi)發(fā)框架,將metrics-adapter中通用實(shí)現(xiàn)邏輯模板化,可參見(jiàn)custom-metrics-apiserver:https://github.com/kubernetes-sigs/custom-metrics-apiserver。

1.2 KEDA

對(duì)于彈性能力的實(shí)現(xiàn),不得不提KEDA項(xiàng)目,它是微軟推出的基于事件的彈性伸縮項(xiàng)目,已捐贈(zèng)給CNCF,是CNCF incubating中的項(xiàng)目,被廣泛用于生產(chǎn)環(huán)境(參見(jiàn)keda users)。

KEDA的概念和設(shè)計(jì)如下:

640.webp (3).jpg

KEDA將K8s Core Metrics Pipeline和Monitoring Pipeline處理流程統(tǒng)一化,并內(nèi)置多種scaler(link),提供開(kāi)箱即用的彈性策略支持,如常見(jiàn)的基于CPU/Memory的彈性策略、定時(shí)彈性等:

640.webp (4).jpg

平臺(tái)維護(hù)者可通過(guò)實(shí)現(xiàn)scaler來(lái)擴(kuò)展彈性策略,支持更豐富的彈性策略,實(shí)現(xiàn)參見(jiàn)External Scalers:https://keda.sh/docs/2.4/concepts/external-scalers/

比較推薦平臺(tái)層面使用KEDA來(lái)統(tǒng)一彈性能力的實(shí)現(xiàn),將時(shí)間、CPU/Memory等資源使用率、業(yè)務(wù)指標(biāo)等作為KEDA的數(shù)據(jù)源,統(tǒng)一化為事件,基于事件滿足對(duì)彈性策略的需求。

2.VPA

VPA是另一種彈性行為的實(shí)現(xiàn),用戶可以不再顯式配置workload的資源申請(qǐng)量,由VerticalPodAutoscaler自動(dòng)配置workload資源量,并自動(dòng)根據(jù)Pod資源使用情況調(diào)整Pod資源申請(qǐng)量,項(xiàng)目參見(jiàn)autoscaler/vertical-pod-autoscaler:https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler

目前該項(xiàng)目還處于實(shí)驗(yàn)階段,生產(chǎn)環(huán)境中謹(jǐn)慎使用。公有云產(chǎn)品中,GKE對(duì)VPA進(jìn)行了支持,詳情參見(jiàn):https://cloud.google.com/kubernetes-engine/docs/concepts/verticalpodautoscaler

上述VPA實(shí)現(xiàn)在調(diào)整Pod資源配置時(shí)會(huì)重建Pod,對(duì)于一些對(duì)重建敏感的應(yīng)用,重建可能會(huì)導(dǎo)致業(yè)務(wù)異常。

業(yè)界也有一種方案是在實(shí)現(xiàn)VPA的同時(shí)不重建Pod,即在節(jié)點(diǎn)層面調(diào)整container cgroup配置。但這種方案會(huì)打破K8s的資源管理模型,導(dǎo)致實(shí)際分配的資源與K8s調(diào)度鏈路感知到的資源申請(qǐng)量不一致,會(huì)影響K8s集群整體的調(diào)度,同時(shí)也有可能影響節(jié)點(diǎn)自身的穩(wěn)定性。

目前K8s社區(qū)有一個(gè)KEP討論In-place Update of Pod Resources,可以持續(xù)關(guān)注社區(qū)對(duì)VPA的標(biāo)準(zhǔn)化和支持:https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/1287-in-place-update-pod-resources

小結(jié)

上述整體介紹了彈性技術(shù)和K8s中彈性能力的實(shí)現(xiàn),在業(yè)務(wù)場(chǎng)景中,需要根據(jù)業(yè)務(wù)需求,實(shí)現(xiàn)和使用與需求匹配的彈性能力,避免過(guò)度使用高級(jí)能力影響業(yè)務(wù)穩(wěn)定性,如:

·有明顯潮汐流量特征的業(yè)務(wù),可以重點(diǎn)使用定時(shí)彈性

·有突發(fā)流量特征的業(yè)務(wù),可重點(diǎn)使用基于資源的彈性或指標(biāo)彈性

·若業(yè)務(wù)是混合流量特征,即既有潮汐流量特征,又有突發(fā)流量特征,可重點(diǎn)使用基于事件的彈性,根據(jù)多種事件綜合做彈性決策

04.

基于云產(chǎn)品實(shí)踐

彈性微服務(wù)TEM(Tencent Cloud Elastic Microservice)是騰訊云推出的面向微服務(wù)應(yīng)用的Serverless PaaS平臺(tái),實(shí)現(xiàn)資源Serverless與微服務(wù)架構(gòu)的完美結(jié)合,提供一整套開(kāi)箱即用的微服務(wù)解決方案。

TEM當(dāng)前提供使用率較高的定時(shí)彈性策略和基于資源的彈性策略,對(duì)應(yīng)的彈性動(dòng)作行為均為HPA,接下來(lái)會(huì)支持基于指標(biāo)彈性策略和基于事件彈性策略,滿足用戶對(duì)更靈活的彈性策略的需求。

同時(shí)針對(duì)Java應(yīng)用,TEM近期會(huì)支持KonaJDK11,提升Java應(yīng)用的啟動(dòng)效率,并計(jì)劃支持更為通用的按需拉取的啟動(dòng)策略,進(jìn)一步提升彈性效率,敬請(qǐng)期待。

TEM中,用戶可以在兩個(gè)流程中配置彈性策略,一種是在應(yīng)用部署過(guò)程中,一種是在應(yīng)用部署后在應(yīng)用詳情頁(yè)中配置彈性策略。推薦后者,更靈活組合應(yīng)用管理的能力。

可在應(yīng)用部署后的詳情頁(yè)中編輯彈性伸縮來(lái)配置彈性策略:

640.webp (5).jpg

1.定時(shí)彈性

在彈性伸縮策略中,選擇定時(shí)策略,如下示例配置:每天11:00~14:00期間保持10個(gè)實(shí)例,14:00~18:00期間保持2個(gè)實(shí)例,18:00~23:00期間保持10個(gè)實(shí)例,23:00~11:00保持2個(gè)實(shí)例。

640.webp (6).jpg

配置提交后,可通過(guò)預(yù)覽可視化查看未來(lái)執(zhí)行效果:

640.webp (7).jpg640.webp (8).jpg

2.基于資源的彈性策略

在彈性伸縮策略中,選擇指標(biāo)彈性策略,如下示例配置:當(dāng)CPU使用率不小于60%時(shí),擴(kuò)縮應(yīng)用實(shí)例數(shù)量,擴(kuò)縮范圍為2~20:

640.webp (9).jpg

小結(jié)

通過(guò)理解彈性技術(shù),可以在業(yè)務(wù)中更好選擇合適的彈性策略來(lái)滿足需求,并根據(jù)業(yè)務(wù)對(duì)彈性效率的訴求,選擇合適的技術(shù)優(yōu)化彈性效率,或在彈性效率限制下,優(yōu)化彈性策略的使用。

Serverless云產(chǎn)品提供了資源池的能力,用戶不用關(guān)心資源池的準(zhǔn)備、運(yùn)維等工作,將注意力集中在業(yè)務(wù)層面對(duì)資源彈性的需求,面對(duì)潮汐流量或突發(fā)流量,在大促等活動(dòng)中更好保障業(yè)務(wù)穩(wěn)定性,降低業(yè)務(wù)運(yùn)行成本。

騰訊云TEM是一款面向微服務(wù)應(yīng)用的Serverless PaaS平臺(tái),實(shí)現(xiàn)資源Serverless與微服務(wù)架構(gòu)的完美結(jié)合,在雙十二大促來(lái)臨之際,歡迎大家使用,滿足資源彈性的訴求。

立即登錄,閱讀全文
版權(quán)說(shuō)明:
本文內(nèi)容來(lái)自于騰訊云云函數(shù),本站不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。文章內(nèi)容系作者個(gè)人觀點(diǎn),不代表快出海對(duì)觀點(diǎn)贊同或支持。如有侵權(quán),請(qǐng)聯(lián)系管理員(zzx@kchuhai.com)刪除!
相關(guān)文章
騰訊云數(shù)據(jù)庫(kù)PostgreSQL全面支持PG 17
騰訊云數(shù)據(jù)庫(kù)PostgreSQL全面支持PG 17
即日起,騰訊云PostgreSQL全面支持PostgreSQL 17.0。所有用戶可使用大版本升級(jí)能力升級(jí)至最新的PostgreSQL 17.0進(jìn)行體驗(yàn),也可以在產(chǎn)品購(gòu)買(mǎi)頁(yè)直接購(gòu)買(mǎi)。
騰訊云
云服務(wù)
2024-12-152024-12-15
高可用這個(gè)問(wèn)題,加機(jī)器就能解決?
高可用這個(gè)問(wèn)題,加機(jī)器就能解決?
互聯(lián)網(wǎng)服務(wù)的可用性問(wèn)題是困擾企業(yè)IT人員的達(dá)摩克利斯之劍:防于未然,體現(xiàn)不出價(jià)值。已然發(fā)生,又面臨P0危機(jī)。就更別提穩(wěn)定性建設(shè)背后顯性的IT預(yù)算問(wèn)題與隱性的人員成本問(wèn)題。
騰訊云
云服務(wù)
2024-11-252024-11-25
TDSQL TDStore引擎版替換HBase:在歷史庫(kù)場(chǎng)景中的成本與性能優(yōu)勢(shì)
TDSQL TDStore引擎版替換HBase:在歷史庫(kù)場(chǎng)景中的成本與性能優(yōu)勢(shì)
HBase憑借其高可用性、高擴(kuò)展性和強(qiáng)一致性,以及在廉價(jià)PC服務(wù)器上的低部署成本,廣泛應(yīng)用于大規(guī)模數(shù)據(jù)分析。
騰訊云
云服務(wù)
2024-11-042024-11-04
復(fù)雜查詢性能弱,只讀分析引擎來(lái)幫忙
復(fù)雜查詢性能弱,只讀分析引擎來(lái)幫忙
隨著當(dāng)今業(yè)務(wù)的高速發(fā)展,復(fù)雜多表關(guān)聯(lián)的場(chǎng)景越來(lái)越普遍。但基于行式存儲(chǔ)的數(shù)據(jù)庫(kù)在進(jìn)行復(fù)雜查詢時(shí)性能相對(duì)較弱。
騰訊云
云服務(wù)
2024-11-022024-11-02
優(yōu)質(zhì)服務(wù)商推薦
更多
掃碼登錄
打開(kāi)掃一掃, 關(guān)注公眾號(hào)后即可登錄/注冊(cè)
加載中
二維碼已失效 請(qǐng)重試
刷新
賬號(hào)登錄/注冊(cè)
個(gè)人VIP
小程序
快出海小程序
公眾號(hào)
快出海公眾號(hào)
商務(wù)合作
商務(wù)合作
投稿采訪
投稿采訪
出海管家
出海管家