Help us understand the problem. What is going on with this article?

【DockerSwarm】30分でDockerクラスターを構築してみる

More than 3 years have passed since last update.

なにこれ

ChefSoloでDockerホストをガンガン立てて、DockerSwarmでクラスタリングして
一つのリソースプールにするお話し。趣味で使う数値計算の分散基盤に使う予定。
※chef-soloを使っていますが、今のご時世、chef-localmodeを使うことを推奨します。
参考: https://blog.isao.co.jp/graduated_from_chef-solo/

※Dockerがセットアップできれば、Ansibleでもなんでも大丈夫です。

注意

  • 決してProduction環境等では使わないでください(セキュリティ対策無しです)

前提条件

  • わりと真っ白なところから。
  • 1台1台手塩をかけてプロビジョニングしたくないのでchef soloを利用する。
  • DockerSwarmによるコンテナオーケストレーションを実施
  • オーケストレーション部分は手動で行う(後日、レシピ追加でこれも自動化予定)

筆者のホスト環境

  • 作業用 (192.168.33.10) ubuntu 14.04 Cpus:2 RAM:2GB
  • master (192.168.33.11) ubuntu 14.04 Cpus:2 RAM:2GB
  • sub-1 (192.168.33.12) ubuntu 14.04 Cpus:2 RAM:2GB
  • sub-2 (192.168.33.13) ubuntu 14.04 Cpus:2 RAM:2GB
  • sub-3 (192.168.33.14) ubuntu 14.04 Cpus:2 RAM:2GB

手順

ホスト群へのDockerのインストール

この章での作業は、作業用マシンでお願いします。

準備

# gitいれる。rbenvのために
$ sudo apt-get install -y git
$ sudo apt-get install -y libssl-dev libreadline-dev zlib1g-dev

# 新しめのrubyいれとく
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
$ rbenv install 2.3.3
$ rbenv global 2.3.3
$ rbenv rehash

# knife-soloをいれる
$ curl -L https://www.opscode.com/chef/install.sh | sudo bash
$ gem install knife-solo
$ gem i berkshelf --no-ri --no-rdoc

# 作業用chefリポ作成
$ knife solo init chef-repo
$ cd chef-repo

レシピを落としてくる

Dockerをインストールするためのレシピをネットから落としてきます。

$ vi Berksfile
site :opscode
cookbook 'docker', '~> 2.13.0'
$ berks vendor cookbooks

Dockerインストールするレシピを書く

※ボキャ貧すぎてhelloにしてしまいましたが、お好きな名前をどうぞ

$ mkdir -p site-cookbooks/hello
$ mkdir -p site-cookbooks/hello/recipes
$ vi site-cookbooks/hello/README.md
これはDockerをインストールするためのレシピです。
$ vi site-cookbooks/hello/metadata.rb
name             'hello'
maintainer       'YOUR_COMPANY_NAME'
maintainer_email 'YOUR_EMAIL'
license          'All rights reserved'
description      'Setup Docker'
long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
version          '0.1.0'
depends          'docker', '~> 2.0'
$ vi site-cookbooks/hello/recipes/default.rb
execute "apt-get-update" do
  command "apt-get update --fix-missing"
  ignore_failure true
end
docker_service 'default' do
  # 0.0.0.0:2376でDockerAPIをEXPOSEしちゃう
  host ["tcp://0.0.0.0:2376", 'unix:///var/run/docker.sock']
  action [:create, :start]
end
# ユーザー名に合わせて編集してください。
execute "set user permission" do
  command "usermod -aG docker vagrant"
end

対象ホスト達にBootstrapを仕込む

SSHの公開鍵の設定はご自身の環境に合わせてください。やっている事としては、以下の2点です。

  • 公開鍵を対象ホスト群へコピーして、鍵でログインできるようにしておく
  • chef-soloを対象ホストにインストール
$ ssh-copy-id -i ~/.ssh/id_rsa.pub vagrant@192.168.33.11
$ ssh-copy-id -i ~/.ssh/id_rsa.pub vagrant@192.168.33.12
$ ssh-copy-id -i ~/.ssh/id_rsa.pub vagrant@192.168.33.13
$ ssh-copy-id -i ~/.ssh/id_rsa.pub vagrant@192.168.33.14

$ knife solo prepare -i ~/.ssh/id_rsa vagrant@192.168.33.11
$ knife solo prepare -i ~/.ssh/id_rsa vagrant@192.168.33.12
$ knife solo prepare -i ~/.ssh/id_rsa vagrant@192.168.33.13
$ knife solo prepare -i ~/.ssh/id_rsa vagrant@192.168.33.14

対象ホスト群のrun_listにレシピ追加

つくったレシピが実行されるように全ホストのrun_listにレシピを追加してください
実は、knifeコマンドでうまくやれるがここでは人力で。

$ vi nodes/192.168.33.11.json
{
  "run_list": [
    "recipe[hello]"
  ],
  "automatic": {
    "ipaddress": "192.168.33.11"
  }
}

対象ホスト群にDockerインストール実施

たまにコケることがあるので、そのときはリトライしてください。

$ knife solo cook -i ~/.ssh/id_rsa vagrant@192.168.33.11
$ knife solo cook -i ~/.ssh/id_rsa vagrant@192.168.33.12
$ knife solo cook -i ~/.ssh/id_rsa vagrant@192.168.33.13
$ knife solo cook -i ~/.ssh/id_rsa vagrant@192.168.33.14

オーケストレーション設定と確認

今回構築したDockerホストは、DockerAPI用のポートを外部にEXPOSEしている為、
基本的には外部から作業が可能です。
(ただ、作業マシンにはDockerが入っていて、対象ホスト群と同じネットワーク上にある必要性があります)

Token生成

ここで生成したトークンは、今後使うのでメモっておいてください。

vagrant@master:~$ docker -H 192.168.33.11:2376 run --rm swarm create                      
Unable to find image 'swarm:latest' locally latest: Pulling from library/swarm                     
220609e0bc51: Pull complete                     
b54bf338fe2f: Pull complete                     
d53aac5750d5: Pull completeDigest: sha256:c9e1b4d4e399946c0542accf30f9a73500d6b0b075e152ed1c792214d3509d70                 
Status: Downloaded newer image for swarm:latest
d3c063f108135XXXXXXXXXXXXXXXXXXX

スレーブのJOIN

vagrant@master:~$ docker -H 192.168.33.12:2376 run -d swarm join --addr=192.168.33.12:2376 token://d3c063f108135XXXXXXXXXXXXXXXXXXX
vagrant@master:~$ docker -H 192.168.33.13:2376 run -d swarm join --addr=192.168.33.13:2376 token://d3c063f108135XXXXXXXXXXXXXXXXXXX
vagrant@master:~$ docker -H 192.168.33.14:2376 run -d swarm join --addr=192.168.33.14:2376 token://d3c063f108135XXXXXXXXXXXXXXXXXXX

マネージャーを立ち上げる

vagrant@master:~$ docker -H 192.168.33.11:2376 run -d -p 12375:2375 swarm manage token://d3c063f108135XXXXXXXXXXXXXXXXXXX

ホスト一覧の確認

JOINしたホストのIPとポート番号が列挙されていれば問題ありません。

vagrant@master:~$ docker -H 192.168.33.11:2376 run --rm swarm list token://d3c063f108135XXXXXXXXXXXXXXXXXXX
192.168.33.14:2375
192.168.33.13:2375
192.168.33.12:2375

各Dockerホストの状態

各ホストにpsコマンド投げた感じ。
これらのSwarm管理用のコンテナは削除しないようにしてください。くれぐれも

vagrant@master:~$ docker -H 192.168.33.11:2376 ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
588ddd969e5a        swarm               "/swarm manage token:"   40 minutes ago      Up 40 minutes       0.0.0.0:12375->2375/tcp   nauseous_hawking
vagrant@master:~$ docker -H 192.168.33.12:2376 ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
f53fd4fc19e3        swarm               "/swarm join --addr=1"   44 minutes ago      Up 44 minutes       2375/tcp            pensive_golick
vagrant@master:~$ docker -H 192.168.33.13:2376 ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
dfae3a02e6a2        swarm               "/swarm join --addr=1"   43 minutes ago      Up 43 minutes       2375/tcp            nostalgic_spence
vagrant@master:~$ docker -H 192.168.33.14:2376 ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
d511dd6b6d17        swarm               "/swarm join --addr=1"   42 minutes ago      Up 42 minutes       2375/tcp            cocky_wozniak

Swarm Manegerにつないでみる

ちゃんとクラスタとして認識されていると思います。
CPU2コア RAM2GMのマシンを3台束ねているので、合計6CPU RAM6GBに
なっていることも確認できます。いったん、ここまででゴール。

vagrant@master:~$ docker -H 192.168.33.11:12375 info                                                                                                                                               
Containers: 3                                                                                                                                                                                      
 Running: 3                                                                                                                                                                                        
 Paused: 0                                                                                                                                                                                         
 Stopped: 0                                                                                                                                                                                        
Images: 3                                                                                                                                                                                          
Server Version: swarm/1.2.5                                                                                                                                                                        
Role: primary                                                                                                                                                                                      
Strategy: spread                                                                                                                                                                                   
Filters: health, port, containerslots, dependency, affinity, constraint                                                                                                                            
Nodes: 3                                                                                                                                                                                           
 slave-1: 192.168.33.12:2376                                                                                                                                                                       
  └ ID: EEZI:UKFK:G2F2:SNWF:C3R6:2NWN:PBJV:XO5R:XB34:I5TL:MMNE:ETXN                                                                                                                               
  └ Status: Healthy                                                                                                                                                                               
  └ Containers: 1 (1 Running, 0 Paused, 0 Stopped)                                                                                                                                                
  └ Reserved CPUs: 0 / 2                                                                                                                                                                          
  └ Reserved Memory: 0 B / 2.053 GiB                                                                                                                                                              
  └ Labels: kernelversion=3.13.0-103-generic, operatingsystem=Ubuntu 14.04.5 LTS, storagedriver=aufs                                                                                              
  └ UpdatedAt: 2016-12-06T15:13:17Z                                                                                                                                                               
  └ ServerVersion: 1.12.3                                                                                                                                                                         
 slave-2: 192.168.33.13:2376                                                                                                                                                                       
  └ ID: O53J:5CP5:D2SL:JR3G:B7KG:E2B6:OWEF:WY36:NWPQ:25FZ:6PVT:DQOW                                                                                                                               
  └ Status: Healthy                                                                                                                                                                               
  └ Containers: 1 (1 Running, 0 Paused, 0 Stopped)                                                                                                                                                
  └ Reserved CPUs: 0 / 2                                                                                                                                                                          
  └ Reserved Memory: 0 B / 2.053 GiB                                                                                                                                                              
  └ Labels: kernelversion=3.13.0-103-generic, operatingsystem=Ubuntu 14.04.5 LTS, storagedriver=aufs                                                                                              
  └ UpdatedAt: 2016-12-06T15:13:18Z                                                                                                                                                               
  └ ServerVersion: 1.12.3                                                                                                                                                                         
 slave-3: 192.168.33.14:2376                                                                                                                                                                       
  └ ID: IB4U:UUJB:RCTB:R7NZ:LBYR:3ZB2:WOR6:2IPA:MLYM:IAMA:T45L:FKGZ                                                                                                                               
  └ Status: Healthy                                                                                                                                                                               
  └ Containers: 1 (1 Running, 0 Paused, 0 Stopped)                                                                                                                                                
  └ Reserved CPUs: 0 / 2                                                                                                                                                                          
  └ Reserved Memory: 0 B / 2.053 GiB                                                                                                                                                              
  └ Labels: kernelversion=3.13.0-103-generic, operatingsystem=Ubuntu 14.04.5 LTS, storagedriver=aufs                                                                                              
  └ UpdatedAt: 2016-12-06T15:14:01Z                                                                                                                                                               
  └ ServerVersion: 1.12.3
Plugins:                                                                                                                                                                                           
 Volume:                                                                                                                                                                                           
 Network:                                                                                                                                                                                          
Swarm:                                                                                                                                                                                             
 NodeID:                                                                                                                                                                                           
 Is Manager: false                                                                                                                                                                                 
 Node Address:                                                                                                                                                                                     
Security Options:                                                                                                                                                                                  
Kernel Version: 3.13.0-103-generic                                                                                                                                                                 
Operating System: linux                                                                                                                                                                            
Architecture: amd64                                                                                                                                                                                
CPUs: 6                                                                                                                                                                                            
Total Memory: 6.158 GiB                                                                                                                                                                            
Name: f8e6c11a239c                                                                                                                                                                                 
Docker Root Dir:                                                                                                                                                                                   
Debug Mode (client): false                                                                                                                                                                         
Debug Mode (server): false                                                                                                                                                                         
WARNING: No kernel memory limit support
abeja
「ディープラーニング」を活用し、多様な業界、シーンにおけるビジネスの効率化・自動化を促進するベンチャー企業です。
https://abejainc.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした