関連記事
[導入編]docker-machine + さくらのクラウドでお手軽リモートdockerするよ
[実践編]docker-machine + さくらのクラウドでリモートdocker:ビルドサーバ作るよ
[実践編]docker-machine + さくらのクラウド:石狩〜東京間でスケールアウト可能なswarmクラスタ組むよ。
はじめに
前回はswarmを使ってクラスタリングしてみました。
今回は一歩進んで、クラスタの構成情報を専用のネットワークに分離した上でKVS(Key-Value-Store)で管理するようにしてみます。
ネットワークの分離にはdocker1.9にて正式実装されたマルチホストネットワーク機能を利用します。
また、さくらのクラウドのスイッチ/ルーター機能を利用するため、docker-machine-sakuracloud v0.0.5を使用します。
参考情報
マルチホストネットワークについては以下の記事が参考になると思います。
Dockerのoverlayネットワークでコンテナを分散実行
docker-machine-sakuracloud v0.0.5について
今回docker1.9を利用するにあたりdocker-machine-sakuracloudをバージョンアップしました。
主な変更点は以下の通りです。
-
docker-machine 0.5.1で行われたプラグイン関連の後方互換性のない変更への対応
2015/12/5:後方互換が確保されるようにdocker-machine側が修正されていました。 -
マシン作成時にカーネル3.16以降を適用
-
マシン作成時にスイッチ/ルーター接続済みのNICを設定するオプションの追加
以下のようにオプション指定することでプライベートIPを持ったマシンを作成できます。
2016/1/21:追加NICのIPアドレス指定オプションを修正
$ docker-machine create -d sakuracloud \
--sakuracloud-access-token [アクセストークン] \
--sakuracloud-access-token-secret [トークンシークレット] \
--sakuracloud-connected-switch [さくらのクラウドで作成したスイッチのID] \
--sakuracloud-private-ip [追加NICのIPアドレス] \
--sakuracloud-private-ip-subnet-mask [追加NICのサブネットマスク] \
sakura-dev
カーネル3.16以降に対応したことでdocker1.9のネットワーク機能が利用できるようになりました。
今回の手順と構成
手順
- さくらのクラウド上でスイッチ/ブリッジを作成
- クラスタの構成情報を格納するKVS(consul)ノードを作成
- swarmマネージャノードを作成
- swarmエージェントノードを各リージョンに作成
- dockerオーバーレイネットワークの作成
- コンテナを作成して動作確認
構成
前回の構成に加えてdockerにてoverlayドライバを利用し、
クラスタ間での通信を管理系として公開系とは別ネットワークに分離してみます。
マシン作成には前回と同じくdocker-machine-sakuracloudを使います。
docker-machine-sakuracloudの使い方についてはこちらを参照してください。
マシン一覧
役割 | リージョン | サーバ名 | 公開系IP | 管理系IP |
---|---|---|---|---|
KVS(consul) | 石狩第1リージョン | sakura-is1a-kvs | (さくらのクラウドで自動割当) | 192.168.11.101/24 |
swarmマネージャ | 石狩第1リージョン | sakura-is1a-manager | (さくらのクラウドで自動割当) | 192.168.11.151/24 |
swarmエージェント | 石狩第1リージョン | sakura-is1a-agent | (さくらのクラウドで自動割当) | 192.168.11.201/24 |
石狩第2リージョン | sakura-is1b-agent | (さくらのクラウドで自動割当) | 192.168.11.202/24 | |
東京第1リージョン | sakura-tk1a-agent | (さくらのクラウドで自動割当) | 192.168.11.203/24 |
準備
前回と違いクラスタの管理情報をconsulに格納するため、swarm用のディスカバリトークンは必要ありません。
マシンを計5台作成することになるため、入力で楽するために以下環境変数を設定しておきます。
以降の説明では環境変数設定済みという前提で記載していきます。
# コマンド入力補助用の環境変数設定
$ export SAKURACLOUD_ACCESS_TOKEN=[さくらのクラウドのアクセストークン]
$ export SAKURACLOUD_ACCESS_TOKEN_SECRET=[さくらのクラウドのトークンシークレット]
実施
手順1. さくらのクラウド上でスイッチ/ブリッジを作成
各リージョンにスイッチを追加し各マシンへ接続します。
さくらのクラウドの管理コンソール上から作業してください。
スイッチの追加
管理コンソール左ナビのメニュー内の「スイッチ」から追加しておきます。
ここではスイッチ名「switch_is1a」としておきました。
後ほどスイッチのIDが必要になるため控えておきます。
石狩第2ゾーン、東京第1ゾーンでも同様にスイッチを追加しておきます。
ブリッジの追加とスイッチとの接続
リージョン間のスイッチを接続する「ブリッジ」を追加します。
同じく管理コンソールから作成しましょう。
ブリッジ作成後、ブリッジの詳細画面からスイッチとの接続をお忘れなく。
ブリッジは全リージョン通じて1つだけ作成すればOKです。
他のリージョンではスイッチとの接続のみ同様に作業しておいてください。
手順2. クラスタの構成情報を格納するKVS(consul)ノードを作成
KVS(consul)を稼働させるマシンを作成します。
管理系IPとして192.168.11.101/24
を割り当てます。
# 石狩第1リージョンにKVS用のマシン構築
$ docker-machine create -d sakuracloud \
--sakuracloud-connected-switch [手順1で控えたスイッチのID] \
--sakuracloud-additional-ip 192.168.11.101 \
--sakuracloud-additional-subnet-mask 255.255.255.0 \
sakura-is1a-kvs
作成したらconsulを起動しておきます。
起動時に管理系IPにexposeするようにpオプションをIP付き指定しておきます。
# dockerで作成したマシンを使うように設定
$ eval "$(docker-machine env sakura-is1a-kvs)"
# consul起動
$ docker run -d -p "192.168.11.101:8500:8500" -h "consul" progrium/consul -server -bootstrap
手順3. swarmマネージャノードを作成
続けてswarmマネージャノードを作成します。
swarm管理情報の格納先として、先ほどのconsulのIPアドレス+ポート192.168.11.101:8500
を指定しています。
また、--engine-opt
を指定しdockerデーモンへクラスタ管理情報の扱い方を指示しています。
cluster-store
でクラスタ管理情報の格納先を指定し、
cluster-advertise
でクラスタ管理情報をやり取りするNICとポート番号を指定しています。
$ docker-machine create -d sakuracloud \
--swarm \
--swarm-master \
--swarm-discovery consul://192.168.11.101:8500 \
--engine-opt="cluster-store=consul://192.168.11.101:8500" \
--engine-opt="cluster-advertise=eth1:2376" \
--sakuracloud-connected-switch [手順1で控えたスイッチのID] \
--sakuracloud-private-ip 192.168.11.151 \
--sakuracloud-private-ip-subnet-mask 255.255.255.0 \
sakura-is1a-manager
手順4. swarmエージェントノードを各リージョンに作成
石狩第1、石狩第2、東京リージョン各リージョンにswarmエージェントノードを作成します。
--swarm-master
の指定がないことと、
各リージョンでスイッチのIDが異なることに注意してください。
# 石狩第1リージョン
$ docker-machine create -d sakuracloud \
--swarm \
--swarm-discovery consul://192.168.11.101:8500 \
--engine-opt="cluster-store=consul://192.168.11.101:8500" \
--engine-opt="cluster-advertise=eth1:2376" \
--sakuracloud-connected-switch [手順1で控えたスイッチのID] \
--sakuracloud-private-ip 192.168.11.201 \
--sakuracloud-private-ip-subnet-mask 255.255.255.0 \
--sakuracloud-region is1a \
sakura-is1a-agent
# 石狩第2リージョン
$ docker-machine create -d sakuracloud \
--swarm \
--swarm-discovery consul://192.168.11.101:8500 \
--engine-opt="cluster-store=consul://192.168.11.101:8500" \
--engine-opt="cluster-advertise=eth1:2376" \
--sakuracloud-connected-switch [手順1で控えたスイッチのID] \
--sakuracloud-private-ip 192.168.11.202 \
--sakuracloud-private-ip-subnet-mask 255.255.255.0 \
--sakuracloud-region is1b \
sakura-is1b-agent
# 東京第1リージョン
$ docker-machine create -d sakuracloud \
--swarm \
--swarm-discovery consul://192.168.11.101:8500 \
--engine-opt="cluster-store=consul://192.168.11.101:8500" \
--engine-opt="cluster-advertise=eth1:2376" \
--sakuracloud-connected-switch [手順1で控えたスイッチのID] \
--sakuracloud-private-ip 192.168.11.203 \
--sakuracloud-private-ip-subnet-mask 255.255.255.0 \
--sakuracloud-region tk1a \
sakura-tk1a-agent
ここまでで計5台のマシンができているはずです。
以下コマンドで確認しておきましょう。
$ docker-machine ls
それぞれのマシンにSSH接続し、管理系IP宛でpingが通ることも確認できます。
$ docker-machine ssh sakura-tk1a-agent
$ ping 192.168.11.201 #東京から石狩へpingが届く
ここまででクラスタを構成するマシンの準備ができました。
次回はいよいよdockerでoverlayネットワークを構築してみましょう。
本日は以上です。