docker swarm - 如何平衡群集中已经运行的容器?

时间:2018-03-27 16:47:04

标签: docker docker-compose dockerfile docker-swarm docker-container

我在AWS上有2个节点的docker swarm集群。我停止了这两个实例,最初启动了swarm管理器,然后是worker。在停止实例之前,我有一个服务运行,其中4个副本分布在经理和工作人员之间 当我首先启动swarm管理器节点时,所有副本容器都在管理器本身启动,而根本没有移动到工作人员 请告诉我如何进行负载平衡?
当工人开始时,群体经理不负责吗?

4 个答案:

答案 0 :(得分:17)

当新节点启动时,如果服务处于默认的“复制模式”,则当前Swarm(18.03)不会移动或替换容器。这是设计的。如果我要添加一个新节点,我不一定要停止一堆其他容器,并在我的新节点上创建新容器。 Swarm只在必要时(在复制模式下)停止容器以“移动”复制品。

docker service update --force <servicename>将在符合其要求和约束的所有节点上重新平衡服务。

进一步的建议:与其他容器协调器一样,您需要在节点上提供容量,以便处理在停机期间移动的任何服务副本的工作负载。您的备用容量应与您计划支持的冗余级别相匹配。例如,如果要处理2个节点一次性失败的容量,则需要所有节点上的最小资源百分比,以便这些工作负载转移到其他节点。

答案 1 :(得分:2)

创建容器后,Swarm不会执行自动平衡。您可以在所有工作人员都启动后向上/向下扩展,并根据您的配置要求/角色等分发容器。

请参阅:https://github.com/moby/moby/issues/24103

  

新节点在添加时会出现“抢劫”的问题。   我们还避免先发制人的健康任务。重新平衡完成了   时间,而不是杀死工作流程。优先购买正在进行中   考虑未来。

     

作为一种解决方法,上下调整服务应重新平衡   任务。您还可以触发滚动更新,因为这将重新安排   新任务。

答案 2 :(得分:1)

在docker-compose.yml中,您可以定义:

version: "3"

services:

  app:
    image: repository/user/app:latest
    networks:
      - net
    ports:
      - 80
    deploy:
      restart_policy:
        condition: any
      mode: replicated
      replicas: 5
      placement:
        constraints: [node.role == worker]
      update_config:
        delay: 2s

备注:约束是node.role == worker

使用标志“ - replicas”意味着我们不关心它们被放在哪个节点上,如果我们想要每个节点有一个服务,我们可以使用“ - mode = global”。

在Docker 1.13及更高版本中,您可以将--force或-f标志与docker service update命令一起使用,以强制服务在可用的工作节点之间重新分配其任务。

答案 3 :(得分:1)

这是我用来重新平衡的 bash 脚本:

#!/usr/bin/env bash

set -e

EXCLUDE_LIST="(_db|portainer|broker|traefik|prune|logspout|NAME)"

for service in $(docker service ls | egrep -v $EXCLUDE_LIST | 
                 awk '{print $2}'); do
  docker service update --force $service
done