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