【问题标题】:docker swarm - how to balance already running containers in a swarm cluster?docker swarm - 如何平衡集群中已经运行的容器?
【发布时间】:2018-09-06 04:28:45
【问题描述】:

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

【问题讨论】:

  • 可以重启服务吗?他们可能都在其他工人起床之前被安排在经理身上
  • 是否需要重启docker服务或docker stack?
  • 我尝试重新启动 docker 服务,然后尝试重新部署堆栈。没有运气。
  • 我希望从 swarm manager 手动停止容器新容器可能会转移到 worker 以进行负载平衡,但是有没有其他方法可以由 swarm manager 本身自动平衡?
  • 我不认为 swarm 会移动已经存在并正在运行的容器,因为它无法知道这样做是否会导致您的应用程序中断

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


【解决方案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

【讨论】:

    【解决方案2】:

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

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

    进一步的建议:与其他容器编排器一样,您需要在节点上提供容量,以便处理在中断期间移动的任何服务副本的工作负载。您的备用容量应该与您计划支持的冗余级别相匹配。例如,如果您想处理同时发生故障的 2 个节点的容量,则需要所有节点上的最低资源百分比才能将这些工作负载转移到其他节点。

    【讨论】:

    【解决方案3】:

    在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 命令一起使用,以强制服务在可用的工作节点之间重新分配其任务。

    【讨论】:

    • 但我想负载平衡容器,包括管理器。我用 constraints: [node.role == worker] 更新了我的 docker-compose.yml。所有容器都被移到工人。
    【解决方案4】:

    创建容器后,Swarm 不会进行自动平衡。一旦所有工作人员都启动,您就可以扩大/缩小规模,它将根据您的配置要求/角色/等分配容器。

    见:https://github.com/moby/moby/issues/24103

    在添加新节点时会出现“被盗”的问题。 我们还避免抢占健康任务。再平衡结束 时间,而不是杀死工作进程。先发制人正在 为未来考虑。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多