Docker Swarm 經濟高效的容器排程

2021-09-22 23:34:23 字數 1934 閱讀 8080

本文講的是docker swarm:經濟高效的容器排程【編者的話】本文**了幾種容器排程策略,並以記憶體約束為例,討論了如何利用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
****************************************===

譯者介紹

陳晏娥,鞍鋼集團礦業公司資訊開發中心高階工程師,專注虛擬化技術。

原文發布時間為:

2016-08-17

陳晏娥docker swarm:經濟高效的容器排程

基於經濟高效的SOA產品 ESB

現代的系統架構有太多的軟體技術 方法和工具,以至於達到幾乎不可能跟上最新的更新的程度,更不用說使用所有這些技術。例如,我們現在有soa rest soap jason rails seam ejb3 net和j2ee等等。其中一項受到許多關注的技術是soa。在大多數言過其實的宣傳似乎平息下來之後,人...

Docker Swarm排程策略

swarm在用命令swarm manager啟動swarm manager時,可用 strategy指定排程策略。swarm提供了三種排程策略計算節點的排名,在排程 例如選擇哪乙個節點執行容器時 時,取排名最前的節點。這三種排程策略是 spread binpack random random策略 隨...

docker swarm核心概念

翻譯自docker官方文件,原文 本節介紹了docker1.12中集群管理和編排特性的特有概念。節點是swarm中的乙個docker引擎例項。你也可以把它想成是乙個docker節點。你可以在乙個物理機或雲伺服器上執行多個節點,但生產環境中的swarm部署通常包括分布在多個物理機和雲平台上的docke...