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