2017年1月20日金曜日

docker-machine の vmwarevsphere ドライバを使って vCenter 上に docker-swarm 環境を構築してみた

概要

docker-machine にはいくつかドライバが用意されており、その中に「vmwarevsphere」というドライバあります
https://docs.docker.com/machine/drivers/
今回はそれを使って vCenter 上に docker 用のホストを作成してみました
また、docker-swarm を使ってホストをクラスタリングしてみました

環境

仮想環境

  • ESXi 5.5.0
    • CPU: Xeon E5-2690 (Sandy Bridge 世代)
    • Memory: 400GB
  • VMware vCenter Server 5.5.0

クライアント側

  • Ubuntu 16.04
  • docker-machine 0.8.2

docker-machine のインストール

こちらを参考にインストールしてください

コンテナホストの作成

それでは、docker-machine を使ってコンテナホストを作成sます

  • docker-machine create --driver vmwarevsphere --vmwarevsphere-username "vcenter_username" --vmwarevsphere-password "vcenter_pass" --vmwarevsphere-vcenter "192.168.10.10" --vmwarevsphere-network "network1" --vmwarevsphere-datastore "datastore1" --vmwarevsphere-datacenter dc1 --vmwarevsphere-hostsystem "cluster/hostname" docker-host1

という感じです
vCenter の IP とログインするためのユーザ名とパスワードを指定します
あとはネットワークとデータストアを指定します
データセンタがある場合はデータセンター名を指定してください
あとはコンテナホストを作成するとクラスタとホストを指定します

作成が完了したら docker-machine ls で確認してみましょう

NAME            ACTIVE   DRIVER          STATE     URL                        SWARM   DOCKER    ERRORS
docker-host1    -        vmwarevsphere   Running   tcp://192.168.10.11:2376           v1.12.6

という感じで作成されていれば OK です
ちなみにゲスト OS は boot2docker が CD ブートで起動しています
http://boot2docker.io/

コンテナを作成してみる

コンテナホストが作成できたらコンテナを作成してみましょう

  • eval $(docker-machine env docker-host1)
  • docker pull nginx
  • docker run -d -p 8080:80 nginx

とりあえず nginx が起動していることが確認できれば OK です

docker-swarm を試してみる

では今度はコンテナホストを swarm でクラスタリングしてみましょう
先程作成した docker-host1 はそのまま使います
まず swarm というコンテナを docker-host1 上で動作させます

  • docker run swarm create
Unable to find image 'swarm:latest' locally
latest: Pulling from library/swarm
3ff891db6a4d: Pull complete
5e01cc94d2a7: Pull complete
692b182fbe11: Pull complete
Digest: sha256:e20f9cf2b432451f99100acceac562a2b6620aad1301f8679e8ff8afe0360bef
Status: Downloaded newer image for swarm:latest
a1c0e3cd866eb1e2bb0875355ff1e5a5

ここで最後の一行に表示された文字列 (トークン) をメモしておきましょう
swarm を構築する際に使います
起動したらクラスタを構成するホストコンテナを追加していきます
swarm にはマスタとノードという 2 役があり、master が必ず必要なので先に master を作成しましょう

swarm master 作成

  • docker-machine create --driver vmwarevsphere --vmwarevsphere-username "vcenter_username" --vmwarevsphere-password "vcenter_pass" --vmwarevsphere-vcenter "192.168.10.10" --vmwarevsphere-network "network1" --vmwarevsphere-datastore "datastore1" --vmwarevsphere-datacenter dc1 --vmwarevsphere-hostsystem "cluster/hostname" --swarm --swarm-master --swarm-discovery token://a1c0e3cd866eb1e2bb0875355ff1e5a5 docker-host-swarm-master1

長い、、、ですが追加しているのは --swarm 以降のオプションだけです

--swarm --swarm-master --swarm-discovery token://a1c0e3cd866eb1e2bb0875355ff1e5a5 docker-host-swarm-master1

今回は master なので --swarm-master オプションを指定しています
ではこの調子でノード役を追加していきます

swarm node 作成

  • docker-machine create --driver vmwarevsphere --vmwarevsphere-username "vcenter_username" --vmwarevsphere-password "vcenter_pass" --vmwarevsphere-vcenter "192.168.10.10" --vmwarevsphere-network "network1" --vmwarevsphere-datastore "datastore1" --vmwarevsphere-datacenter dc1 --vmwarevsphere-hostsystem "cluster/hostname" --swarm --swarm-discovery token://a1c0e3cd866eb1e2bb0875355ff1e5a5 docker-host-agent-node1

長い、、、ですが、これも --swarm 以降のオプションを追加してるだけです
しかもノード役の場合は --swarm-master オプションもないので少し短くなっています
今回は折角なので docker-host-agent-node2 も作成しましょう

できたら docker-machine ls で確認してみます

NAME                        ACTIVE   DRIVER          STATE     URL                        SWARM                                DOCKER    ERRORS
docker-host1                *        vmwarevsphere   Running   tcp://192.168.10.11:2376                                        v1.13.0
docker-host-agent-node1     -        vmwarevsphere   Running   tcp://192.168.10.13:2376   docker-host-swarm-master1            v1.13.0
docker-host-agent-node2     -        vmwarevsphere   Running   tcp://192.168.10.14:2376   docker-host-swarm-master1            v1.13.0
docker-host-swarm-master1   -        vmwarevsphere   Running   tcp://192.168.10.12:2376   docker-host-swarm-master1 (master)   v1.13.0

swarm モードで起動しているコンテナホストには SWARM 欄に master ノードが書かれており、更に master には (master) と書かれています

コンテナを作成してみる

では、swarm 環境にコンテナを構築してみましょう

  • eval "$(docker-machine env --swarm docker-host-swarm-master1)"
  • docker pull nginx
  • docker run -d -p 8080:80 nginx

一度、環境変数を変更して master に向ける必要があります
あとはいつも通りに pull して run します
ps すると、おそらくコンテナがノード役のコンテナホストで動作してることがわかると思います

大量のコンテナを作成してみる

大量にコンテナを作成してちゃんとクラスタとして動作しているか確認してみましょう
とりあえず 20 個ほど作成してみます

for i in `seq -w 1 20`; do echo $i; docker run -d -p 80${i}:80 nginx; done;

これで ps してみるとずらっーとコンテナが表示されると思います
コンテナホストの IP が docker-machine ls でわかっているので、それぞれの IP で grep してカウントしてみましょう
するとちゃんと分散されてコンテナが作成されていることがわかると思います
swarm に属していないコンテナホストには作成されないようです

[root@ubuntu]# docker ps | grep 192.168.10.11 | wc -l
0
[root@ubuntu]# docker ps | grep 192.168.10.13 | wc -l
7
[root@ubuntu]# docker ps | grep 192.168.10.14 | wc -l
7
[root@ubuntu]# docker ps | grep 192.168.10.12 | wc -l
6

ちなみに vSphere Web Client で確認すると各コンテナホストにコンテナ分の仮想 IP が振られていることが確認できると思います

最後に

docker-machine の vmwarevsphere ドライバを使って vCenter 環境に docker クラスタを構築してみました
これをやったあとに気づいたのですが、swarm の管理が素の docker コマンドでもできるようになったようです
service という機能や join などのコマンドがあったので swarm 環境がより操作制御しやすく使いやすくなっていると思います

最近 VIC を触っているのでよく比べてしまうのですが VIC はまだ swarm に対応していないので、swarm を使いたい人は、docker-machine 方式を使ったほうが良いのかもしれません

Tips

マシンの停止と削除は以下のように実施します
削除したあとで環境変数を unset する必要があるので unset しておきましょう

  • docker-machine stop docker-host1
  • docker-machine rm docker-host1
  • eval $(docker-machine env -u)

参考サイト

0 件のコメント:

コメントを投稿