繁体   English   中英

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

[英]docker swarm - how to balance already running containers in a swarm cluster?

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

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

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

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

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

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

新节点在添加时被“劫持”存在问题。 我们还避免抢占健康任务。 重新平衡是随着时间的推移完成的,而不是终止工作进程。 未来正在考虑先发制人。

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

在 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 及更高版本中,您可以在 docker service update 命令中使用 --force 或 -f 标志来强制服务在可用的工作节点之间重新分配其任务。

这是我用来重新平衡的 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM