本文探讨了几种容器调度策略,并以内存约束为例,讨论了如何利用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:经济高效的容器调度的更多相关文章

  1. 实战Docker容器调度

    目录 一.前言 二.Docker Compose 2.1.简介 2.2.下载安装 2.3.小实验 2.4.小实验的细节 2.5.Compose file的编写规则 三.Docker Swarm 3.1 ...

  2. Docker(六):Docker 三剑客之 Docker Swarm

    实践中会发现,生产环境中使用单个 Docker 节点是远远不够的,搭建 Docker 集群势在必行.然而,面对 Kubernetes, Mesos 以及 Swarm 等众多容器集群系统,我们该如何选择 ...

  3. 云计算之路-阿里云上-容器难容:容器服务故障以及自建 docker swarm 集群故障

    3月21日,由于使用阿里云服务器自建 docker swarm 集群的不稳定,我们将自建 docker swarm 集群上的所有应用切换阿里云容器服务 swarm 版(非swarm mode). 3月 ...

  4. [docker swarm] 从单容器走向负载均衡部署

    背景 之前写过<<docker-compose真香>> 和<docker-compose.docker stack前世今生>两篇博客, 回顾一下思路: ① dock ...

  5. 28. docker swarm 容器编排简介

    1.采用集群架构 集群架构包含节点和角色 docker 节点中 包含 worker 和 manager 两个角色 manager 相当于 swarm 集群的 大脑  是用来管理配置节点的 (避免单点故 ...

  6. 云计算之路-阿里云上-容器难容:自建docker swarm集群遭遇无法解决的问题

    我们从今年6月开始在生产环境进行 docker 容器化部署,将已经迁移至 ASP.NET Core 的站点部署到 docker swarm 集群上.开始我们选用的阿里云容器服务,但是在使用过程中我们遭 ...

  7. Docker Swarm 中最重要的概念- 每天5分钟玩转 Docker 容器技术(94)

    从主机的层面来看,Docker Swarm 管理的是 Docker Host 集群.所以先来讨论一个重要的概念 - 集群化(Clustering). 服务器集群由一组网络上相互连接的服务器组成,它们一 ...

  8. 云计算之路-阿里云上-容器难容:优化自建 docker swarm 集群的部署

    在上周六遭遇阿里云容器服务 swarm 版的故障之后,我们决定还是走自建 docker swarm 之路,只要不是阿里云底层的问题,我们相信会找到办法解决或避开自建 docker swarm 不稳定的 ...

  9. 使用容器编排工具docker swarm安装clickhouse多机集群

    1.首先需要安装docker最新版,docker 目前自带swarm容器编排工具 2.选中一台机器作为master,执行命令sudo docker  swarm init [options] 3,再需 ...

随机推荐

  1. PHP苹果推送实现(APNS)

    以下资料网上收集整理得来 1.在ios dev center制作相关证书和文件用客户端实现(不再赘述,网上很多,) 网上教程: http://blog.csdn.net/lizhenning87/ar ...

  2. jquery ajax跨越

    JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问 1.jsonp之$.ajax js $.ajax({ ...

  3. cmd下带参数执行python文件

    在一个文件下下创建程序代码,     sys.argv 即后续cmd中需要传入的参数列表,     sys.argv[0]即要执行的文件名     sys.argv[n]即参数的字符串 # -*- c ...

  4. jnhs-SpringMVC jsp页面向controller传递参数的五种方式

    一共是五种传参方式: 一:直接将请求参数名作为Controller中方法的形参 public  String login (String username,String password)   : 解 ...

  5. php 抽奖概率算法

    lottery.php <?php //转自https://segmentfault.com/a/1190000007431893 /* * 不同概率的抽奖原理就是把0到*(比重总数)的区间分块 ...

  6. tcpdump命令介绍

    命令格式为:tcpdump [-nn] [-i 接口] [-w 储存档名] [-c 次数] [-Ae] [-qX] [-r 文件] [所欲捕获的数据内容] 参数: -nn,直接以 IP 及 Port ...

  7. LINUX常见服务列表

    服务名        必需(是/否)用途描述        注解 acon              否       语言支持        特别支持左手书写语言:阿拉伯语,波斯语和希伯莱语 acpi ...

  8. NKOJ1469 通向自由的钥匙

    P1469通向自由的钥匙   时间限制 : 10000 MS   空间限制 : 65536 KB 问题描述 通向自由的钥匙被放n个房间里,这n个房间由n-1条走廊连接.但是每个房间里都有特别 的保护魔 ...

  9. 【洛谷】 P1420 最长连号

    题目描述 输入n个正整数,(1<=n<=10000),要求输出最长的连号的长度.(连号指从小到大连续自然数) 输入输出格式 输入格式: 第一行,一个数n; 第二行,n个正整数,之间用空格隔 ...

  10. Leetcode572.Subtree of Another Tree另一个树的子树

    给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树.s 的一个子树包括 s 的一个节点和这个节点的所有子孙.s 也可以看做它自身的一棵子树. 示例 1: 给定的树 ...