web-dev-qa-db-ja.com

Docker Swarm-Swarmクラスタですでに実行されているコンテナのバランスをとる方法は?

AWSに2つのノードを持つdocker swarmクラスターがあります。両方のインスタンスを停止し、最初にswarm managerを起動してからワーカーを起動しました。インスタンスを停止する前に、マネージャーとワーカーに分散された4つのレプリカでサービスを実行していました。

負荷分散の方法を教えてください。
Swarm Managerは、ワーカーが開始したときに責任を負いませんか?

10
Bukkasamudram

現在、Swarm(18.03)は、サービスがデフォルトの「レプリケートモード」にある場合、新しいノードの起動時にコンテナを移動または置換しません。これは仕様です。新しいノードを追加する場合、必ずしも他のコンテナの束を停止し、新しいノードで新しいコンテナを作成する必要はありません。 Swarmは、コンテナを停止する必要がある場合にのみ複製を「移動」します(複製モード)。

docker service update --force <servicename>は、要件と制約に一致するすべてのノードにわたってサービスのバランスを取り直します。

その他のアドバイス:他のコンテナオーケストレーターと同様に、停止中に移動するサービスレプリカのワークロードを処理するために、ノードに容量を与える必要があります。予備の容量は、サポートする予定の冗長性のレベルと一致する必要があります。たとえば、2つのノードで同時に障害が発生した場合のキャパシティを処理する場合、これらのワークロードが他のノードに移行するためには、すべてのノードのリソースの最小割合が必要になります。

22
Bret Fisher

コンテナが作成されると、Swarmは自動バランスを行いません。すべてのワーカーがアップしたらスケールアップ/ダウンでき、設定要件/ロール/などに従ってコンテナを配布します。

参照: https://github.com/moby/moby/issues/241

新しいノードが追加されると「強盗」されるという問題があります。また、健全なタスクの横取りを回避します。リバランスは、作業プロセスを強制終了するのではなく、時間の経過とともに行われます。先取りは将来的に検討されています。

回避策として、サービスをスケールアップおよびスケールダウンすると、タスクのバランスを取り直す必要があります。また、新しいタスクを再スケジュールするため、ローリング更新をトリガーすることもできます。

2
ldg

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」を使用すると、どのノードに配置されるかを気にせず、ノードごとに1つのサービスが必要な場合は、代わりに「— mode = global」を使用できます。

Docker 1.13以降では、-forceまたは-fフラグをdocker service updateコマンドで使用して、サービスが使用可能なワーカーノードにタスクを再配布するように強制できます。

1
abv2014