隨著Kubernetes已成為應(yīng)用程序容器編排的事實(shí)標(biāo)準(zhǔn),它也提出了有關(guān)優(yōu)化策略和最佳實(shí)踐的重要問題。組織采用Kubernetes的原因之一是提高效率,即使在擴(kuò)大和縮小規(guī)模以適應(yīng)不斷變化的工作負(fù)載時(shí)也是如此;然而,使Kubernetes如此靈活的細(xì)粒度控制也使得有效調(diào)整和優(yōu)化變得具有挑戰(zhàn)性。
在本文中,我們將解釋如何使用機(jī)器學(xué)習(xí)來(lái)自動(dòng)調(diào)整這些資源并確保有效擴(kuò)展可變工作負(fù)載。
優(yōu)化的復(fù)雜性
為Kubernetes優(yōu)化應(yīng)用程序主要是確保代碼盡可能高效地使用其底層資源(即CPU和內(nèi)存)。這意味著以盡可能低的成本和最小的努力確保滿足或超過服務(wù)級(jí)別目標(biāo)的性能。
創(chuàng)建集群時(shí),我們可以在容器級(jí)別配置兩種主要資源的使用——內(nèi)存和CPU。也就是說,我們可以設(shè)置應(yīng)用程序可以使用和請(qǐng)求多少資源的限制。我們可以將這些資源設(shè)置視為我們的輸入變量,以及運(yùn)行應(yīng)用程序的性能、可靠性和資源使用(或成本)方面的輸出。隨著容器數(shù)量的增加,變量的數(shù)量也在增加,集群管理和系統(tǒng)優(yōu)化的整體復(fù)雜度呈指數(shù)級(jí)增長(zhǎng)。
圖1:我們可以將Kubernetes配置視為一個(gè)方程式,其中資源設(shè)置是我們的變量,成本、性能和可靠性是我們的結(jié)果。
更復(fù)雜的是,不同的資源參數(shù)是相互依賴的。更改一個(gè)參數(shù)可能會(huì)對(duì)集群性能和效率產(chǎn)生意想不到的影響。這意味著手動(dòng)確定最佳性能的精確配置是一項(xiàng)不可能完成的任務(wù),除非您有無(wú)限的時(shí)間和Kubernetes專家。
如果我們?cè)谌萜鞑渴鹌陂g沒有為資源設(shè)置自定義值,Kubernetes會(huì)自動(dòng)分配這些值。這里的挑戰(zhàn)是Kubernetes非??犊厥褂闷滟Y源來(lái)防止兩種情況:由于內(nèi)存不足(OOM)錯(cuò)誤導(dǎo)致的服務(wù)失敗和由于CPU節(jié)流導(dǎo)致的不合理的性能下降。但是,使用默認(rèn)配置創(chuàng)建基于云的集群會(huì)導(dǎo)致不合理的高云成本,而不能保證足夠的性能。
當(dāng)我們?cè)噲D為多個(gè)集群管理多個(gè)參數(shù)時(shí),這一切都變得更加復(fù)雜。為了優(yōu)化環(huán)境的指標(biāo)價(jià)值,機(jī)器學(xué)習(xí)系統(tǒng)可以成為不可或缺的補(bǔ)充。
機(jī)器學(xué)習(xí)優(yōu)化方法
基于機(jī)器學(xué)習(xí)的優(yōu)化有兩種通用方法,每種方法都以不同的方式提供價(jià)值。首先,基于實(shí)驗(yàn)的優(yōu)化可以在非生產(chǎn)環(huán)境中使用各種場(chǎng)景來(lái)模擬可能的生產(chǎn)場(chǎng)景。其次,通過觀察實(shí)際系統(tǒng)行為,可以在產(chǎn)品或非產(chǎn)品中執(zhí)行基于觀察的優(yōu)化。下面將介紹這兩種方法。
基于實(shí)驗(yàn)的優(yōu)化
通過實(shí)驗(yàn)進(jìn)行優(yōu)化是一種強(qiáng)大的、基于科學(xué)的方法,因?yàn)槲覀兛梢試L試任何可能的場(chǎng)景,衡量結(jié)果,調(diào)整我們的變量,然后再試一次。由于實(shí)驗(yàn)是在非生產(chǎn)環(huán)境中進(jìn)行的,因此我們只受到我們可以想象的場(chǎng)景以及執(zhí)行這些實(shí)驗(yàn)所需的時(shí)間和精力的限制。如果實(shí)驗(yàn)是手動(dòng)完成的,所需的時(shí)間和精力可能會(huì)很大。這就是機(jī)器學(xué)習(xí)和自動(dòng)化的用武之地。
讓我們探索基于實(shí)驗(yàn)的優(yōu)化在實(shí)踐中是如何工作的。
第1步:識(shí)別變量
要設(shè)置實(shí)驗(yàn),我們必須首先確定可以調(diào)整哪些變量(也稱為參數(shù))。這些通常是CPU和內(nèi)存請(qǐng)求和限制、副本以及特定于應(yīng)用程序的參數(shù),例如JVM堆大小和垃圾收集設(shè)置。
一些ML優(yōu)化解決方案可以掃描您的集群以自動(dòng)識(shí)別可配置參數(shù)。此掃描過程還捕獲集群的當(dāng)前值或基線值,作為我們實(shí)驗(yàn)的起點(diǎn)。
第2步:設(shè)定優(yōu)化目標(biāo)
接下來(lái),您必須指定您的目標(biāo)。換句話說,您試圖最小化或最大化哪些指標(biāo)?一般而言,目標(biāo)將由代表權(quán)衡的多個(gè)指標(biāo)組成,例如性能與成本。例如,您可能希望最大限度地提高吞吐量,同時(shí)最大限度地降低資源成本。
一些優(yōu)化解決方案將允許您對(duì)每個(gè)優(yōu)化目標(biāo)應(yīng)用權(quán)重,因?yàn)樵谀承┣闆r下性能可能比成本更重要,反之亦然。此外,您可能希望為每個(gè)目標(biāo)指定邊界。例如,您可能甚至不想考慮導(dǎo)致性能低于特定閾值的任何場(chǎng)景。提供這些護(hù)欄將有助于提高實(shí)驗(yàn)過程的速度和效率。
以下是為優(yōu)化目標(biāo)選擇正確指標(biāo)的一些注意事項(xiàng):
如果容器化應(yīng)用程序是基于事務(wù)的,請(qǐng)盡量減少響應(yīng)時(shí)間和錯(cuò)誤率。在這種情況下,最大速度是理想的,資源使用問題不大。
如果應(yīng)用程序僅用于計(jì)算,請(qǐng)將錯(cuò)誤率降至最低。我們希望優(yōu)化性能效率。
如果應(yīng)用程序處理數(shù)據(jù),速度可能是次要的。優(yōu)化成本。
當(dāng)然,這些只是幾個(gè)例子。確定適當(dāng)?shù)闹笜?biāo)以優(yōu)先考慮需要開發(fā)人員和負(fù)責(zé)業(yè)務(wù)運(yùn)營(yíng)的人員之間的溝通。確定組織的主要目標(biāo)。然后檢查該技術(shù)如何實(shí)現(xiàn)這些目標(biāo)以及實(shí)現(xiàn)這些目標(biāo)需要什么。最后,制定一個(gè)計(jì)劃,強(qiáng)調(diào)最能平衡成本和功能的指標(biāo)。
第3步:建立優(yōu)化方案
使用基于實(shí)驗(yàn)的方法,我們需要建立場(chǎng)景以優(yōu)化并將這些場(chǎng)景構(gòu)建到負(fù)載測(cè)試中。這可能是一系列預(yù)期的用戶流量或特定場(chǎng)景,例如基于零售假期的流量高峰。此性能測(cè)試將在實(shí)驗(yàn)過程中用于模擬生產(chǎn)負(fù)載。
第4步:運(yùn)行實(shí)驗(yàn)
一旦我們?cè)O(shè)置了優(yōu)化目標(biāo)和可調(diào)參數(shù)的實(shí)驗(yàn),我們就可以開始實(shí)驗(yàn)了。一個(gè)實(shí)驗(yàn)由多個(gè)試驗(yàn)組成,您的優(yōu)化解決方案在每個(gè)試驗(yàn)中迭代以下步驟:
實(shí)驗(yàn)控制器使用第一次試驗(yàn)的基線參數(shù)在您的集群中運(yùn)行容器化應(yīng)用程序。
然后控制器運(yùn)行之前創(chuàng)建的性能測(cè)試,為我們的優(yōu)化方案應(yīng)用負(fù)??載到系統(tǒng)。
控制器捕獲與我們的目標(biāo)相對(duì)應(yīng)的指標(biāo),例如持續(xù)時(shí)間和資源成本。
機(jī)器學(xué)習(xí)算法分析結(jié)果,然后為下一次試驗(yàn)計(jì)算一組新參數(shù)。
然后重復(fù)此過程,但在配置實(shí)驗(yàn)時(shí)指定了許多試驗(yàn)。典型的實(shí)驗(yàn)范圍從20到200次試驗(yàn),更多的參數(shù)需要更多的試驗(yàn)才能獲得明確的結(jié)果。
機(jī)器學(xué)習(xí)引擎使用每次試驗(yàn)的結(jié)果來(lái)構(gòu)建表示多維參數(shù)空間的模型。在這個(gè)空間中,它可以檢查彼此相關(guān)的參數(shù)。隨著每次迭代,ML引擎更接近于識(shí)別優(yōu)化目標(biāo)指標(biāo)的配置。
第5步:分析結(jié)果
雖然機(jī)器學(xué)習(xí)會(huì)自動(dòng)推薦能夠產(chǎn)生最佳結(jié)果的配置,但一旦實(shí)驗(yàn)完成,就可以進(jìn)行額外的分析。例如,您可以可視化兩個(gè)不同目標(biāo)之間的權(quán)衡,查看哪些參數(shù)對(duì)結(jié)果有重大影響,哪些參數(shù)不太重要。
結(jié)果通常令人驚訝,并可能導(dǎo)致關(guān)鍵的架構(gòu)改進(jìn):例如,確定大量較小的副本比較少數(shù)量的“較重”副本更有效。
圖2:實(shí)驗(yàn)結(jié)果可以可視化和分析,以充分了解系統(tǒng)行為。
基于觀察的優(yōu)化
雖然基于實(shí)驗(yàn)的優(yōu)化對(duì)于分析廣泛的場(chǎng)景非常強(qiáng)大,但不可能預(yù)測(cè)每一種可能的情況。此外,高度可變的用戶流量意味著某個(gè)時(shí)間點(diǎn)的最佳配置可能不會(huì)隨著事情的變化而變得最佳。Kubernetes自動(dòng)擴(kuò)縮器可以提供幫助,但它們基于歷史使用情況,沒有考慮應(yīng)用程序性能。
這就是基于觀察的優(yōu)化可以提供幫助的地方。讓我們看看它是如何工作的。
第1步:配置應(yīng)用程序
根據(jù)您使用的優(yōu)化解決方案,為基于觀察的優(yōu)化配置應(yīng)用程序可能包括以下步驟:
指定命名空間和可選的標(biāo)簽選擇器,以識(shí)別要調(diào)整的資源。
為要調(diào)整的CPU和內(nèi)存參數(shù)指定護(hù)欄(最小值和最大值)。
指定系統(tǒng)建議更新參數(shù)設(shè)置的頻率。
指定是自動(dòng)部署建議還是經(jīng)批準(zhǔn)部署。
第2步:機(jī)器學(xué)習(xí)分析
配置完成后,機(jī)器學(xué)習(xí)引擎開始分析從Prometheus、Datadog或其他可觀察性工具收集的可觀察性數(shù)據(jù),以了解實(shí)際資源使用情況和應(yīng)用程序性能趨勢(shì)。然后系統(tǒng)開始在配置期間指定的時(shí)間間隔提出建議。
第3步:部署建議
如果您在配置期間指定自動(dòng)實(shí)施建議,則優(yōu)化解決方案將根據(jù)推薦的配置自動(dòng)修補(bǔ)部署。如果您選擇手動(dòng)部署,您可以在決定是否批準(zhǔn)之前查看建議,包括容器級(jí)別的詳細(xì)信息。
最佳實(shí)踐
您可能已經(jīng)注意到,基于觀察的優(yōu)化比基于實(shí)驗(yàn)的方法更簡(jiǎn)單。它以更少的努力更快地提供價(jià)值,但另一方面,基于實(shí)驗(yàn)的優(yōu)化更強(qiáng)大,并且可以提供使用基于觀察的方法無(wú)法實(shí)現(xiàn)的深入的應(yīng)用程序洞察力。
使用哪種方法不應(yīng)該是一個(gè)非此即彼的決定:這兩種方法都有自己的位置,可以共同縮小產(chǎn)品和非產(chǎn)品之間的差距。以下是一些需要考慮的準(zhǔn)則:
由于基于觀察的優(yōu)化易于實(shí)施并且可以快速看到改進(jìn),因此應(yīng)該在您的環(huán)境中廣泛部署。
對(duì)于將受益于更深層次的分析的更復(fù)雜或關(guān)鍵的應(yīng)用程序,使用基于實(shí)驗(yàn)的優(yōu)化來(lái)補(bǔ)充基于觀察的優(yōu)化。
基于觀察的優(yōu)化也可用于識(shí)別需要由基于實(shí)驗(yàn)的優(yōu)化提供的更深入分析的場(chǎng)景。
然后,使用基于觀察的方法在生產(chǎn)環(huán)境中的優(yōu)化良性循環(huán)中不斷驗(yàn)證和改進(jìn)基于實(shí)驗(yàn)的實(shí)現(xiàn)。
圖3:同時(shí)使用基于實(shí)驗(yàn)和基于觀察的方法可創(chuàng)建系統(tǒng)、持續(xù)優(yōu)化的良性循環(huán)。
結(jié)論
優(yōu)化我們的Kubernetes環(huán)境以最大限度地提高效率(性能與成本)、智能擴(kuò)展并實(shí)現(xiàn)我們的業(yè)務(wù)目標(biāo)需要:
在部署之前對(duì)我們的應(yīng)用程序和環(huán)境參數(shù)進(jìn)行理想配置
部署后持續(xù)監(jiān)控和調(diào)整
對(duì)于小型環(huán)境,這項(xiàng)任務(wù)是艱巨的。對(duì)于在Kubernetes上大規(guī)模運(yùn)行應(yīng)用程序的組織來(lái)說,這可能已經(jīng)超出了體力勞動(dòng)的范圍。幸運(yùn)的是,機(jī)器學(xué)習(xí)可以彌合自動(dòng)化差距,并為在各個(gè)層面優(yōu)化Kubernetes環(huán)境提供強(qiáng)大的洞察力。