AWSに2つのノードを持つdocker swarmクラスターがあります。両方のインスタンスを停止し、最初にswarm managerを起動してからワーカーを起動しました。インスタンスを停止する前に、マネージャーとワーカーに分散された4つのレプリカでサービスを実行していました。
。
負荷分散の方法を教えてください。
Swarm Managerは、ワーカーが開始したときに責任を負いませんか?
現在、Swarm(18.03)は、サービスがデフォルトの「レプリケートモード」にある場合、新しいノードの起動時にコンテナを移動または置換しません。これは仕様です。新しいノードを追加する場合、必ずしも他のコンテナの束を停止し、新しいノードで新しいコンテナを作成する必要はありません。 Swarmは、コンテナを停止する必要がある場合にのみ複製を「移動」します(複製モード)。
docker service update --force <servicename>
は、要件と制約に一致するすべてのノードにわたってサービスのバランスを取り直します。
その他のアドバイス:他のコンテナオーケストレーターと同様に、停止中に移動するサービスレプリカのワークロードを処理するために、ノードに容量を与える必要があります。予備の容量は、サポートする予定の冗長性のレベルと一致する必要があります。たとえば、2つのノードで同時に障害が発生した場合のキャパシティを処理する場合、これらのワークロードが他のノードに移行するためには、すべてのノードのリソースの最小割合が必要になります。
コンテナが作成されると、Swarmは自動バランスを行いません。すべてのワーカーがアップしたらスケールアップ/ダウンでき、設定要件/ロール/などに従ってコンテナを配布します。
参照: https://github.com/moby/moby/issues/241
新しいノードが追加されると「強盗」されるという問題があります。また、健全なタスクの横取りを回避します。リバランスは、作業プロセスを強制終了するのではなく、時間の経過とともに行われます。先取りは将来的に検討されています。
回避策として、サービスをスケールアップおよびスケールダウンすると、タスクのバランスを取り直す必要があります。また、新しいタスクを再スケジュールするため、ローリング更新をトリガーすることもできます。
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コマンドで使用して、サービスが使用可能なワーカーノードにタスクを再配布するように強制できます。