[実践編]docker + さくらのクラウドでマルチホストなoverlayネットワークしてみるよ(準備編)

#### 関連記事

[[導入編]docker-machine + さくらのクラウドでお手軽リモートdockerするよ](http://qiita.com/yamamoto-febc/items/4aff7472fc1ea025db0a)

[[実践編]docker-machine + さくらのクラウドでリモートdocker:ビルドサーバ作るよ](http://qiita.com/yamamoto-febc/items/48510a570d6758a6e5b2)

[[実践編]docker-machine + さくらのクラウド：石狩〜東京間でスケールアウト可能なswarmクラスタ組むよ。](http://qiita.com/yamamoto-febc/items/870e615c01315096039b)

* * * 

# はじめに

[前回](http://qiita.com/yamamoto-febc/items/870e615c01315096039b)はswarmを使ってクラスタリングしてみました。
今回は一歩進んで、クラスタの構成情報を専用のネットワークに分離した上でKVS(Key-Value-Store)で管理するようにしてみます。

ネットワークの分離にはdocker1.9にて正式実装されたマルチホストネットワーク機能を利用します。
また、さくらのクラウドのスイッチ/ルーター機能を利用するため、[docker-machine-sakuracloud v0.0.5](https://github.com/yamamoto-febc/docker-machine-sakuracloud/releases/tag/v0.0.5)を使用します。

### 参考情報

マルチホストネットワークについては以下の記事が参考になると思います。

[Docker : マルチホスト間での仮想ネットワーク](http://qiita.com/Arturias/items/dd7f9e2365626dd4ad51)

[Dockerのoverlayネットワークでコンテナを分散実行](http://qiita.com/zembutsu/items/4cd756ff8be4be76e5a3)


### docker-machine-sakuracloud v0.0.5について

今回docker1.9を利用するにあたり[docker-machine-sakuracloud](https://github.com/yamamoto-febc/docker-machine-sakuracloud/releases/tag/v0.0.5)をバージョンアップしました。
主な変更点は以下の通りです。

 - docker-machine 0.5.1で行われたプラグイン関連の[後方互換性のない変更](https://github.com/docker/machine/issues/2325)への対応 
    :up: 2015/12/5:後方互換が確保されるようにdocker-machine側が修正されていました。

 - マシン作成時にカーネル3.16以降を適用
 - マシン作成時にスイッチ/ルーター接続済みのNICを設定するオプションの追加


以下のようにオプション指定することでプライベートIPを持ったマシンを作成できます。
    :up: 2016/1/21:追加NICのIPアドレス指定オプションを修正
 
 ```bash
 
 $ 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のネットワーク機能が利用できるようになりました。


## 今回の手順と構成

![kobito.1449061175.615776.png](https://qiita-image-store.s3.amazonaws.com/0/20668/af32eafc-15e7-2cf0-5683-c549ef4e6721.png "kobito.1449061175.615776.png")


### 手順

  1. さくらのクラウド上でスイッチ/ブリッジを作成
  2. クラスタの構成情報を格納するKVS(consul)ノードを作成
  3. swarmマネージャノードを作成
  4. swarmエージェントノードを各リージョンに作成
  5. dockerオーバーレイネットワークの作成
  6. コンテナを作成して動作確認

### 構成

[前回](http://qiita.com/yamamoto-febc/items/870e615c01315096039b)の構成に加えてdockerにてoverlayドライバを利用し、
クラスタ間での通信を管理系として公開系とは別ネットワークに分離してみます。

マシン作成には前回と同じくdocker-machine-sakuracloudを使います。
docker-machine-sakuracloudの使い方については[こちら](http://qiita.com/yamamoto-febc/items/4aff7472fc1ea025db0a)を参照してください。


### マシン一覧

| 役割         | リージョン        | サーバ名                 |公開系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

### 準備

[前回](http://qiita.com/yamamoto-febc/items/870e615c01315096039b)と違いクラスタの管理情報をconsulに格納するため、swarm用のディスカバリトークンは必要ありません。

マシンを計5台作成することになるため、入力で楽するために以下環境変数を設定しておきます。
以降の説明では環境変数設定済みという前提で記載していきます。

```bash
# コマンド入力補助用の環境変数設定
$ export SAKURACLOUD_ACCESS_TOKEN=[さくらのクラウドのアクセストークン]
$ export SAKURACLOUD_ACCESS_TOKEN_SECRET=[さくらのクラウドのトークンシークレット]
```

# 実施

##  手順1. さくらのクラウド上でスイッチ/ブリッジを作成 

各リージョンにスイッチを追加し各マシンへ接続します。
さくらのクラウドの管理コンソール上から作業してください。

#### スイッチの追加

管理コンソール左ナビのメニュー内の「スイッチ」から追加しておきます。
ここではスイッチ名「switch_is1a」としておきました。

![kobito.1448789763.629505.png](https://qiita-image-store.s3.amazonaws.com/0/20668/32e86b35-0bbc-9941-632f-0fde6d8ef4a1.png "kobito.1448789763.629505.png")

後ほどスイッチのIDが必要になるため控えておきます。

![スイッチ.png](https://qiita-image-store.s3.amazonaws.com/0/20668/db568d25-ba70-36b2-c890-99176a5a4599.png "スイッチ.png")

石狩第２ゾーン、東京第１ゾーンでも同様にスイッチを追加しておきます。


#### ブリッジの追加とスイッチとの接続

リージョン間のスイッチを接続する「ブリッジ」を追加します。
同じく管理コンソールから作成しましょう。

ブリッジ作成後、ブリッジの詳細画面からスイッチとの接続をお忘れなく。


ブリッジは全リージョン通じて1つだけ作成すればOKです。
他のリージョンではスイッチとの接続のみ同様に作業しておいてください。


##  手順2. クラスタの構成情報を格納するKVS(consul)ノードを作成

KVS(consul)を稼働させるマシンを作成します。
管理系IPとして`192.168.11.101/24`を割り当てます。


```bash
# 石狩第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付き指定しておきます。

```bash

# 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とポート番号を指定しています。

```bash
$ 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が異なることに注意してください。

```bash
# 石狩第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台のマシンができているはずです。
以下コマンドで確認しておきましょう。

```bash
$ docker-machine ls
```

![sakura_overlay_—_ubuntu_sakura-dev____—_-bash_—_130×35.png](https://qiita-image-store.s3.amazonaws.com/0/20668/41cb19f5-81fb-d156-5ef7-0fb8d3a49d03.png "sakura_overlay_—_ubuntu_sakura-dev____—_-bash_—_130×35.png")

それぞれのマシンにSSH接続し、管理系IP宛でpingが通ることも確認できます。

```bash
$ docker-machine ssh sakura-tk1a-agent
$ ping 192.168.11.201 #東京から石狩へpingが届く
```

ここまででクラスタを構成するマシンの準備ができました。
次回はいよいよdockerでoverlayネットワークを構築してみましょう。

本日は以上です。