我个人认为在另一台服务器上运行Swarm master服务本身是一个不错的想法。该服务器并不需要大量的资源,但它却需要用很多的文件描述符来处理所有的TCP流量的输入和输出。在下面例子中,我会使用<code>dockerswarm01</code>来作为专用的Swarm master服务。
在默认情况下Swarm有各种各样的配置,当涉及到运行守护进程及其配套的基础设施时,配置过程的灵活性就变得很强。下面列出了不同类别的配置选项以及它们是如何进行配置的。
Swarm使用的发现服务是一种维护集群状态的机制。它可以与各种后端服务协同工作,基本的工作流程都是一致的,都涉及到以下的概念:
后端服务维护着Docker结点的列表,这些服务应该是集群的一部分。
通过节点的列表,Swarm 会检查每一个结点的健康状况并且跟踪进出集群的节点。
节点发现仅需要通过命令行来完成。这是最基本的发现机制类型,它并不需要对配置文件或者其他相关内容进行维护。Swarm守护进程使用节点发现的启动命令会是这样:
文件发现利用放置在文件系统中 (例如:/etc/swarm/cluster_config)的配置文件,使用<code>&lt;IP>:&lt;Port></code>的格式来列出集群中的Docker主机。虽然该列表是静态的,但是通过健康检查服务仍然可以确定健康和不健康的节点,并且可以过滤对不健康的节点请求。基于文件发现的启动命令和配置文件的例子如下:
之后Swarm master会从Consul服务中读取主机列表,它以这样的方式运行:
这些基于键/值的基本配置模式会引发一个问题:Swarm集群的健康状况检查服务如何与Swarm客户端(在 join模式下)协同工作?由于通过键/值存储的列表本身就是动态的,它是否需要运内部Swarm健康检查服务呢?我对相关的功能并不熟悉,所以不妄加评论,但这个问题应该引起注意。
通过以下命令,Docker Swarm master 服务会连接EtcD,搜寻所提供的路径信息并且成节点列表:
Swarm客户端(与Docker一起):
Swarm Master:
我还没有使用过这个功能,在这点上没有多少可以总结的。
调度机制的主要功能是选择在哪个服务器上创建并启动一个容器。它是由一个装箱算法(packing algorithm)和过滤器(或标签)组合而成。每个Docker守护进程启动的时候都带着一组标签,像以下这样:
然后,当开启一个Docker容器时,Swarm将基于过滤器选择一组服务器,然后根据调度机制来分配每次运行的命令。过滤器会告诉Swarm哪些服务器上的容器是可用的或是不可用的,之后调度器会把命令分发到可用的服务器上。以下是几个过滤机制:
类同(Affinity )
类同可以以两种方式工作:容器类同或镜像类同。为了在同一台主机上启动两个容器可以运行以下命令:
由于Swarm并没有对镜像进行管理,设置类同镜像也是可行的。这意味着一个容器仅能在已包含镜像的节点上启动。这就避免了在开启一个容器之前需要在后台等待拉取镜像的过程。举个例子:
端口(Port) 端口过滤可以防止在同一主机上任意两个具有相同静态端口映射的容器启动。这样做的意义很大,你不能重复在Docker主机上端口映射。例如,两个节点以<code>-p 80:80</code>开启不会被允许在同一Docker主机上运行。
健康状况(Healthy) 它阻止了对不健康节点进行调度。
一旦Swarm将主机列表限制在一组符合上述条件的节点上,它就会让对容器进行调度,从以上结点中选出一个,在上面创建并启动容器。目前以下调度是器内置的:
随机分配(Random) 将容器随机分布在可用的结点上。
装箱(Binpacking) 用容器将节点填满(每个容器得到的资源固定),然后再移动到下一个节点。如果在运行时需要动态地给容器分配资源,采用这个策略可能会使过程变得更复杂。这意味着即使为每个容器的内存和CPU设置上限,也并不能保证运行期间一切正常。我个人比较喜欢让容器彼此之间竞争,看哪个容器能得到资源。
令人高兴的是,Swarm可以在TLS启用下运行。这使得客户端、Swarm守护进程以及Docker守护程序之间的交互变更安全。这是一件好事,因为在我研究安全方面的伙伴看来,在网络中并没有边界。
按照上面博客中的内容,一旦证书生成并安装,Docker与Swarm守护进程就可以进行如下操作:
Docker:
Swarm master:
然后客户端必须知道连接TLS。以下是环境变量设置:
这样你就设置好了TLS。
当涉及到复杂的集群软件的配置时,还有很多内容可以讨论,但我觉得对于一个概述性的介绍来说,以上内容已经足够,这可以让你设置、运行并思考如何配置你的Swarm集群。下一篇博客中我会介绍关与Swarm集群架构的一些例子。敬请关注,并欢迎在下面发表评论!
===========================
译者介绍
原文发布时间为:2015-02-03
本文作者:田浩浩
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:Docker Swarm入门(二)配置选项与基本运行环境要求