跨多个故障域部署Docker Swarm模式服务

时间:2016-09-01 11:25:55

标签: docker cross-domain scaling docker-swarm

我是docker swarm模式的新手(我特别在谈论docker v1.12中的swarm模式,我并不是指旧的非集成'docker swarm')。

我正在尝试评估其是否适合为新的软件项目构建大型分布式集装箱平台(我正在与类似的技术进行比较,例如mesosphere,kubernetes等)。

我对旧的非集成docker swarm(非swarm模式)的理解是,您可以使用过滤器将节点定位到多个故障域。 Docker Swarm模式中是否存在等价物?

例如在测试环境中,我有6个VM - 所有正在运行的docker。

我启动VM 1和2并将其称为我的失败域1 我启动VM 3和4并将其称为我的失败域2 我启动VM 5和6并将其称为我的失败域3

所有失败域都包含一个swarm管理器和一个swarm worker。实际上,每个域有2个节点可以托管服务容器。

我告诉docker创建一个新服务,并根据包含简单Web服务的图像运行3个容器。 Docker做了它并且旋转了3个容器并且我的服务正在运行;我可以毫无问题地访问我的负载均衡Web服务。乌拉!

但是,我想特别告诉docker在domain1,domain2和domain3上分发我的3个容器。

我该怎么做? (也 - 我是在正确的网站上发布的 - 这应该是在其他一个堆叠交换网站上吗?)

1 个答案:

答案 0 :(得分:3)

您可以像以前一样继续使用引擎标签。或者使用新的swarm,您可以在swarm节点上定义节点标签。然后,使用新的docker swarm,您将在服务上定义约束并创建3个单独的服务,每个服务都被限制为在您的一个失败域中运行。

对于节点标签,您可以使用docker node update --label-add az=1 vm1az1节点添加标签vm1。为您的其他AZ重复此过程(可用区域是我倾向于使用的术语)和VM。

现在,在安排作业时,您可以添加约束

docker service create --constraint node.labels.az==1 \
  --name AppAZ1 yourimage

表示节点标签或引擎标签:

docker service create --constraint engine.labels.az==1 \
  --name AppAZ1 yourimage

为您的每个AZ重复此操作。

不幸的是,当您使用包含故障转移到每个虚拟机群集中的第二个节点的--replicas 3之类的内容时,我无法想出一种强制分布在每个AZ上的方法。 。但是,如果您为每个任务为每个群集选择一个VM,则可以使用相同的标签(例如--label-add vm=a)标记每个VM,然后执行--mode global --constraint node.label.vm==a在每个A上运行一个服务节点