Docker Swarm:经济高效的容器调度
我們每天在數(shù)百臺(tái)服務(wù)器上運(yùn)行成百上千個(gè)容器,面臨的最大一個(gè)挑戰(zhàn)是怎樣高效地調(diào)度容器。容器的調(diào)度是指在一組服務(wù)器上處理容器分配的問題,以保證服務(wù)能平穩(wěn)運(yùn)行。由于這些需要調(diào)度的容器是客戶應(yīng)用程序的組件,我們必須在還未知曉其性能特點(diǎn)之前進(jìn)行調(diào)度。
不合適的調(diào)度方法會(huì)導(dǎo)致以下可能的結(jié)果:
過多的資源配置——意味著更高的成本。
過少的資源配置——意味著用戶的穩(wěn)定性差。
合適的調(diào)度方法對(duì)我們而言很重要,以經(jīng)濟(jì)高效的方式,提供最好的用戶體驗(yàn)。
隨機(jī)性調(diào)度策略
起初,在我們的早期產(chǎn)品中使用了相同的調(diào)度方法。這個(gè)方法(在Docker Swarm之前)沒有以任何方式對(duì)容器的運(yùn)行進(jìn)行約束,而只是簡單地隨機(jī)選擇一個(gè)服務(wù)器。
但是,運(yùn)行全棧環(huán)境和運(yùn)行代碼段是完全不同的事——我們很快發(fā)現(xiàn),這個(gè)解決方案并不理想。我們的服務(wù)器經(jīng)常因繁忙導(dǎo)致CPU過載和內(nèi)存不足。
硬約束條件
我們一起根據(jù)需要,定義了一種新的調(diào)度器:不再隨機(jī)選擇服務(wù)器;要能約束運(yùn)行所需的資源分配,理想情況下,還要易于部署。
幸運(yùn)的是,Docker Swarm擁有了全部這些特性,最近該工具的穩(wěn)定性也已滿足生產(chǎn)環(huán)境的要求。我們使用spread調(diào)度策略,以減少因服務(wù)器故障而損壞的容器數(shù)量。并設(shè)置了基于鏡像的類別關(guān)系,同類容器可以運(yùn)行在同樣的服務(wù)器中。
我們使用了Datadog中Docker集成功能,可詳細(xì)觀測(cè)容器使用資源的情況。Datadog包含了所有我們需要的數(shù)據(jù),可用來描述每個(gè)容器的內(nèi)存或CPU使用率,以及每個(gè)服務(wù)器的磁盤使用率。
有了這份數(shù)據(jù),我們發(fā)現(xiàn)內(nèi)存是制約因素(不是CPU或磁盤),因此,我們決定利用內(nèi)存約束來調(diào)度我們的容器。我們根據(jù)觀測(cè)到的Datalog內(nèi)存分配情況,設(shè)置我們的內(nèi)存約束在99%的位置即1GB。我們還可以手動(dòng)重置對(duì)每一個(gè)容器的約束。
??????? 結(jié)果顯示,這個(gè)約束非常有效!我們將不會(huì)再看到服務(wù)器內(nèi)存不足,或因超載而運(yùn)行緩慢。
軟約束條件
享受了這個(gè)發(fā)現(xiàn)所帶來的穩(wěn)定性,在一段時(shí)間后,我們注意到,這種策略過度占用了服務(wù)器資源。大多數(shù)容器實(shí)際的內(nèi)存使用率遠(yuǎn)遠(yuǎn)低于該內(nèi)存硬約束1GB。這意味著我們所付費(fèi)的比實(shí)際使用的多很多。
我們想要更經(jīng)濟(jì)高效,但又不能損失穩(wěn)定性。降低硬約束不是一個(gè)好的選擇,因?yàn)楹膬?nèi)存的應(yīng)用會(huì)因?yàn)檫@個(gè)約束而崩潰。
我們需要一種基于估計(jì)的約束,在必要時(shí)又可以被突破的調(diào)度方法。值得慶幸的是,Docker提供了--memory-reservation選項(xiàng)來設(shè)置內(nèi)存軟約束。當(dāng)設(shè)置該軟約束時(shí),容器可以自由地使用所需的內(nèi)存,但是,當(dāng)服務(wù)器上有內(nèi)存爭用時(shí),Docker會(huì)試圖縮減內(nèi)存到軟約束值以內(nèi)?;谲浖s束的調(diào)度會(huì)減少浪費(fèi),并設(shè)置一個(gè)硬約束來阻止失控。但Swarm沒有這個(gè)功能,所以是時(shí)候需要我們使用Go語言,給Swarm建立一個(gè)定制版本分支,可調(diào)度軟內(nèi)存約束,而不是硬約束。再使用Datadog收集數(shù)據(jù),基于概率選擇理想的軟約束閥值,并設(shè)置硬約束為容器使用的最大值。這個(gè)方法顯著地減少了浪費(fèi),而且也沒有影響到穩(wěn)定。
??????? 動(dòng)態(tài)范圍和突破
Docker1.12.0版中,最酷的一個(gè)功能是調(diào)度軟約束的能力。雖然它仍等待發(fā)布,不過我們已經(jīng)提前嘗試,可簡便地使用如下命令來調(diào)度軟約束。
docker service create --reserve-memory <soft_limit>
鑒于軟約束的成功,我們的下一步是為每個(gè)容器動(dòng)態(tài)地選擇軟約束和硬約束。因?yàn)樗械臄?shù)據(jù)都輸送到了Datadog,可通過一個(gè)查詢,得到理想的軟硬約束閾值,保持容器穩(wěn)定運(yùn)行而又不浪費(fèi)資源。敬請(qǐng)關(guān)注這個(gè)博客,我們一有結(jié)果就會(huì)讓您知道!
原文鏈接:Cost-efficient container scheduling with Docker Swarm(翻譯:陳晏娥,校對(duì):黃帥)
轉(zhuǎn)載于:https://www.cnblogs.com/hehe520/p/6147729.html
總結(jié)
以上是生活随笔為你收集整理的Docker Swarm:经济高效的容器调度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 编程之计算器
- 下一篇: 使用CodeIgniter