1. 程式人生 > >Docker Swarm:經濟高效的容器排程

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 <soft_limit>

  鑑於軟約束的成功,我們的下一步是為每個容器動態地選擇軟約束和硬約束。因為所有的資料都輸送到了Datadog,可通過一個查詢,得到理想的軟硬約束閾值,保持容器穩定執行而又不浪費資源。敬請關注這個部落格,我們一有結果就會讓您知道!

  原文連結:Cost-efficient container scheduling with Docker Swarm(翻譯:陳晏娥,校對:黃帥)

相關推薦

Docker Swarm經濟高效容器排程

        本文探討了幾種容器排程策略,並以記憶體約束為例,討論瞭如何利用Docker Swarm,通過資源約束實現容器的合理排程。其中,對容器資源的約束,包括硬約束和軟約束,硬約束是指記憶體資源的實際限制條件,而軟約束則是當伺服器實際記憶體資源有足餘時,容器可自由使用

docker swarm執行 service update 過程中服務短暫不能訪問的問題

構建 實現 問題 新的 訪問 host heal port 集群 這是我們使用自建 docker swarm 集群後在部署時遇到的一個問題,使用 docker service update 命令更新服務時, docker service update -d=false

Docker應用Kubernetes(容器集群)

都沒有 docker cti exp cnblogs 企業 home fir -o 閱讀目錄: Docker應用:Hello World Docker應用:Docker-compose(容器編排) Docker應用:Kubernetes(容器集群) 前

雲計算之路-阿裏雲上-容器難容容器服務故障以及自建 docker swarm 集群故障

故障 基本 pos 應用 雲上 灰色 很大的 lead leader 3月21日,由於使用阿裏雲服務器自建 docker swarm 集群的不穩定,我們將自建 docker swarm 集群上的所有應用切換阿裏雲容器服務 swarm 版(非swarm mode)。 3月2

docker 鏡像與容器管理

docker 鏡像 容器 Docker的優勢:1、啟動非常快,秒級實現。2、資源利用率高,在機器中以進程的方式存在,一臺機器可以跑上百個docker容器。3、創建和配置後可以在任意地方運行docker,只需將其上傳到docker倉庫,用到時拉下來就可以4、易遷移,平臺依賴性不強。Docker的主要

Docker Swarm 中最重要的概念- 每天5分鐘玩轉 Docker 容器技術(94)

docker 教程 容器 swarm 從主機的層面來看,Docker Swarm 管理的是 Docker Host 集群。所以先來討論一個重要的概念 - 集群化(Clustering)。服務器集群由一組網絡上相互連接的服務器組成,它們一起協同工作。一個集群和一堆服務器最顯著的區別在於:集群能夠

雲計算之路-阿裏雲上重啟 manager 節點引發 docker swarm 集群宕機

node bili body 運行 nodes 服務 徹底 解決 ability 為了迎接春節假期後的訪問高峰,我們今天對 docker swarm 集群進行了變更操作,購買了1臺阿裏雲4核8G的服務器作為 worker 節點,由原來的 3 manager nodes +

雲計算之路-阿裏雲上3個manager節點異常造成 docker swarm 集群宕機

線索 logs 遇到 log 我們 控制臺 之路 服務 cnblogs 今天 11:29 - 11:39 左右,docker swarm 集群 3 個 manager 節點同時出現異常,造成整個集群宕機,由此給您帶來很大的麻煩,請您諒解。 受此次故障影響的站點有:博問,閃

雲計算之路-阿裏雲上docker swarm 集群再次出現故障

error: borde vsx join RKE 雲計 .sh connect con 非常非常抱歉!16:30 ~ 17:00 左右我們用於跑 ASP.NET Core 站點的 docker swarm 集群再次出現宕機,由此給您帶來了很大很大的麻煩,懇請您的諒解!

雲計算之路-阿裏雲上針對 docker swarm 故障的部署調整以及應急措施

通過 pos https 服務 note 17.1 阿裏雲 應用 應急 針對上周 docker swarm 集群的頻繁故障(詳見故障一 、故障二、故障三),我們今天對 docker swarm 集群的部署進行了如下調整。 將 docker engine 由 &ldquo

Docker(六)Docker 三劍客之 Docker Swarm

lib ini 節點數 box 流量 虛擬 .html 刪除 解釋 實踐中會發現,生產環境中使用單個 Docker 節點是遠遠不夠的,搭建 Docker 集群勢在必行。然而,面對 Kubernetes, Mesos 以及 Swarm 等眾多容器集群系統,我們該如何選擇呢?它

Docker02 Docker初識第一個Docker容器Docker鏡像

gen ech current aer digest 第一個 -- 文件 展示 目錄 [TOC] 一、第一個Docker容器 使用docker run 命令時,如果在本地沒有改鏡像,那麽會直接重Docker Hub(一個官方的鏡像庫)中拉取鏡像。 docke

docker-swarm容器固定到node節點啟動

新的 反向代理 java_home const nal tomcat placement compose span Docker-compose的編排首先這裏需要創建一個目錄mkdir /docker-compose然後在裏邊創建一個docke

『中級篇』容器編排Docker Swarm介紹(42)

滿足 部署 oss 機器 避免 cli manage imageview 合集 >原創文章,歡迎轉載。轉載請註明:轉載自IT人故事會,謝謝!>原文鏈接地址:『中級篇』容器編排Docker Swarm介紹(42) 到今天這次總結,如果跟著我一起學一起練的老鐵,完全

理解Docker(3)Docker 使用 Linux namespace 隔離容器的執行環境

來源:http://www.cnblogs.com/sammyliu/p/5878973.html 1. 基礎知識:Linux namespace 的概念     Linux 核心從版本 2.4.19 開始陸續引入了 namespace 的概念。其目的是將某個特定的全域性

Docker(五)容器資料卷2

資料卷(DockerFile新增) DockerFile: 對映象的一種原始碼級的描述檔案 1、根目錄下新建mydocker資料夾並進入 2、可在DockerFile中使用VOLUME指令來給映象新增一個或多個數據卷 VOLUME["/dataVolumeC

Docker實戰基於centos7映象建立可以ssh連結的Docker容器

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

docker 三元件映象、容器、倉庫

        Docker是開源的一個基於輕量級虛擬化技術的容器引擎專案。它通過分層映象標準化和核心虛擬化技術,使得應用開發者和運維工程師可以以統一的方式跨平臺釋出應用,並且以幾乎沒有額外開銷的情

docke學習之安裝docker並下載映象啟動容器

背景: 在工作開發時,因為某些專案需要分散式的框架或者一些叢集,由於開發與op溝通成本和時間問題,常常無法快速得到一個開發可用的測試環境,那麼就需要程式設計師在自己的測試機上安裝一些叢集和工具,但是由於測試機只有一臺,叢集例如zookeeper叢集無法安裝,所以選擇使用d

docker的三大元件映象,容器,倉庫

 Docker是開源的一個基於輕量級虛擬化技術的容器引擎專案。它通過分層映象標準化和核心虛擬化技術,使得應用開發者和運維工程師可以以統一的方式跨平臺釋出應用,並且以幾乎沒有額外開銷的情況下提供資源隔離的應用執行環境。我們目前知道的雲服務是基於作業系統級別的隔離,在同一臺物