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

  1. docker swarm集群指定容器启动节点

    deploy:placement:constraints:## 常用方式指定 manager或者work节点,apm节点被设为worker了,这里排除它- node.role == manager## ...

  2. 49学习容器管理平台 Docker Swarm 的基本概念和应用,包括节点管理、服务编排

    Docker Swarm 是 Docker 官方提供的容器编排工具,可以管理多个 Docker 节点,并支持自动化扩展.负载均衡等功能.下面是 Docker Swarm 的基本概念和使用方法,包括节点 ...

  3. 论Docker swarm与Kubernetes孰强孰弱

    前言 有无数的辩论和讨论谈论Kubernetes和Docker.如果你没有深入研究,你会认为这两种开源技术都在争夺集装箱至上.让我们明确指出,Kubernetes和Docker Swarm不是竞争对手 ...

  4. Docker swarm集群详解(一)

    一.简介 Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源.Swarm和Ku ...

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

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

  6. docker swarm 集群服务编排部署指南(docker stack)

    Docker Swarm 集群管理 概述 Docker Swarm 是 Docker 的集群管理工具.它将 Docker 主机池转变为单个虚拟 Docker 主机,使得容器可以组成跨主机的子网网络.D ...

  7. Docker Swarm 健康检查

    Docker Swarm 健康检查 文章目录 Docker Swarm 健康检查 1. 容器添加健康检查 2. 崩溃命令 3. 验证状态 4. 状态修复 5. swarm 运用 Healthcheck ...

  8. Docker基础讲解狂神笔记:容器数据卷,docker compose,docker swarm(2/2)未修订版欢迎留言补漏

    L06 容器数据卷 相对于01-05难度加大 什么是容器数据卷 Docker理念:将应用和环境打包成一个镜像! 程序要保存数据,数据并不能放在容器里面,因为一旦数据放在容器,误操作删除掉容器,数据也随 ...

  9. 容器管理大战:Kubernetes vs.Docker Swarm与Amazon ECS

    Container Orchestration: 快速入门 自20世纪70年代以来,容器技术就已经出现,但直到2013年Docker首次亮相后才开始发挥作用.从那时起,容器已经流行起来:它们正在显著地 ...

最新文章

  1. 16个免费和开源商业智能工具
  2. 简明docker教程 1
  3. 利用文件摘要简化游戏资源的引用管理
  4. 面试题之第一部分(Python基础篇) 80题
  5. 除留余数法构造哈希表_哈希表算法原理
  6. 前馈神经网络中的前馈_前馈神经网络在基于趋势的交易中的有效性(1)
  7. LAMP网站架构简介
  8. [BZOJ 2111][ZJOI2010]Perm 排列计数(Lucas定理)
  9. Ubuntu安装RabbitMQ及RabbitMQ基于使用
  10. 完美解决PHP、AJAX跨域问题
  11. OpenCV-图像处理(20、霍夫变换-直线)
  12. RecyclerView使用中遇到的问题
  13. 从URL启动程序:也谈谈旺旺的页面启动
  14. Oracle数据库(完整版)
  15. Office2013办公软件简体中文专业增强版
  16. Android Execution failed for task ‘:app:mergeDebugResources‘.
  17. UIImagePicketView(照相机类)的使用
  18. 《离散数学》每章内容及其重点梳理
  19. vmlinuz和initrd
  20. 使用轻量应用服务器搭配宝塔面板搭建可道云kodbox私有云网盘的方法教程

热门文章

  1. 【机器视觉】Qt集成Halcon开发环境详解(二)
  2. 【MFC】滚动字幕的状态栏
  3. 【Linux】一步一步学Linux——useradd命令(82)
  4. 对计算机网络的父亲,父亲节朋友圈对老爸说的话 写给父亲催泪的话简短
  5. Jfinal 对象列表返回前台json数据
  6. Windows 全局钩子 Hook 详解
  7. 【HDU 3400】Line belt(三分法)
  8. C++代码片段(三)过滤可变模板参数中某些类型的变量
  9. 每天一道LeetCode-----实现二叉搜索树的迭代器
  10. 在Linux虚拟机中添加多个ip地址