はじめに
このチュートリアルでは、強力かつ柔軟なコンテナオーケストレーションプラットフォームである Docker Swarm のスケーリングプロセスを案内します。増加するワークロードを処理し、高可用性を確保するために、Docker Swarm サービスを効果的にスケーリングする方法を学びます。さらに、最大限のパフォーマンスと信頼性のために Docker Swarm クラスターを最適化するための高度なスケーリング手法についても探ります。
Docker Swarm のはじめに
Docker Swarm とは?
Docker Swarm は、Docker コンテナ用のネイティブなクラスタリングおよびオーケストレーションツールです。複数の Docker ホストとそれらのコンテナを 1 つのシステムとして管理することができます。Docker Swarm を使用すると、複数のホストにアプリケーションをデプロイし、高可用性とスケーラビリティを確保することができます。
Docker Swarm の主要概念
- Swarm(クラスター): Swarm は、1 つのシステムとして連携するように構成された Docker ホストのグループです。
- Node(ノード): Node は、Swarm の一部である単一の Docker ホストです。ノードには、Manager(マネージャー)ノードと Worker(ワーカー)ノードがあります。
- Manager Node(マネージャーノード): マネージャーノードは、タスクのスケジューリング、Swarm の望ましい状態の維持、フェイルオーバーの処理など、Swarm の管理を担当します。
- Worker Node(ワーカーノード): ワーカーノードは、Swarm 内で実際のコンテナを実行する責任を持ちます。
- Service(サービス): Service は、Swarm 上で実行するタスクの定義です。使用するコンテナイメージと実行するコマンドを指定します。
- Task(タスク): Task は、ノード上で実行されるサービスの単一インスタンスです。
Docker Swarm の利点
- ネイティブなクラスタリング: Docker Swarm は Docker エンジンに組み込まれているため、セットアップと管理が簡単です。
- 高可用性: Docker Swarm は自動的にフェイルオーバーとロードバランシングを処理し、アプリケーションの高可用性を確保します。
- スケーラビリティ: Swarm からノードを追加または削除することで、アプリケーションを簡単にスケーリングできます。
- シンプルさ: Docker Swarm は、アプリケーションを管理するためのシンプルで直感的なコマンドラインインターフェイスを提供します。
graph TD
A[Docker Host] --> B[Docker Host]
A --> C[Docker Host]
B --> D[Docker Container]
C --> E[Docker Container]
D --> F[Docker Container]
E --> G[Docker Container]
subgraph Docker Swarm
B & C
end
Docker Swarm の始め方
Docker Swarm を始めるには、Swarm クラスターをセットアップする必要があります。これは、Docker ホストの 1 つで Swarm を初期化し、その後、追加のホストをワーカーノードとして追加することで行えます。以下は、Ubuntu 22.04 を使用した例です。
## Initialize the Swarm on the manager node
## Join worker nodes to the Swarm
Swarm をセットアップしたら、アプリケーションをサービスとしてデプロイを開始できます。
Docker Swarm サービスのスケーリング
サービスのスケーリング
Docker Swarm の主要な利点の 1 つは、需要に基づいてサービスを簡単に拡張または縮小できることです。サービスのレプリカ(タスク)の数を増減することで、サービスをスケーリングできます。
以下は、Docker Swarm でサービスをスケーリングする方法の例です。
## Scale a service to 5 replicas
docker service scale my-service=5
## Scale a service back down to 3 replicas
docker service scale my-service=3
オートスケーリングによる自動スケーリング
Docker Swarm は自動スケーリングもサポートしており、事前定義されたルールまたはメトリクスに基づいてサービスを自動的にスケーリングできます。これはオートスケーリング(Autoscaling)と呼ばれます。
Docker Swarm のオートスケーリングは、サービスを作成または更新する際に --autoscale フラグを使用して構成できます。最小および最大のレプリカ数と、使用するスケーリングメトリクスを指定できます。
以下は、サービスにオートスケーリングを有効にする方法の例です。
## Enable Autoscaling for a service
docker service update --autoscale-max 10 --autoscale-min 3 --autoscale-metric cpu my-service
この例では、サービスは CPU 使用率に基づいて 3 から 10 のレプリカ間で自動的にスケーリングされます。
スケーリング戦略
Docker Swarm は、Swarm 内のノード間でタスクをどのように分散させるかを決定するさまざまなスケーリング戦略をサポートしています。利用可能な戦略は次のとおりです。
| 戦略 | 説明 |
|---|---|
spread |
利用可能なノードにできるだけ均等にタスクを分散させます。これがデフォルトの戦略です。 |
binpack |
できるだけ少ないノードにタスクをパックします。 |
random |
利用可能なノードにランダムにタスクを分散させます。 |
サービスを作成または更新する際に、スケーリング戦略を指定できます。
## Use the "binpack" scaling strategy
docker service create --strategy-binpack my-service
スケーリングに関する考慮事項
Docker Swarm サービスをスケーリングする際には、いくつかの重要な考慮事項を覚えておく必要があります。
- リソースの可用性: Swarm ノードに、増加した負荷を処理するのに十分なリソース(CPU、メモリ、ストレージ)があることを確認してください。
- ネットワーク容量: ネットワークインフラストラクチャが増加したトラフィックとロードバランシングを処理できることを確認してください。
- サービスの依存関係: サービス間の依存関係と、あるサービスをスケーリングすることが他のサービスにどのように影響するかを考慮してください。
- 監視とアラート: Swarm サービスのパフォーマンスと利用率を追跡するための監視とアラートを設定してください。
これらのスケーリング概念とベストプラクティスを理解することで、変化する需要に対応するために Docker Swarm アプリケーションを効果的にスケーリングできます。
高度なスケーリング手法
配置制約(Placement Constraints)
配置制約により、Swarm 内でタスクを配置する場所を制御できます。これは、以下のような高度なスケーリングシナリオで役立ちます。
- ハードウェアリソースや場所に基づいて特定のノードにタスクを配置する
- 異なるサービスやコンポーネントを異なるノードに分離する
- 複数の可用性ゾーンにタスクを分散させることで高可用性を確保する
以下は、配置制約を使用する方法の例です。
## Create a service with a placement constraint
docker service create --constraint 'node.labels.region==us-east' my-service
この例では、サービスのタスクは region=us-east ラベルが付いたノードに配置されます。
ローリングアップデート(Rolling Updates)
Docker Swarm はローリングアップデートをサポートしており、ダウンタイムを最小限に抑えてサービスを更新できます。ローリングアップデート中は、新しいタスクが徐々にデプロイされ、新しいタスクが利用可能になると古いタスクが削除されます。
更新の並列度と遅延を設定して、ローリングアップデートのペースを制御できます。
## Perform a rolling update with a parallelism of 2 and a delay of 10 seconds
docker service update --update-parallelism 2 --update-delay 10s my-service
レプリケート型(Replicated)サービスとグローバル型(Global)サービスによるスケーリング
Docker Swarm は 2 種類のサービスデプロイモードをサポートしています。
- レプリケート型(Replicated)サービス: このモードでは、サービスのレプリカ数を指定し、Swarm が指定された数のタスクが実行されるようにします。
- グローバル型(Global)サービス: このモードでは、サービスの単一のタスクが Swarm 内のすべてのノードで実行されます。
レプリケート型サービスはステートレスなアプリケーションのスケーリングに役立ち、グローバル型サービスはすべてのノードに存在する必要があるインフラストラクチャサービスやエージェントの実行に役立ちます。
以下は、レプリケート型サービスとグローバル型サービスを作成する例です。
## Create a replicated service
docker service create --replicas 5 my-service
## Create a global service
docker service create --mode global my-agent
ノードラベルと制約によるスケーリング
ノードラベルと制約を使用して、特定のノードを対象にスケーリングできます。これは、以下のようなシナリオで役立ちます。
- 特定のノードタイプ(例:GPU 対応ノード)でオンデマンドサービスをスケーリングする
- ローカルストレージを持つノードでステートフルサービスをスケーリングする
- 特定の可用性ゾーンやリージョンでサービスをスケーリングする
以下は、ノードラベルと制約を使用する例です。
## Add a label to a node
docker node update --label-add gpu=true node1
## Create a service that uses the gpu label
docker service create --constraint 'node.labels.gpu==true' my-gpu-service
これらの高度なスケーリング手法を組み合わせることで、特定の要件を満たす高スケーラブルで弾力性のある Docker Swarm デプロイメントを作成できます。
まとめ
このチュートリアルを終えることで、Docker Swarm をどのようにスケーリングするかについて包括的な理解が得られるでしょう。Docker Swarm クラスターを効果的に管理し、最適化することができ、アプリケーションが増加するトラフィックを処理し、高可用性を維持できるようになります。Docker の初心者であろうと、経験豊富なユーザーであろうと、このガイドはあなたが自信を持って Docker Swarm をスケーリングするために必要な知識とツールを提供します。



