簡體   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