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