超大规模商用 K8s 场景下,阿里巴巴如何动态解决容器资源的按需分配问题?
作者 | 張曉宇(衷源) 阿里云容器平臺技術(shù)專家
關(guān)注『阿里巴巴云原生』公眾號,回復(fù)關(guān)鍵詞“1010”,可獲取本文 PPT。
**導(dǎo)讀:**資源利用率一直是很多平臺管理和研發(fā)人員關(guān)心的話題。本文作者通過阿里巴巴容器平臺團隊在這一領(lǐng)域的工作實踐,整理出了一套資源利用提升的方案,希望能夠帶給大家?guī)硪恍┯懻摵退伎肌?/p>
引言
不知道大家有沒有過這樣的經(jīng)歷:當(dāng)我們擁有了一套 Kubernetes 集群,然后開始部署應(yīng)用的時候,我們應(yīng)該給容器分配多少資源呢?
這很難說。由于 Kubernetes 自己的機制,我們可以理解容器的資源實質(zhì)上是一個靜態(tài)的配置。
- 如果我發(fā)現(xiàn)資源不足,為了分配給容器更多資源,我們需要重建 Pod;
- 如果分配冗余的資源,那么我們的 worker node 節(jié)點似乎又部署不了多少容器。
試問,我們能做到容器資源的按需分配嗎?接下來,我們將在本次分享中和大家一起進行探討這個問題的答案。
生產(chǎn)環(huán)境中的真實挑戰(zhàn)
首先請允許我們根據(jù)我們的實際情況拋出我們實際生產(chǎn)環(huán)境的挑戰(zhàn)。或許大家還記得 2018 年的天貓雙 11,這一天的總成交額達到了 2135 億。由此一斑可窺全豹,能夠支撐如此龐大規(guī)模的交易量背后的系統(tǒng),其應(yīng)用種類和數(shù)量應(yīng)該是怎樣的一種規(guī)模。
在這種規(guī)模下,我們常常聽到的容器調(diào)度,如:容器編排,負載均衡,集群擴縮容,集群升級,應(yīng)用發(fā)布,應(yīng)用灰度等等這些詞,在被“超大規(guī)模集群”這個詞修飾后,都不再是件容易處理的事情。規(guī)模本身也就是我們最大的挑戰(zhàn)。如何運營和管理好這么一個龐大的系統(tǒng),并遵循業(yè)界 dev-ops 宣傳的那樣效果,猶如讓大象去跳舞。但是馬老師曾說過,大象就該干大象該干的事情,為什么要去跳舞呢。
Kubernetes 的幫助
大象是否可以跳舞,帶著這個問題,我們需要從淘寶、天貓等 APP 背后系統(tǒng)說起。
這套互聯(lián)網(wǎng)系統(tǒng)應(yīng)用部署大致可分為三個階段,傳統(tǒng)部署,虛擬機部署和容器部署。相比于傳統(tǒng)部署,虛擬機部署有了更好的隔離性和安全性,但是在性能上不可避免的產(chǎn)生了大量損耗。而容器部署又在虛擬機部署實現(xiàn)隔離和安全的背景下,提出了更輕量化的解決方案。我們的系統(tǒng)也是沿著這么一條主航道上運行的。假設(shè)底層系統(tǒng)好比一艘巨輪,面對巨量的集裝箱—容器,我們需要一個優(yōu)秀的船長,對它們進行調(diào)度編排,讓系統(tǒng)這艘大船可以避開層層險阻,操作難度降低,且具備更多靈活性,最終達成航行的目的。
理想與現(xiàn)實
在開始之初,想到容器化和 Kubernetes 的各種美好場景,我們理想中的容器編排效果應(yīng)該是這樣的:
- 從容:我們的工程師更加從容的面對復(fù)雜的挑戰(zhàn),不再眉頭緊鎖而是更多笑容和自信;
- 優(yōu)雅:每一次線上變更操作都可以像品著紅酒一樣氣定神閑,優(yōu)雅地按下執(zhí)行的回車鍵;
- 有序:從開發(fā)到測試,再到灰度發(fā)布,一氣呵成,行云流水;
- 穩(wěn)定:系統(tǒng)健壯性良好,任爾東西南北風(fēng),我們系統(tǒng)巋然不動。全年系統(tǒng)可用性 N 多個 9;
- 高效:節(jié)約出更多人力,實現(xiàn)“快樂工作,認真生活”。
然而理想很豐滿,現(xiàn)實很骨感。迎接我們的卻是雜亂和形態(tài)各異的窘迫。
雜亂,是因為作為一個異軍突起的新型技術(shù)棧,很多配套工具和工作流的建設(shè)處于初級階段。Demo 版本中運行良好的工具,在真實場景下大規(guī)模鋪開,各種隱藏的問題就會暴露無遺,層出不窮。從開發(fā)到運維,所有的工作人員都在各種被動地疲于奔命。另外,“大規(guī)模鋪開”還意味著,要直接面對形態(tài)各異的生產(chǎn)環(huán)境:異構(gòu)配置的機器、復(fù)雜的需求,甚至是適配用戶的既往的使用習(xí)慣等等。
除了讓人心力交瘁的混亂,系統(tǒng)還面臨著應(yīng)用容器的各種崩潰問題:內(nèi)存不足導(dǎo)致的 OOM,CPU quota 分配太少,導(dǎo)致進程被 throttle,還有帶寬不足,響應(yīng)時延大幅上升…甚至是交易量在面對訪問高峰時候由于系統(tǒng)不給力導(dǎo)致的斷崖式下跌等等。這些都使我們在大規(guī)模商用 Kubernetes 場景中積累非常多的經(jīng)驗。
直面問題
穩(wěn)定性
問題總要進行面對的。正如某位高人說過:如果感覺哪里不太對,那么肯定有些地方出問題了。于是我們就要剖析,問題究竟出在哪里。針對于內(nèi)存的 OOM,CPU 資源被 throttle,我們可以推斷我們給與容器分配的初始資源不足。
資源不足就勢必造成整個應(yīng)用服務(wù)穩(wěn)定性下降。例如上圖的場景:雖然是同一種應(yīng)用的副本,或許是由于負載均衡不夠強大,或者是由于應(yīng)用自身的原因,甚至是由于機器本身是異構(gòu)的,相同數(shù)值的資源,可能對于同一種應(yīng)用的不同副本并具有相等的價值和意義。在數(shù)值上他們看似分配了相同的資源,然而在實際負載工作時,極有可能出現(xiàn)的現(xiàn)象是肥瘦不均的。
而在資源 overcommit 的場景下,應(yīng)用在整個節(jié)點資源不足,或是在所在的 CPU share pool 資源不足時,也會出現(xiàn)嚴重的資源競爭關(guān)系。資源競爭是對應(yīng)用穩(wěn)定性最大的威脅之一。所以我們要盡力在生產(chǎn)環(huán)境中清除所有的威脅。
我們都知道穩(wěn)定性是件很重要的事情,尤其對于掌控上百萬容器生殺大權(quán)的一線研發(fā)人員。或許不經(jīng)心的一個操作就有可能造成影響面巨大的生產(chǎn)事故。
因此,我們也按照一般流程做了系統(tǒng)預(yù)防和兜底工作。
- 在預(yù)防維度,我們可以進行全鏈路的壓力測試,并且提前通過科學(xué)的手段預(yù)判應(yīng)用需要的副本數(shù)和資源量。如果沒法準(zhǔn)確預(yù)算資源,那就只采用冗余分配資源的方式了。
- 在兜底維度,我們可以在大規(guī)模訪問流量抵達后,對不緊要的業(yè)務(wù)做服務(wù)降級并同時對主要應(yīng)用進行臨時擴容。
但是對于陡然增加幾分鐘的突增流量,這么多組合拳的花費不菲,似乎有些不劃算。或許我們可以提出一些解決方案,達到我們的預(yù)期。
資源利用率
回顧一下我們的應(yīng)用部署情況:節(jié)點上的容器一般分屬多種應(yīng)用,這些應(yīng)用本身不一定,也一般不會同時處于訪問的高峰。對于混合部署應(yīng)用的宿主機,如果能都錯峰分配上面運行容器的資源或許更科學(xué)。
應(yīng)用的資源需求可能就像月亮一樣有陰晴圓缺,有周期變化。例如在線業(yè)務(wù),尤其是交易業(yè)務(wù),它們在資源使用上呈現(xiàn)一定的周期性,例如:在凌晨、上午時,它的使用量并不是很高,而在午間、下午時會比較高。
打個比方:對于 A 應(yīng)用的重要時刻,對于 B 應(yīng)用可能不那么重要,適當(dāng)打壓 B 應(yīng)用,騰挪出資源給 A 應(yīng)用,這是個不錯的選擇。這聽起來有點像是分時復(fù)用的感覺。但是如果我們按照流量峰值時的需求配置資源就會產(chǎn)生大量的浪費。
除了對于實時性要求很高的在線應(yīng)用外,我們還有離線應(yīng)用和實時計算應(yīng)用等:離線計算對于 CPU 、Memory 或網(wǎng)絡(luò)資源的使用以及時間不那么敏感,所以在任何時間段它都可以運行;實時計算,可能對于時間敏感性就會很高。
早期,我們業(yè)務(wù)是在不同的節(jié)點按照應(yīng)用的類型獨立進行部署。從上面這張圖來看,如果它們進行分時復(fù)用資源,針對實時性這個需求層面,我們會發(fā)現(xiàn)它實際的最大使用量不是 2 2 1=5,而是某一時刻重要緊急應(yīng)用需求量的最大值,也就是 3 。如果我們能夠數(shù)據(jù)監(jiān)測到每個應(yīng)用的真實使用量,給它分配合理值,那么就能產(chǎn)生資源利用率提升的實際效果。
對于電商應(yīng)用,對于采用了重量級 Java 框架和相關(guān)技術(shù)棧的 Web 應(yīng)用,短時間內(nèi) HPA 或者 VPA 都不是件容易的事情。
先說 HPA,我們或許可以秒級拉起了 Pod,創(chuàng)建新的容器,然而拉起的容器是否真的可用呢。從創(chuàng)建到可用,可能需要比較久的時間,對于大促和搶購秒殺-這種訪問量“洪峰”可能僅維持幾分鐘或者十幾分鐘的實際場景,如果我們等到 HPA 的副本全部可用,可能市場活動早已經(jīng)結(jié)束了。
至于社區(qū)目前的 VPA 場景,刪掉舊 Pod,創(chuàng)建新 Pod,這樣的邏輯更難接受。所以綜合考慮,我們需要一個更實際的解決方案彌補 HPA 和 VPA 的在這一單機資源調(diào)度的空缺。
解決方案
交付標(biāo)準(zhǔn)
我們首先要對解決方案設(shè)定一個可以交付的標(biāo)準(zhǔn)那就是—— “既要穩(wěn)定性,也要利用率,還要自動化實施,當(dāng)然如果能夠智能化那就更好”,然后再交付標(biāo)準(zhǔn)進行細化:
- 安全穩(wěn)定:工具本身高可用。所用的算法和實施手段必須做到可控;
- 業(yè)務(wù)容器按需分配資源:可以及時根據(jù)業(yè)務(wù)實時資源消耗對不太久遠的將來進行資源消耗預(yù)測,讓用戶明白業(yè)務(wù)接下來對于資源的真實需求;
- 工具本身資源開銷小:工具本身資源的消耗要盡可能小,不要成為運維的負擔(dān);
- 操作方便,擴展性強:能做到無需接受培訓(xùn)即可玩轉(zhuǎn)這個工具,當(dāng)然工具還要具有良好擴展性,供用戶 DIY;
- 快速發(fā)現(xiàn) & 及時響應(yīng):實時性,也就是最重要的特質(zhì),這也是和HPA或者VPA在解決資源調(diào)度問題方式不同的地方。
設(shè)計與實現(xiàn)
上圖是我們最初的工具流程設(shè)計:當(dāng)一個應(yīng)用面臨很高的業(yè)務(wù)訪問需求時,體現(xiàn)在 CPU、Memory 或其他資源類型需求量變大,我們根據(jù) Data Collector 采集的實時基礎(chǔ)數(shù)據(jù),利用 Data Aggregator 生成某個容器或整個應(yīng)用的畫像,再將畫像反饋給 Policy engine。 Policy engine 會瞬時快速修改容器 Cgroup 文件目錄下的的參數(shù)。
我們最早的架構(gòu)和我們的想法一樣樸實,在 kubelet 進行了侵入式的修改。雖然我們只是加了幾個接口,但是這種方式確實不夠優(yōu)雅。每次 kubenrnetes 升級,對于 Policy engine 相關(guān)組件升級也有一定的挑戰(zhàn)。
為了做到快速迭代并和 Kubelet 解耦,我們對于實現(xiàn)方式進行了新的演進。那就是將關(guān)鍵應(yīng)用容器化。這樣可以達到以下功效:
- 不侵入修改 K8s 核心組件;
- 方便迭代&發(fā)布;
- 借助于 Kubernetes 相關(guān)的 QoS Class 機制,容器的資源配置,資源開銷可控。
當(dāng)然在后續(xù)演進中,我們也在嘗試和 HPA,VPA 進行打通,畢竟這些和 Policy engine 存在著互補的關(guān)系。因此我們架構(gòu)進一步演進成如下情形。當(dāng) Policy engine 在處理一些更多復(fù)雜場景搞到無力時,上報事件讓中心端做出更全局的決策。水平擴容或是垂直增加資源。
下面我們具體討論一下 Policy engine 的設(shè)計。Policy engine 是單機節(jié)點上進行智能調(diào)度并執(zhí)行 Pod 資源調(diào)整的核心組件。它主要包括 api server,指揮中心 command center 和執(zhí)行層 executor。
- 其中 api server 用于服務(wù)外界對于 policy engine 運行狀態(tài)的查詢和設(shè)置的請求;
- command center 根據(jù)實時的容器畫像和物理機本身的負載以及資源使用情況,作出 Pod 資源調(diào)整的決策;
- Executor 再根據(jù) command center 的決策,對容器的資源限制進行調(diào)整。同時,executor 也把每次調(diào)整的 revision info 持久化,以便發(fā)生故障時可以回滾。
指揮中心定期從 data aggregator 獲取容器的實時畫像,包括聚合的統(tǒng)計數(shù)據(jù)和預(yù)測數(shù)據(jù),首先判斷節(jié)點狀態(tài),例如節(jié)點磁盤異常,或者網(wǎng)絡(luò)不通,表示該節(jié)點已經(jīng)發(fā)生異常,需要保護現(xiàn)場,不再對Pod進行資源調(diào)整,以免造成系統(tǒng)震蕩,影響運維和調(diào)試。如果節(jié)點狀態(tài)正常,指揮中心會策略規(guī)則,對容器數(shù)據(jù)進行再次過濾。比如容器 CPU 率飆高,或者容器的響應(yīng)時間超過安全閾值。如果條件滿足,則對滿足條件的容器集合給出資源調(diào)整建議,傳遞給executor。
在架構(gòu)設(shè)計上,我們遵循了以下原則:
-
插件化:所有的規(guī)則和策略被設(shè)計為可以通過配置文件來修改,盡量與核心控制流程的代碼解耦,與 data collector 和 data aggregator 等其他組件的更新和發(fā)布解耦,提升可擴展性;
-
穩(wěn)定,這包括以下幾個方面:
- 控制器穩(wěn)定性。指揮中心的決策以不影響單機乃至全局穩(wěn)定性為前提,包括容器的性能穩(wěn)定和資源分配穩(wěn)定。例如,目前每個控制器僅負責(zé)一種 cgroup 資源的控制,即在同一時間窗口內(nèi),Policy engine 不同時調(diào)整多種資源,以免造成資源分配震蕩,干擾調(diào)整效果;
- 觸發(fā)規(guī)則穩(wěn)定性。例如,某一條規(guī)則的原始觸發(fā)條件為容器的性能指標(biāo)超出安全閾值,但是為避免控制動作被某一突發(fā)峰值觸發(fā)而導(dǎo)致震蕩,我們把觸發(fā)規(guī)則定制為:過去一段時間窗口內(nèi)性能指標(biāo)的低百分位超出安全閾值;如果規(guī)則滿足,說明這段時間內(nèi)絕大部分的性能指標(biāo)值都已經(jīng)超出了安全閾值,就需要觸發(fā)控制動作了;
- 另外,與社區(qū)版 Vertical-Pod-Autoscaler 不同,Policy engine 不主動驅(qū)逐騰挪容器,而是直接修改容器的 cgroup 文件;
-
自愈:資源調(diào)整等動作的執(zhí)行可能會產(chǎn)生一些異常,我們在每個控制器內(nèi)都加入了自愈回滾機制,保證整個系統(tǒng)的穩(wěn)定性;
-
不依賴應(yīng)用先驗知識:為所有不同的應(yīng)用分別進行壓測、定制策略,或者提前對可能排部在一起的應(yīng)用進行壓測,會導(dǎo)致巨大開銷,可擴展性降低。我們的策略在設(shè)計上盡可能通用,盡量采用不依賴于具體平臺、操作系統(tǒng)、應(yīng)用的指標(biāo)和控制策略。
在資源調(diào)整方面,Cgroup 支持我們對各個容器的 CPU、內(nèi)存、網(wǎng)絡(luò)和磁盤 IO 帶寬資源進行隔離和限制,目前我們主要對容器的 CPU 資源進行調(diào)整,同時在測試中探索在時分復(fù)用的場景下動態(tài)調(diào)整 memory limit 和 swap usage 而避免 OOM 的可行性;在未來我們將支持對容器的網(wǎng)絡(luò)和磁盤 IO 的動態(tài)調(diào)整。
調(diào)整效果
上圖展示了我們在測試集群得到的一些實驗結(jié)果。我們把高優(yōu)先級的在線應(yīng)用和低優(yōu)先級的離線應(yīng)用混合部署在測試集群里。SLO 是 250ms,我們希望在線應(yīng)用的 latency 的 95 百分位值低于閾值 250ms。
在實驗結(jié)果中可以看到:
- 在大約90s前,在線應(yīng)用的負載很低;latency 的均值和百分位都在 250ms 以下;
- 到了 90s后,我們給在線應(yīng)用加壓,流量增加,負載也升高,導(dǎo)致在線應(yīng)用 latency 的 95 百分位值超過了 SLO;
- 在大約 150s 左右,我們的小步快跑控制策略被觸發(fā),漸進式地 throttle 與在線應(yīng)用發(fā)生資源競爭的離線應(yīng)用;
- 到了大約 200s 左右,在線應(yīng)用的性能恢復(fù)正常,latency 的 95 百分位回落到 SLO 以下。
這說明了我們的控制策略的有效性。
經(jīng)驗和教訓(xùn)
下面我們總結(jié)一下在整個項目的進行過程中,我們收獲的一些經(jīng)驗和教訓(xùn),希望這些經(jīng)驗教訓(xùn)能夠?qū)τ龅筋愃茊栴}和場景的人有所幫助。
總結(jié)與展望
總結(jié)起來,我們的工作主要實現(xiàn)了以下幾方面的收益:
- 通過分時復(fù)用以及將不同優(yōu)先級的容器(也就是在線和離線任務(wù))混合部署,并且通過對容器資源限制的動態(tài)調(diào)整,保證了在線應(yīng)用在不同負載情況下都能得到足夠的資源,從而提高集群的綜合資源利用率。
- 通過對單機節(jié)點上的容器資源的智能動態(tài)調(diào)整,降低了應(yīng)用之間的性能干擾,保障高優(yōu)先級應(yīng)用的性能穩(wěn)定性
- 各種資源調(diào)整策略通過 Daemonset 部署,可以自動地、智能地在節(jié)點上運行,減少人工干預(yù),降低了運維的人力成本。
展望未來,我們希望在以下幾個方面加強和擴展我們的工作:
- 閉環(huán)控制鏈路:前面已經(jīng)提到,單機節(jié)點上由于缺乏全局信息,對于資源的調(diào)整有其局限性,只能盡力而為。未來,我們希望能夠打通與 HPA 和 VPA 的通路,使單機節(jié)點和中心端聯(lián)動進行資源調(diào)整,最大化彈性伸縮的收益。
- 容器重新編排:即使是同一個應(yīng)用,不同容器的負載和所處的物理環(huán)境也是動態(tài)變化的,單機上調(diào)整 pod 的資源,不一定能夠滿足動態(tài)的需求。我們希望單機上實時容器畫像,能夠為中心端提供更多的有效信息,幫助中心端的調(diào)度器作出更加智能的容器重編排決策。
- 策略智能化:我們現(xiàn)在的資源調(diào)整策略仍然比較粗粒度,可以調(diào)整的資源也比較有限;后續(xù)我們希望讓資源調(diào)整策略更加智能化,并且考慮到更多的資源,比如對磁盤和網(wǎng)絡(luò)IO帶寬的調(diào)整,提高資源調(diào)整的有效性。
- 容器畫像精細化:目前的容器畫像也比較粗糙,僅僅依靠統(tǒng)計數(shù)據(jù)和線性預(yù)測;刻畫容器性能的指標(biāo)種類也比較局限。我們希望找到更加精確的、通用的、反映容器性能的指標(biāo),以便更加精細地刻畫容器當(dāng)前的狀態(tài)和對不同資源的需求程度。
- 查找干擾源:我們希望能找到在單機節(jié)點上找到行之有效的方案,來精準(zhǔn)定位應(yīng)用性能受損時的干擾源;這對策略智能化也有很大意義。
Q & A
**Q1:**直接修改 cgroup 容器一定會獲得資源嗎?
**A1:**容器技術(shù)隔離的技術(shù)基礎(chǔ)就是 cgroup 層面。在宿主機騰出足夠資源的情況下,給 cgroup 設(shè)置更大的值可以獲取更多的資源。同理,對于一般優(yōu)先級不高的應(yīng)用,設(shè)置較低的 cgroup 資源值就會達到抑制容器運行的效果。
**Q2:**底層是如何區(qū)分在線和離線優(yōu)先級的?
**A2:**底層是無法自動獲取誰是在線,誰是離線,或者誰的優(yōu)先級高,誰的優(yōu)先級低的。這個我們可以通過各種 Kubernetes 提供的擴展實現(xiàn)。最簡單的是通過 label,Annotation 標(biāo)識。當(dāng)然通過擴展 QoS class 也是一種思路。社區(qū)版本的 QoS class設(shè)置太過于保守,給予用戶發(fā)揮的空間不大。我們通過這些方面也進行了增強。在合適的時候或許會推向社區(qū)。自動感知是個方向,感知誰是干擾源,感知誰是某種資源型應(yīng)用,這塊我們還在研發(fā)中。做到真正的動態(tài),肯定是具備自動感知的智能系統(tǒng)。
Q3:“與社區(qū)版 Vertical-Pod-Autoscaler 不同,Policy engine 不主動驅(qū)逐騰挪容器,而是直接修改容器的 cgroup 文件”,想問一下,不主動驅(qū)逐的話,如果 Node 的資源達到上線了會怎么處理?
**A3:**這是一個好問題。首先這里要先區(qū)分是哪種資源,如果是 CPU 型的,我們可以調(diào)整低優(yōu)先級容器的 cgroup 下 cpu quota 的值,首先抑制低優(yōu)先級的容器對于 CPU 的爭搶。然后再適當(dāng)上調(diào)高優(yōu)先級容器的相關(guān)資源值。如果是內(nèi)存型資源,這個不能直接去縮小低優(yōu)先級容器的 cgroup 值,否則會造成 OOM,對于學(xué)習(xí)內(nèi)存型資源的調(diào)整,我們會在其他分享中繼續(xù)討論。這個技術(shù)比較特殊。
**Q4:**只修改 cgroup,怎么保證 K8s 對單個物理機能夠分配更多的容器?
**A4:**文字直播有了一定說明,容器的資源消耗并非是一成不變的,很多時候它們的資源消耗呈現(xiàn)潮汐現(xiàn)象,相同的資源條件下部署更多應(yīng)用,完成更多作業(yè)就是達到資源利用的最大化的效果。資源出現(xiàn)超賣才是我們這個主題討論的最大價值。
**Q5:**也就是說,低優(yōu)先級的容器,request 設(shè)置的比 limit 小很多,然后你們再動態(tài)的調(diào)整 cgroup?
**A5:**在現(xiàn)有 QoS 場景下,你可以理解被調(diào)整的 Pod 都是 burstable 的。但是我們并不是直接調(diào)整 Pod 元數(shù)據(jù)的 limit 的值,而是調(diào)整 limit 在 cgroup 反映的值,這個值在資源競爭緩和的時候還會被調(diào)整回去的。我們并不建議單機的 cgroup 數(shù)據(jù)和 etcd 的中心數(shù)據(jù)割裂太久。如果長期偏離,我們會像 VPA 發(fā)出警報,聯(lián)動 VPA 做調(diào)整。當(dāng)然在容器運行的高峰期,任何重建容器的操作都是不明智的。
**Q6:**整體的理解就是你們開始就讓物理機超配了一定比例的 pod,然后通過策略動態(tài)調(diào)整容器的 cgroup 值?
**A6:**如果資源完全是富足冗余的,這個動態(tài)調(diào)整也有一定意義。就是并非資源用滿場景下,高優(yōu)先級應(yīng)用會被干擾,實際上,當(dāng)主機的 CPU 達到一定比例,打個比方例如 50%,應(yīng)用的時延就變大。為了完全確保高優(yōu)先級應(yīng)用的 SLO,犧牲低優(yōu)先級的 CPU 正常運行也是有價值的。
**Q7:**Policy engine 有沒有考慮開源?
**A7:**有計劃進行開源,Policy engine 更多的是和自身的應(yīng)用屬性相關(guān),電商應(yīng)用或者大數(shù)據(jù)處理應(yīng)用的策略都是不相同的,我們開源會首先開源框架和附帶一些簡單的策略,更多的策略可以用戶自定義。
**Q8:**我之前遇到的大部分應(yīng)用都無法正確感知 cgroup 的配置,因此很多情況都需要在啟動參數(shù)里面根據(jù) cpu 或者 mem 設(shè)置參數(shù),那么也就是說即使改變了 cgroup 對于他們來說都無效,那么使用場景也就有限了
**A8:**限制容器的資源使用這個還是有價值的。限制低優(yōu)先級應(yīng)用本身也可以提升高優(yōu)先級應(yīng)用的 SLO,雖然效果沒有那么明顯。穩(wěn)定性的考量同樣也很重要。
**Q9:**Policy engine 目前在阿里的使用如何?在生產(chǎn)上有多上的規(guī)模使用這種方式進行動態(tài)調(diào)整?是否和社區(qū)的 HPA VPA 配合使用?
**A9: **Policy engine 在阿里某些集群已經(jīng)使用。至于規(guī)模暫時無法透漏。涉及到很多組件之間的聯(lián)動,社區(qū)的 HPA 和 VPA 目前都不太能滿足我們的需求。因此阿里的 HPA 和 VPA 都是我們自行開發(fā)的,但是和社區(qū)的原理是一致的。阿里 HPA 的開源可以關(guān)注 Openkruise 社區(qū)。VPA 開源計劃我這里還沒有確切消息。
**Q10:**當(dāng)單機節(jié)點資源不足以提供容器擴容時,目前是否可以進行 HPA 或 VPA 擴容呢?
**A10:**單機節(jié)點不足的時候,應(yīng)用可以通過 HPA 進行增加副本應(yīng)對。但是 VPA 如果選擇原節(jié)點進行更新的話,是失敗的。只能調(diào)度到其他資源豐富的節(jié)點。在流量陡升的場景下,重建容器未必能滿足需求,很可能導(dǎo)致雪崩,即重建過程中,整個應(yīng)用其他未升級的副本接受更多流量,OOM 掉,新啟動的容器再瞬間被 OOM,所以重啟容器需要慎重。快速擴容(HPA)或者快速提升高優(yōu)先級資源,抑制低優(yōu)先級容器資源的方式效果更明顯。
關(guān)注『阿里巴巴云原生』公眾號,回復(fù)關(guān)鍵詞“1010”,可獲取本文 PPT。
“ 阿里巴巴云原生微信公眾號(ID:Alicloudnative)關(guān)注微服務(wù)、Serverless、容器、Service Mesh等技術(shù)領(lǐng)域、聚焦云原生流行技術(shù)趨勢、云原生大規(guī)模的落地實踐,做最懂云原生開發(fā)者的技術(shù)公眾號。”
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的超大规模商用 K8s 场景下,阿里巴巴如何动态解决容器资源的按需分配问题?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 当 K8s 集群达到万级规模,阿里巴巴如
- 下一篇: CNCF 官方大使张磊:什么是云原生?