6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

さくらのクラウドで、Dockerクラスタ作成とMulti-host networkingを試す

Last updated at Posted at 2015-12-18

さくらのクラウド、いつもお世話になっています。

さくらのクラウド、Dockerのホスト動かしたり、検証用途で使わせていただいています。
すぐサーバーが作成でき、使う事ができる。しかも、使った分だけしかお金がかからない。

便利ですね!

実は、11月に「さくら石狩DC見学ツアー」に参加しました。
https://picasablog.wordpress.com/2015/11/19/第4回「さくら石狩dc見学ツアー」に参加しました/

その際に頂いた、さくらのクラウドのクーポンで「Dockerのクラスタを作る」検証をしてみました。

※検証のため、firewallオフ、rootでの操作を行っています。
運用する際には、適切なfirewallの設定、権限の操作でお願いします。

Docker SwarmでDockerクラスタを作る。

事前に、石狩第1ゾーンに、Ubuntu Server 14.04 3 LTS 64bit (Dockerホスト用)
事前に、石狩第2ゾーンに、Ubuntu Server 14.04 3 LTS 64bit (Dockerホスト用)
事前に、東京第1ゾーンに、CentOS 7.1 64bit (consul用)
のサーバーを作成します。(説明省略)

ゾーン ホスト名 IP
石狩第1ゾーン docker-host-1 a.a.a.a
石狩第2ゾーン docker-host-2 b.b.b.b
東京第1ゾーン consul c.c.c.c

http://kakakikikeke.blogspot.jp/2015/10/centos-consul.html より引用

consul構築

[root@consul ~]# systemctl stop firewalld
[root@consul ~]# cd /usr/bin
[root@consul ~]# curl -O https://dl.bintray.com/mitchellh/consul/0.5.2_linux_amd64.zip
[root@consul ~]# unzip 0.5.2_linux_amd64.zip
[root@consul ~]# consul agent -server -bootstrap -client=0.0.0.0 -data-dir /tmp/consul

Dockerホスト構築

公式のインストール方法に従って構築します。(説明省略)
https://docs.docker.com/engine/installation/ubuntulinux/

# docker run hello-world

Swarmクラスタ構築

こちらも、公式のインストール方法に従って構築します。
https://docs.docker.com/swarm/install-manual/

# docker pull swarm

Swarm node構築

それぞれのDockerホストで、別ターミナル上で

# docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

このコマンドを入力したターミナルには、ログが流れるので、複数ターミナルを開いています。

それぞれのDockerホストで

docker-host-1

# docker run -d swarm join --addr=a.a.a.a:2375 consul://c.c.c.c:8500/nodes

docker-host-2

# docker run -d swarm join --addr=b.b.b.b:2375 consul://c.c.c.c:8500/nodes

Swarm manager構築

それぞれのDockerホストで

# docker run -d -p 10000:2375 swarm manage consul://c.c.c.c:8500/nodes

クラスタの情報を見てみる

# docker -H tcp://localhost:10000 info
Containers: 32
Images: 7
Role: primary
Strategy: spread
Filters: health, port, dependency, affinity, constraint
Nodes: 2
 docker-host-1: a.a.a.a:2375
  └ Status: Healthy
  └ Containers: 16
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 1.019 GiB
  └ Labels: executiondriver=native-0.2, kernelversion=3.16.0-28-generic, operatingsystem=Ubuntu 14.04.3 LTS, storagedriver=aufs
 docker-host-2: b.b.b.b:2375
  └ Status: Healthy
  └ Containers: 16
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 1.019 GiB
  └ Labels: executiondriver=native-0.2, kernelversion=3.16.0-28-generic, operatingsystem=Ubuntu 14.04.3 LTS, storagedriver=aufs
CPUs: 2
Total Memory: 2.038 GiB
Name: 082f0047225d

2つのノードが確認できました。

コンテナを沢山起動してみる。

コンテナが、どのようにスケジューリングされるかの説明です。(URL先)
https://docs.docker.com/swarm/scheduler/strategy/
今回は、
Strategy: spreadなので、均等にコンテナが配置されるはずです。

試してみます。

# docker -H tcp://localhost:10000 ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

このコマンドを10回入力

# docker -H tcp://localhost:10000 run -itd ubuntu /bin/bash
# docker -H tcp://localhost:10000 ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
94248b8d581e        ubuntu              "/bin/bash"         53 seconds ago       Up 52 seconds                           docker-host-2/serene_goldberg
14756426159c        ubuntu              "/bin/bash"         About a minute ago   Up About a minute                       docker-host-1/lonely_brown
648aacfd52cc        ubuntu              "/bin/bash"         About a minute ago   Up About a minute                       docker-host-2/sharp_kowalevski
5e252ac1cd66        ubuntu              "/bin/bash"         About a minute ago   Up About a minute                       docker-host-1/condescending_engelbart
75ef8b2e8489        ubuntu              "/bin/bash"         About a minute ago   Up About a minute                       docker-host-2/sad_liskov
90bd7d46fe05        ubuntu              "/bin/bash"         About a minute ago   Up About a minute                       docker-host-1/cocky_wright
64d4378d3552        ubuntu              "/bin/bash"         About a minute ago   Up About a minute                       docker-host-2/angry_archimedes
dcaeb7fd8bbc        ubuntu              "/bin/bash"         About a minute ago   Up About a minute                       docker-host-1/stoic_jang
c8e476c8faac        ubuntu              "/bin/bash"         About a minute ago   Up About a minute                       docker-host-1/agitated_curie
264b7a389a79        ubuntu              "/bin/bash"         About a minute ago   Up About a minute                       docker-host-2/sharp_hypatia

それぞれのノードに5つずつコンテナが配置されました。

Multi-host networkingでDockerホストを跨ぐネットワークを作る。

先程は、クラスタを作りました、しかし、ノード間のコンテナ同士は同じネットワークではありません。
そこで、別ノード間(別ホスト)でもコンテナ同士が同じネットワークに繋がるようにします。

https://docs.docker.com/engine/userguide/networking/get-started-overlay/
Multi-host networkingを利用するには、Linux Kernelが3.16以上でないと利用できません。

それぞれのDockerホストでカーネルをアップデートします。

http://www.neko6.info/archives/1874 より引用

# apt-get install linux-image-3.16.0-28-generic linux-headers-3.16.0-28

https://github.com/docker/docker/issues/14026 より引用

# apt-get -y update
# apt-get -y upgrade
# apt-get -y dist-upgrade
# apt-get -y install aufs-tools openjdk-7-jre curl wget git vim make php-pear \
php5-dev php5-curl python mc gawk ssh grep sudo htop nmon mysql-client php5-cli \
sqlite3 sysstat sysdig linux-headers-$(uname -r) lxc bsdtar
# apt-get -y install linux-image-extra-$(uname -r)
# modprobe aufs
# apt-get clean
# reboot

先ほど同様、それぞれのDockerホストで別ターミナルを開いて

# docker daemon --cluster-advertise=eth0:2376 --cluster-store=consul://c.c.c.c:8500/nodes -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

docker-host-1

# docker run -d swarm join --addr=a.a.a.a:2375 consul://c.c.c.c:8500/nodes

docker-host-2

# docker run -d swarm join --addr=b.b.b.b:2375 consul://c.c.c.c:8500/nodes

それぞれのDockerホストで

# docker run -d -p 10000:2375 swarm manage consul://c.c.c.c:8500/nodes

どちらかのホストで

# docker network create --driver overlay my-net

それぞれのDockerホストで

# docker -H tcp://localhost:10000 run --net=my-net -i -t ubuntu /bin/bash

立ち上がったコンテナは、10.0.0.* のIPが割り振られます。

立ち上がったコンテナ同士をpingを実行すると、ネットワークが繋がっている事を確認できます。

感想

クラスタというと、結構難しいのかなと思っていましたが、
swarmをpullしてノードであったり、マネージャーが組めるのはすごく楽だなと思いました。

HA構成も組めるようですので、組んでみたいと思います。

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?