跨多个故障域部署 Docker 群模式服务
Deploying Docker Swarm mode services across multiple failure domains
我是 docker swarm 模式的新手(我特指 docker v1.12 中的 swarm 模式,我不是指较旧的非集成 'docker swarm') .
我正在尝试评估它是否适合为一个新的软件项目构建一个大型分布式容器化平台(我正在与 mesosphere、kubernetes 等类似技术进行比较)。
我对旧的非集成 docker swarm(不是 swarm 模式)的理解是,您可以通过使用过滤器将节点定位为部署到多个故障域。 Docker Swarm 模式中是否有等效项?
例如,在测试环境中,我有 6 个 VM - 所有 运行ning docker。
我启动 VM 1 和 2 并将其称为我的故障域 1
我启动 VM 3 和 4 并将其称为我的故障域 2
我启动 VM 5 和 6 并将其称为我的故障域 3
所有故障域均由一名 swarm manager 和一名 swarm worker 组成。实际上,我每个域有 2 个节点可以托管服务容器。
我告诉 docker 创建一个新服务,运行 3 个容器基于一个包含简单 Web 服务的图像。 Docker 做到了,启动了 3 个容器,我的服务是 运行ning;我可以毫无问题地访问我的负载平衡 Web 服务。万岁!
但是,我想特别告诉 docker 将我的 3 个容器分布在域 1、域 2 和域 3 中。
我该怎么做? (另外 - 我在正确的网站上发帖 - 这应该在其他 stackexchange 网站之一吗?)
您可以像以前一样继续使用引擎标签。或者使用新的群,您可以在群节点上定义节点标签。然后,使用新的 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
对于节点标签或引擎标签:
docker service create --constraint engine.labels.az==1 \
--name AppAZ1 yourimage
为您的每个 AZ 重复此操作。
不幸的是,当您使用 --replicas 3
之类的东西(包括故障转移到每个 vm 集群中的第二个节点)时,我想不出一种方法来自动强制跨每个 AZ 分布。但是,如果您为每个任务选择每个集群的单个 VM,则可以将它们中的每一个标记为相同的标签(例如 --label-add vm=a
,然后执行 --mode global --constraint node.label.vm==a
到 运行 一项服务您的每个 A 节点。
我是 docker swarm 模式的新手(我特指 docker v1.12 中的 swarm 模式,我不是指较旧的非集成 'docker swarm') .
我正在尝试评估它是否适合为一个新的软件项目构建一个大型分布式容器化平台(我正在与 mesosphere、kubernetes 等类似技术进行比较)。
我对旧的非集成 docker swarm(不是 swarm 模式)的理解是,您可以通过使用过滤器将节点定位为部署到多个故障域。 Docker Swarm 模式中是否有等效项?
例如,在测试环境中,我有 6 个 VM - 所有 运行ning docker。
我启动 VM 1 和 2 并将其称为我的故障域 1
我启动 VM 3 和 4 并将其称为我的故障域 2
我启动 VM 5 和 6 并将其称为我的故障域 3
所有故障域均由一名 swarm manager 和一名 swarm worker 组成。实际上,我每个域有 2 个节点可以托管服务容器。
我告诉 docker 创建一个新服务,运行 3 个容器基于一个包含简单 Web 服务的图像。 Docker 做到了,启动了 3 个容器,我的服务是 运行ning;我可以毫无问题地访问我的负载平衡 Web 服务。万岁!
但是,我想特别告诉 docker 将我的 3 个容器分布在域 1、域 2 和域 3 中。
我该怎么做? (另外 - 我在正确的网站上发帖 - 这应该在其他 stackexchange 网站之一吗?)
您可以像以前一样继续使用引擎标签。或者使用新的群,您可以在群节点上定义节点标签。然后,使用新的 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
对于节点标签或引擎标签:
docker service create --constraint engine.labels.az==1 \
--name AppAZ1 yourimage
为您的每个 AZ 重复此操作。
不幸的是,当您使用 --replicas 3
之类的东西(包括故障转移到每个 vm 集群中的第二个节点)时,我想不出一种方法来自动强制跨每个 AZ 分布。但是,如果您为每个任务选择每个集群的单个 VM,则可以将它们中的每一个标记为相同的标签(例如 --label-add vm=a
,然后执行 --mode global --constraint node.label.vm==a
到 运行 一项服务您的每个 A 节点。