Docker Swarm集群实践——管理篇

前面我们已经部署好了一个Docker Swarm集群环境,接下来,我们就对Swarm集群的相关管理进行简单介绍。


集群调度策略

既然是集群,就是有一个调度策略,也就是该集群包含那么多子节点,我到底是设置一个什么样的策略来进行分配呢?


我们查看Docker官方文档可以看到Swarm的集群调度包含三种策略:

To choose a ranking strategy, pass the --strategy flag and a strategy value to the swarm manage command. Swarm currently supports these values:

  • spread
  • binpack
  • random

The spread and binpack strategies compute rank according to a node’s available CPU, its RAM, and the number of containers it has. The random strategy uses no computation. It selects a node at random and is primarily intended for debugging.

Your goal in choosing a strategy is to best optimize your cluster according to your company’s needs.

Under the spread strategy, Swarm optimizes for the node with the least number of containers. The binpack strategy causes Swarm to optimize for the node which is most packed. Note that a container occupies resource during its life cycle, including exited state. Users should be aware of this condition to schedule containers. For example, spread strategy only checks number of containers disregarding their states. A node with no active containers but high number of stopped containers may not be selected, defeating the purpose of load sharing. User could either remove stopped containers, or start stopped containers to achieve load spreading. The random strategy, like it sounds, chooses nodes at random regardless of their available CPU or RAM.

Using the spread strategy results in containers spread thinly over many machines. The advantage of this strategy is that if a node goes down you only lose a few containers.

The binpack strategy avoids fragmentation because it leaves room for bigger containers on unused machines. The strategic advantage of binpack is that you use fewer machines as Swarm tries to pack as many containers as it can on a node.

简单总结一下:

  • random策略:随机选择节点。一般用于开发测试阶段。
  • spread策略:默认策略,swarm优先选择占用资源(如CPU、内存等)最少的节点,能保证集群中所有节点资源的均匀使用。 
  • binpack策略:与spread相反,它的目的是尽可能地填满一个节点,以保证更多空余的节点。

具体操作在启动Swarm Manager添加策略参数

root@controller:~# docker run -p 2376:2375 -d swarm manage token://88b70a0603a97f3e51be1d83f471a1df --strategy random
b1f075e99d5a3fab795a2d3c33f8229e3d06a142dd421651e05af08279fb7488
查看一下集群节点信息,可以看到策略已经修改了Random。


接下来,我们创建容器实例就默认随机调度。

Swarm过滤

Swarm集群在创建时候不仅可以通过设定策略进行自动化调度,也可以通过设置过滤条件,进行一些自定义化的设置。Filters分两类:节点过滤器容器过滤器

节点过滤器:以Docker Damon的配置或Docker主机的特性为条件进行过滤的,它包括: 
- constraint 
- health

容器过滤器:以Docker容器的配置作为条件过滤,它包括: 
- affinity 
- dependency 
- port

使用容器过滤器时,过滤条件将应用于所有容器,包括stopped状态的容器。 容器过滤器中dependency和port两种,会利用docker运行容器时的相关参数自动选择符合条件的节点,不需额外指定参数。


使用Contraint过滤

使用Contraint过滤需要为集群服务器使用tag或者添加label,例如对每一个集群的/etc/default/docker设置lable。

DOCKER_OPTS="-H 0.0.0.0:2375 -H unix:///var/run/docker.sock --label node=controller --insecure-registry 192.168.12.132:5000"

其他机器修改自己的机器名:--label node=本机机器名

重启一下docker服务

我们查看swarm manager节点信息如上,红框标识。

1、我们默认创建N次容器实例

docker -H 192.168.12.132:2376 run -id ubuntu:14.04

查看各个容器节点的docker ps -a,可以看到随机看到在各个机器上生成实例。

2、例如只在设定的某个节点创建实例,例如只在controller132节点创建

root@controller:~# docker -H 192.168.12.132:2376 run -id  -e constraint:node==controller  ubuntu:14.04

我们的限制不仅仅只是过滤指定的节点,还可以实现类似于存储驱动、内核版本,OS等相关的过滤。

  • storagedriver
  • executiondriver
  • kernelversion
  • operatingsystem

查看controller机器可以看到全部都创建在该机器上

root@controller:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
6bc9f97d5c95        ubuntu:14.04        "/bin/bash"              12 seconds ago      Up 11 seconds                                stoic_golick
9fad12f8c073        ubuntu:14.04        "/bin/bash"              31 seconds ago      Up 30 seconds                                silly_murdock
eb6a03627e7a        ubuntu:14.04        "/bin/bash"              2 minutes ago       Up 2 minutes                                 tiny_wing
b1f075e99d5a        swarm               "/swarm manage token:"   18 minutes ago      Up 18 minutes       0.0.0.0:2376->2375/tcp   angry_mirzakhani
4bc94ec9f4a2        swarm               "/swarm join -addr=19"   19 minutes ago      Up 19 minutes       2375/tcp                 jovial_mcnulty


3、我们可以通过docker -H swarm-manager-ip:port  command来查看集群的容器信息,command可以是docker的相关命令,例如

root@controller:~# docker -H 192.168.12.132:2376 ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
6bc9f97d5c95        ubuntu:14.04        "/bin/bash"              5 minutes ago       Up 5 minutes                                        controller/stoic_golick
9fad12f8c073        ubuntu:14.04        "/bin/bash"              5 minutes ago       Up 5 minutes                                        controller/silly_murdock
eb6a03627e7a        ubuntu:14.04        "/bin/bash"              7 minutes ago       Up 7 minutes                                        controller/tiny_wing
6f24519e302a        ubuntu:14.04        "/bin/bash"              7 minutes ago       Up 7 minutes                                        docker2/condescending_mcclintock
2ae50d7963ca        ubuntu:14.04        "/bin/bash"              7 minutes ago       Up 7 minutes                                        docker1/goofy_cray
b1f075e99d5a        swarm               "/swarm manage token:"   23 minutes ago      Up 23 minutes       192.168.12.132:2376->2375/tcp   controller/angry_mirzakhani
9065ee5166cd        swarm               "/swarm join -addr=19"   24 minutes ago      Up 24 minutes       2375/tcp                        docker2/small_davinci
0bd66f118d09        swarm               "/swarm join -addr=19"   24 minutes ago      Up 24 minutes       2375/tcp                        docker1/adoring_boyd
4bc94ec9f4a2        swarm               "/swarm join -addr=19"   24 minutes ago      Up 24 minutes       2375/tcp                        controller/jovial_mcnulty


使用health过滤

当节点down机了,或无法与Cluster通信了,表示节点处于unhealth状态。 
health过滤条件在集群启动时指定通过--filter=health指定,它强制集群在后续操作选择节点时使用health状态的节点。


使用Affinity Filter
affinity过滤器,用于选择满足以下条件(具有相关性)的节点: 
- container(容器name或id) 
- images(镜像名称) 
- label(容器上的自定义label)

使用-e affinity:container==container_name / container_id –-name container_1可以让容器container_1紧挨着容器container_name / container_id执行,也就是说两个容器在一个node上面执行

当然,Affinity Filter的使用场景还有很多,例如:通过-e affinity:image=image_name命令可以指定只有已经下载了image_name的机器才运行容器


使用dependency过滤

在运行容器时,可以指定以下三种依赖: 
- –volumns-from=dependency 
- –link=dependency:alias 
- –net=container:dependency

使用swarm创建容器时,会自动根据满足这三种依赖的主机环境作为容器运行的节点。

使用端口过滤

在运行容器时,通过-p指定主机与容器的端口映射,在swarm环境中,会自动选择指定端口可用(未被占用)的主机,避免端口冲突。

Filters表达式

上述过滤器,constraints和affinity可以通过-e参数额外指定Filter表达式。

<filter-type>:<key><operator><value>

    filter-type: constraints和affinity两种
    key: container、node、节点默认tag、节点或容器自定义label
    operator:包括`==`、`!=`两种,可在后面加'~'表示软匹配,在条件无匹配时,自动忽略过滤条件
    value:字符串表达式(字符、数据、点号、下划线等组成),可以是
        全局匹配 —— abc*
        正则匹配 —— /node\d/

示例:

  • constraint:node==node1 matches node node1.
  • constraint:node!=node1 matches all nodes, except node1.
  • constraint:region!=us* matches all nodes outside with a region tag prefixed with us.
  • constraint:node==/node[12]/ matches nodes node1 and node2.
  • constraint:node==/node\d/ matches all nodes with node + 1 digit.
  • constraint:node!=/node-[01]/ matches all nodes, except node-0 and node-1.
  • constraint:node!=/foo[bar]/ matches all nodes, except foo[bar]. You can see the use of escape characters here.
  • constraint:node==/(?i)node1/ matches node node1 case-insensitive. So NoDe1 or NODE1 also match.
  • affinity:image==~redis tries to match for nodes running container with a redis image
  • constraint:region==~us* searches for nodes in the cluster belonging to the us region
  • affinity:container!=~redis* schedule a new redis5 container to a node without a container that satisfies redis*


更多的参考:https://docs.docker.com/swarm/scheduler/filter/


本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。

docker4dotnet #2 容器化主机 - 2016-07-21 14:07:47

.NET 猿自从认识了小鲸鱼,感觉功力大增。上篇 《docker4dotnet #1 前世今生世界你好》 中给大家介绍了如何在Windows上面配置Docker for Windows和Docker Tools for Visual Studio来使用docker协助.NET Core应用的开发,这篇我们来看看如何创建和管理容器化主机。 所谓容器化主机Dockerized Host,就是安装了docker engine的主机,可以使用docker工具进行管理。使用docker来协助开发,我们至少需要本地和

Oozie安装总结 - 2016-07-20 18:07:35

一、使用CM添加服务的方式安装Oozie 如果在创建Oozie数据库时失败,且提示数据库已存在,如下图,则可能是之前已经安装过Oozie,没有卸载干净,需要手动将Oozie服务器数据目录删掉(oozie/data部分),见图二                                                                            (图一)                                                              

kafka本地单机安装部署 - 2016-07-20 18:07:35

kafka是一种高吞吐量的分布式发布订阅消息系统,这几天要上kafka,只在其中的一个节点使用,结合具体的项目实践在此将kafka的本地安装部署流程记录下来与各位同仁分享交流。 准备工作: 上述的文件除了jdk以外均放在/usr/local/kafka目录下。 1、安装jdk,kafka的使用要用到jdk 首先检查有无jdk:java -version cd /usr/local/hadoop(本例中我是将jdk的安装包放到hadoop文件夹下,各位可以依据自己情况) http://www.oracle.

Swift 存储目录 - 2016-07-20 17:07:03

  在 Storage node 上运行着 Linux系统并 使用了 XFS文件系统 ,逻辑上使用一致性哈希算法将固定总数的 partition 映射到每个 Storage node 上,每个 Data 也使用同样的哈希算法映射到 Partition 上,其层次结构如下图所示: Figure1:Stoage node hierachy     以我们的一台 storage node sws51 为例,该 device 的文件路径挂载到 /srv/node/sdc ,目录结构如下所示: root@sws51
翻译:@胡杨(superhy199148@hotmail.com) @胥可(feitongxiaoke@gmail.com) 校对调整: 寒小阳 龙心尘 时间:2016年7月 出处: http://blog.csdn.net/han_xiaoyang/article/details/51932536 http://blog.csdn.net/longxinchen_ml/article/details/51940065 说明:本文为斯坦福大学CS224d课程的中文版内容笔记,已得到斯坦福大学课程@Rich

三分钟部署Laxcus大数据系统 - 2016-07-20 17:07:47

Laxcus是Laxcus大数据实验室历时五年,全体系自主设计研发的国内首套大数据管理系统。能够支撑百万台级计算机节点,提供EB量级存储和计算能力,兼容SQL和关系数据库。 最新的2.x版本已经全面覆盖和集成当前大数据主流技术和功能 ,并投入到国内多个超算项目中使用。Laxcus同时也保持着使用和部署的极简性,所有对计算机略有认识的人都可以很容易掌握它。下面演示在一台Linux计算机上部署Laxcus demo系统的过程。根据我们的测试,这个部署过程大约需要三分钟,或者您熟悉Linux系统 ,也许不需要这

Devstack多节点部署实验 - 2016-07-20 14:07:52

本文为博主翻译文章,转载请注明出处Bob Hou: http://blog.csdn.net/minxihou 这是个在多物理服务器上部署openstack例子: 1 先决条件Linux网络 1.1 最小化安装系统 你需要一个刚安装好的Linux系统。你可以直接下载最小化的Ubuntu版本,devstack会下载安装所有额外的依赖关系。同样也支持网络安装Fedora,Centos/RHEL.安装几个包用于引导程序配置。 apt -get install -y git sudo || yum install
0 说明 0.1 备注 建立文件夹(sparkdir、hadoop、java、scala、spark) 每台机器均有/usr/sparkdir /hadoop /hadoop - 2.7 .2 /java /jdk1 .8 .0 _91 /scala /scala - 2.11 .8 /spark /spark - 1.6 .1 -bin -without -hadoop . tgz 0.2 用户组、用户管理 资源:http://www.cnblogs.com/vincedotnet/p/ 4017574
Ubuntu16.04安装Hadoop2.6+Spark1.6,并安装python开发工具Jupyter notebook,通过pyspark测试一个实例,調通整个Spark+hadoop伪分布式开发环境。 主要内容:配置root用户,配置Hadoop,Spark环境变量,Hadoop伪分布式安装并测试实例,spark安装并通过Jupter notebook进行开发实例,配置Jupter notebook兼容Python2和python3双内核共存开发。 默认已经正确安装了JDK,并设置了JAVA_HOM
摘要 MLlib(机器学习)分两种——监督学习,无监督学习。首先监督学习,类似普贝叶斯这样的分类算法。要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别与之对应。显而眼见的是,这种需求另监督学习有很大的局限性,尤其在海量数据处理时。要预先处理数据以满足算法需求得耗费大量资源与时间。此时,可以使用聚类算法这样的无监督学习,相比于分类,聚类不依赖预定义的类和类标号的训练实例。本文将聚类算法拆分开来。深刻理解其思想。 相关知识 相异度计算——聚类,见名之意,便是将数据聚集起来,但是并非是将所有