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

Jay*_*Jay 5 scaling cross-domain docker docker-swarm

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

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

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

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

我启动VM 1和2并调用我的故障domain1
我启动VM 3和4并调用我的故障domain2
我启动VM 5和6并调用我的故障domain3

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

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

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

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

BMi*_*tch 3

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

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

现在,在安排工作时,您添加一个约束,例如

docker service create --constraint node.labels.az==1 \
  --name AppAZ1 yourimage
Run Code Online (Sandbox Code Playgroud)

对于节点标签或引擎标签:

docker service create --constraint engine.labels.az==1 \
  --name AppAZ1 yourimage
Run Code Online (Sandbox Code Playgroud)

对每个 AZ 重复此操作。

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