2015年11月20日金曜日

CentOS7 + AWS で docker-swarm を試してみた

概要

docker-swarm は複数の docker-engine を 1 つの docker-engine として扱うことができるクラスタリングツールです
コンテナがいっぱいになってスケールしたいとき docker-engine をクラスタに追加することで簡単にコンテナをスケールすることができるようになります
今回は例のごとく Getting Started を試してみたので紹介します

環境

  • CentOS7 64bit
  • docker-machine 0.5.0
  • docker-engine 1.8.3

事前準備

docker-swarm は docker-machine の機能を使っているので事前に docker-machine をインストールしてください
http://kakakikikeke.blogspot.jp/2015/11/try-docker-machine-with-aws.html

クラスタをディスカバリするためのトークンを生成する

docker-swarm で生成するクラスタはトークンを使って、どのクラスタかを管理します
まずはトークンを作成するために 1 台マシンを構築します

  • docker-machine create --driver amazonec2 --amazonec2-access-key [Your Access Key] --amazonec2-secret-key [Your Secret Key] --amazonec2-vpc-id vpc-xxxxxxxx --amazonec2-region ap-northeast-1 --amazonec2-zone c token-machine

この辺のコマンドは前回の docker-machine の紹介で記載したコマンドと同じです
10 分くらいでインスタンスが立ち上げるので待ちましょう
作成できたら、マシンを確認後、環境変数を読み込みます

  • docker-machine ls
  • eval "$(docker-machine env token-machine)"

そしてこのマシン上で 1 つコンテナを立ち上げます
コンテナの元イメージになるのは DockerHub で公開されている swarm というイメージを使います

  • docker run swarm create

これを実行するとイメージのダウンロードが始まり、その後コンテナが起動され、以下のようにコンソールに出力されます

Unable to find image ‘swarm:latest’ locally
latest: Pulling from library/swarm
2bc79aec8ea0: Pull complete
dc2fb86a875a: Pull complete
435e648d0f23: Pull complete
e16042a92d05: Pull complete
045bd7b00b5b: Pull complete
3caea1253d76: Pull complete
2b4c55187a27: Pull complete
6b40fe7724bd: Pull complete
Digest: sha256:51a30269d3f3aaa04f744280e3c118aea032f6df85b49819aee29d379ac313b5
Status: Downloaded newer image for swarm:latest
6c56e07a671372421a6724ce79047d2f

この出力の最後の文字列「6c56e07a671372421a6724ce79047d2f」これをトークンとして使います

クラスタ内でのマスターノードを作成する

トークンが取得できたらクラスタを構築していきます
docker-swarm のクラスタの世界ではマスターと、それ以外のエージェントノードで構成されます
まずはマスターノードを作成する必要があります

  • docker-machine create --driver amazonec2 --amazonec2-access-key [Your Access Key] --amazonec2-secret-key [Your Secret Key] --amazonec2-vpc-id vpc-xxxxxxxx --amazonec2-region ap-northeast-1 --amazonec2-zone c --swarm --swarm-master --swarm-discovery token://6c56e07a671372421a6724ce79047d2f swarm-master

コマンドが長くなってきました
前半のドライバの指定やアクセスキーの指定は同じです
違うのは --swarm 以降のコマンドでこれを指定することでクラスタとして作成することができます
--swarm-master オプションを付けることでマスターとしてノードを立ち上げることができます
そして、先ほど作成したトークンを --swarm-discovery オプションを使って指定します

無事ノードが作成されれば完了です

エージェントノードを追加する

マスターノードができたらエージェントノードを追加していきます
クラスタをスケールさせたいときにはこのエージェントノードを追加していきます

  • docker-machine create --driver amazonec2 --amazonec2-access-key [Your Access Key] --amazonec2-secret-key [Your Secret Key] --amazonec2-vpc-id vpc-xxxxxxxx --amazonec2-region ap-northeast-1 --amazonec2-zone c --swarm --swarm-discovery token://6c56e07a671372421a6724ce79047d2f agent01

コマンドは先程のコマンドとほぼ同じです
--swarm-master の指定がないのと作成するノード名がことなるだけです
こんな感じで agent02 まで作成しましょう

作成できたノードを確認する

  • docker-machine ls
NAME          ACTIVE   DRIVER      STATE     URL                        SWARM
token-machine *        amazonec2   Running   tcp://xx.xx.xx.xx:2376    
swarm-master  -        amazonec2   Running   tcp://xx.xx.xx.xx:2376     swarm-master (master)
agent01       -        amazonec2   Running   tcp://xx.xx.xx.xx:2376     swarm-master
agent01       -        amazonec2   Running   tcp://xx.xx.xx.xx:2376     swarm-master

でノードの一覧を確認することができます
SWARMの欄にマスターノードの名前が記載されていることが確認できると思います
また、クラスタ内のマスターノードには (master) があると思います

docker-machine コマンドの他に docker-info コマンドでもクラスタの状況を確認することができます

クラスタ内にコンテナを作成する

まずは docker コマンドでこのコンテナを操作できるようにします

  • eval "$(docker-machine env --swarm swarm-master)"

env コマンドで環境を表示させ、eval で評価します
これで docker コマンドをコンテナ内で使うことができます
あとはいつも通り docker run すればマスターノードが適当なエージェントノード内にコンテナを作成してくれます

  • docker run hello-world
  • docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                                   NAMES
103e4ed46f78        hello-world         "/hello"                 2 minutes ago       Exited (0) 2 minutes ago                                           agent01/drunk_kalam

最後に

紹介は以上です

ノードを増やしてスケールさせたい場合は docker-machine create して、ノードを削除したい場合は docker-machine rm すれば OK です
docker-machine rm でマスターノードを指定するとクラスタがおかしくなるので注意してください

コンテナの数が数百や数千を超えるような場合には非常に便利な機能だと思いました
コンテナの数やコンテナのリソース消費を監視してキャパシティプランニングまでやってくれると非常に嬉しいなと思いました
いまマシンが足りないから自動で EC2 上にマシンを構築してクラスタに追加しましたとか
さすがに現状だとそこまではやってくれないっぽいです

0 件のコメント:

コメントを投稿