mo.. Commits on Aug 16, 2021 15836782038638a20f4e214af6e92bdd01624726 .. -----------------------------------------------------------------------------

Docker Engine を swarm モードで動作

Docker Engine を初回インストールして実行すると、デフォルトでは swarm モードは無効です。swarm モードを有効化すると、 docker service コマンドを通してサービスの概念を扱えます。

ヒント

訳者注: Docker のドキュメントで「swarm」という言葉が出てくる場合は、ソフトウェア名称としての「swarm」ではなく、Docker Engine のノードで構成する「クラスタ」の意味で用いられるのが大半です。たとえば、「swarm を作成する」という表現は「swarm クラスタを作成する」と置き換えて読む必要があります。

swarm モードで Engine を動かすには、2つの方法があります。

ローカルマシン上の Engine を swarm モードで動作すると、既に作成したか、他から利用可能なイメージをもとに、サービスの作成やテストが可能です。プロダクション環境であれば、swarm モードはクラスタ管理機能を持つ耐障害性プラットフォームを提供し、サービスを実行中かつ利用可能な状態を維持します。

以下の手順では、マシン上に Docker Engine 1.12 以上をインストールし、そこで swarm の manager ノードを実行するのを想定しています。

もしまだの場合は、 Swarm モードの重要な概念 を読み、 swarm モード導入ガイド をお試しください。

swarm の作成

swarm を作成するコマンドを実行すると、Docker Engine は swarm モードで動作開始します。

docker swarm init を実行し、現在のノード上で単一ノードの swarm を作成します。Engine は以下の手順で swarm をセットアップします。

  • 現在のノードを swarm モードに切り替え

  • default という名前の swarm を作成

  • 現在のノードを swarm におけるleader(リーダー) manager ノードと仮定

  • マシンのホスト名をノード名にする

  • manager を設定し、アクティブなネットワーク・インターフェース上の port 2377 をリッスンする

  • 現在のノードの稼働状況(availability)を Active に設定。意味はスケジューラからのタスクを受け入れ可能

  • swarm に参加する Engine のための内部分散データ・ストアを開始する。これは swarm と swarm 上で実行する全てのサービスの一覧を、一貫して保持。

  • デフォルトでは、swarm に対して自己署名ルート CA を生成

  • デフォルトでは、swarm に参加する worker と manager 用のトークンを生成

  • swarm の外にサービスを公開するため、 ingress という名前のオーバレイ・ネットワークを作成

  • オーバレイ・デフォルト IP アドレスとサブネット・マスクをネットワーク上に作成

docker swarm init の出力に、swarm に新しい worker ノードが参加する時に使う接続用コマンドが出ています。

$ docker swarm init
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
    192.168.99.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

デフォルトのアドレス・プールを設定

デフォルトの Docker Swarm は、グローバル範囲(overlay)ネットワーク用にデフォルトのアドレス・プール 10.0.0.0/8 を使用します。全てのネットワークでサブネットの指定がない場合、このプールからサブネットを連続して払い出します。特定の状況においては、ネットワークが使用するデフォルトの IP アドレス・プールを変更した方が望ましいでしょう。

たとえば、デフォルト 10.0.0.0/8 の範囲が、あなたのネットワークに既に割り当て済みのアドレス範囲と重複する場合です。Swarm ユーザがコマンドで --subnet を毎回指定するのを避けるには、異なるネットワーク範囲を使う方が望ましいでしょう。

デフォルトのアドレス・プールを変更するには、Swarm 初期化時に、コマンドラインのオプションで --default-addr-pool を使う必要があります。このコマンドライン・オプションはサブネット・マスク定義に CIDR 記法を使います。Swarm に対してアドレス・プールを調整して作成するには、少なくとも1つのデフォルト・アドレス・プールの指定が必要で、デフォルトのアドレス・プール・サブネットマスクの指定はオプションです。たとえば、 10.0.0.0/27 の場合は 27 の値を使います。

--default-addr-pool オプションで指定したアドレス範囲から、Docker がサブネット・アドレスを割り当てます。たとえば、コマンドライン・オプション --default-addr-pool 10.10.0.0/16 が示すのは、Docker が /16 のアドレス範囲からサブネットを割り当てます。もしも --default-addr-pool-mask-len が未指定か 24 を明示する場合は、この結果 10.10.X.0/24 から 256 /24 が割り当てられます。

--default-addr-pool からのサブネットの範囲( 10.10.0.0/16 )を与えられます。この 16 の大きさが表すのは、 default-addr-pool 範囲内で作成可能な、ネットワーク1つあたりの数です。Docker がオーバレイ・サブネットを使うために、追加のアドレスを提供するオプション指定するため、 --default-addr-pool オプションは複数回指定する場合もあります。

コマンドの形式とは、このようなものです。

$ docker swarm init --default-addr-pool <IP range in CIDR> [--default-addr-pool <IP range in CIDR> --default-addr-pool-mask-length <CIDR value>]

10.20.0.0 ネットワークに対して /16 (クラスB)を持つデフォルトの IP アドレス・プールの作成とは、次のようなものです。

$ docker swarm init --default-addr-pool 10.20.0.0/16

10.20.0.010.30.0.0 ネットワークに対して /16 (クラスB)のデフォルト IP アドレス・プールを作成し、各ネットワークに対して /26 のサブネット・マスクを作成するには、次のようにします。

$ docker swarm init --default-addr-pool 10.20.0.0/16 --default-addr-pool 10.30.0.0/16 --default-addr-pool-mask-length 26

この例では、 docker network create -d overlay net1 によって、 net1 に対して 10.20.0.0/26 としてサブネットが割り当てられます。そして、 docker network create -d overlay net2 によって、 net2 に対して 10.20.0.24/26 としてサブネットが割り当てられます。これがサブネットを使い切るまで続きます。

詳しい情報は以下のページもご覧ください。

  • Swarm のネットワーク機能 に、デフォルト・アドレス・プールに関する詳しい情報があります

  • docker swarm init コマンドライン・リファレンス に、 --default-addr-pool フラグに関する詳しい情報があります。

アドバタイズ・アドレスの設定

manager ノードはアドバタイズ・アドレス(advertise address)を使い、 swarm 上で他のノードが Swarmkit API とオーバレイ・ネットワーク機能にアクセスできるようにします。swarm 上の他のノードは、このアドバタイズ・アドレスを使って manager ノードに対してアクセスできるようにする必要があります。

もしアドバタイズ・アドレスを指定しなければ、Docker が単一の IP アドレスを持っているかどうか確認します。もし単一であれば、 Docker はその IP アドレスを使い、デフォルトでポート 2377 をリッスンします。システムが複数の IP アドレスを持つ場合は、manager 間での内部通信やオーバレイ・ネットワーク機能のため、 --advertise-addr で適切な指定が必須です。

$ docker swarm init --advertise-addr <MANAGER-IP>

1番目の manager ノードが他のノードから到達できない場合は、マネージャに対して接続できるアドレスを --advertise-addr で指定する必要があります。たとえば、クラウドでのセットアップでは、リージョンが異なったり、ホストがリージョン内と外部のアクセスでは異なる内部アドレスを持つ場合があり、そのリージョンの外から使うアドレスを指定しなくてはいけません。たとえば、 --advertise-addr で外部のアドレスを指定すると、他のノードに対して継続してノードに接続するための情報として、この情報を伝達(propagete)します。

アドバタイズ・アドレスに関する詳しい情報は、 docker swarm init コマンドライン・リファレンス をご覧ください。

join コマンドの表示や、swarm join トークンの更新

ノードが swarm に参加するには、シークレット・トークンが必要です。worker ノードに対するトークンは、 manager ノードに対するトークンとは異なります。ノードが使えるのは、swarm に参加するための瞬間的な参加トークン(join-token)のみです。参加トークンが更新されても、既にノードが swarm に参加している状態であれば、ノードの swarm メンバーに対する影響はありません。トークンを更新するのは、 swarm に対して新しいノードの参加を古いトークンを使って試みさせないためです。

worker ノードが参加するためのトークンを含む join コマンドを表示するには、次のようにします。

$ docker swarm join-token worker

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
    192.168.99.100:2377

This node joined a swarm as a worker.

manager ノードとして参加するコマンドとトークンを表示するには、次のように実行します。

$ docker swarm join-token manager

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-59egwe8qangbzbqb3ryawxzk3jn97ifahlsrw01yar60pmkr90-bdjfnkcflhooyafetgjod97sz \
    192.168.99.100:2377

--quiet フラグを使うと、トークンのみを表示します。

$ docker swarm join-token --quiet worker

SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c

参加トークンには swarm に参加するために必要なシークレットを含みますので、取り扱いに注意してください。特に、バージョン管理においてシークレットを確認するのは悪いプラクティスです。これは誰もがアプリケーションのソースコードにアクセス可能であれば、誰でも swarm に新しいノードを追加できるからです。manager トークンは極めて注意すべきです。これがあれば、新しいマネージャが参加できるようになり、swarm 全体の制御を得られるからです。

私たちは、以下の状況であれば join トークンをローテートするのを推奨します。

  • バージョン管理システムに誤ってトークンが入ってしまった場合、グループチャットや事故報告書などに記録します

  • ノードは既に信用できない状態であると想定します。

  • 新たなノードを一切 swarm に参加させない状況を確保します。

付け加えておくと、ベストプラクティスは、swarm join トークンを含むあらゆるシークレットを、定期的に更新(ローテーション)する実装です。私たちが推奨するのは、少なくとも6ヶ月ごとのトークン更新です。

swarm join-token --rotate を実行すると、古いトークンを無効化し、新しいトークンを生成します。更新するのトークンは workermanager ノードかどちらか指定できます。

$ docker swarm join-token  --rotate worker

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-2kscvs0zuymrsc9t0ocyy1rdns9dhaodvpl639j2bqx55uptag-ebmn5u927reawo27s3azntd44 \
    192.168.99.100:2377

詳しく学ぶ

参考

Run Docker Engine in swarm mode

https://docs.docker.com/engine/swarm/ingress/