DRBD Manage Docker Volume PluginをUbuntuで試してみた


DockerのVolume PluginにDRBDが追加されていたので試してみました。
この記事の内容は、2016年7月10日の時点で試したものです。

構成
===========

* OS: Ubuntu 16.04
 * kernel: 4.4.0-28-generic
* Docker: 1.12-rc3
* DRBD: 9.0.2-1
* drbdmanage: 0.96.1

* 仮想マシン2台を使用
    * docker-master: 10.255.10.11
    * docker-node01: 10.255.10.12

docker1.12-rc3のインストール
===============================

* docker1.12-rc3のexperimental版をインストールします

```console
# curl -fsSL https://experimental.docker.com/ | sh
# docker --version
Docker version 1.12.0-rc3, build 91e29e8, experimental
```

DRBDのインストール
======================

* DRBDをインストールします

```console
$ sudo add-apt-repository ppa:linbit/linbit-drbd9-stack
$ sudo apt update
$ sudo apt install -y drbd-dkms drbd-utils python-drbdmanage
```

DRBDのセットアップ
=======================

* DRBD Manage Docker Volume Pluginは、あらかじめDRBDクラスタを作成する必要があります

* DRBD用のディスクとしてsdbを用意します
* sdbに対して、volume group であるdrbdpoolを作成します

```console
$ sudo fdisk /dev/sdb
$ sudo pvcreate /dev/sdb1
$ sudo vgcreate drbdpool /dev/sdb1
```

* docker-masterでクラスタの初期化を行います

```console
$ sudo drbdmanage 10.255.10.11
```

* docker-masterでdocker-node01をクラスタに追加します
    * add-node時に出てきたコマンドを docker-node01で実行します

```console
docker-master:~$ sudo drbdmanage add-node docker-node01 10.255.10.12
Operation completed successfully
Operation completed successfully
Host key verification failed.

Join command for node docker-node01:
drbdmanage join -p 6999 10.255.10.12 1 docker-master 10.255.10.11 0 9z+4ULb0ijWfq5xL3nVH
```
```console
docker-node01:~$ sudo drbdmanage join -p 6999 10.255.10.12 1 docker-master 10.255.10.11 0 9z+4ULb0ijWfq5xL3nVH
```

DRBD Manage Docker Volume Plugin をインストール
==================================================

apt でインストールする(ダメ)
------------------

* apt でインストールできるらしいが、おそらく依存関係のせいでインストールできず…

```console
$ sudo apt install -y drbdmanage-docker-volume
Reading package lists... Done
Building dependency tree
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 drbdmanage-docker-volume : Depends: docker.io (>= 1.8.0) but it is not going to be installed
E: Unable to correct problems, you have held broken packages.
```

aptがダメなのでソースからmakeする
-----------------------------------

* githubからソースをクローンする

```console
$ git clone --recursive http://git.drbd.org/drbdmanage-docker-volume.git
```



* `make`は通るが、`make install`は通らない…
  - drbdmanage-docker-volume.8.gzが存在しないのが原因

```console
$ cd ~/drbdmanage-docker-volume/
$ make
python2 setup.py build
running build
$ sudo make install
python2 setup.py install --record .installfiles
running install
running build
running install_data
copying systemd/docker-drbdmanage-plugin.service -> /lib/systemd/system/
copying systemd/docker-drbdmanage-plugin.socket -> /lib/systemd/system/
creating /usr/libexec
creating /usr/libexec/docker
copying drbdmanage-docker-volume -> /usr/libexec/docker/
error: can't copy 'drbdmanage-docker-volume.8.gz': doesn't exist or not a regular file
Makefile:18: recipe for target 'install' failed
make: *** [install] Error 1
```
### 2016/07/25 追記

* Makefileを見ると `make doc` で`drbdmanage-docker-volume.8.gz` が作成できる
  - 実行時には`pandoc` が必要なので`apt`でインストールしておく

```console
$ sudo apt install pandoc 
$ make doc
pandoc -s -t man README -o drbdmanage-docker-volume.8
gzip -f drbdmanage-docker-volume.8
$ ls
COPYING              drbdmanage-docker-volume       MANIFEST.in  setup.py
debian               drbdmanage-docker-volume.8.gz  README       systemd
docker-check-rpm.sh  Makefile                       setup.cfg
```

投稿時、以下の「強硬手段」は勘違いで行っており実際の構築時には必要ありません。
すみませんでした。

~~強硬手段~~ (飛ばしてください)
----------

~~意地でも1.12rcでDRBD Manage Docker Volume Pluginを動かしたい~~
~~apt で依存関係が解消できないため、DRBD Manage Docker Volume Pluginがインストールできない~~
~~でも、drbdmanage-docker-volume.8.gzが存在しないせいでビルドできない~~

~~-> 依存関係が解消できるDockerのバージョンでインストールして、drbdmanage-docker-volume.8.gzを持って来る~~

* ~~解決法~~
  - ~~Docker上にubuntuコンテナ立てる~~
  - ~~Dockerはaptからインストールして、依存関係をaptに何とかしてもらう~~
  - ~~めでたく、DRBD Manage Docker Volume Pluginがコンテナ内に入ったら`drbdmanage-docker-volume.8.gz`だけホストマシン上にコピーする~~

### ~~手順~~ (飛ばしてください)

* ~~`software-properties-common`は`add-apt-repository`を使用したいので入れました~~

```console
$ sudo docker run -it ubuntu
ここからコンテナ内
root@0667f85e7f32:/# apt update
root@0667f85e7f32:/# apt install -y docker.io docker-compose
root@0667f85e7f32:/# docker --version
Docker version 1.10.3, build 20f81dd
root@0667f85e7f32:/# apt install software-properties-common
root@0667f85e7f32:/# add-apt-repository ppa:linbit/linbit-drbd9-stack
root@0667f85e7f32:/# apt update
root@0667f85e7f32:/# apt install -y drbd-dkms drbd-utils python-drbdmanage drbdmanage-docker-volume
root@0667f85e7f32:/# Ctrl-p Ctrl-q
コンテナから抜ける
```

* ~~コンテナ内から`drbdmanage-docker-volume.8.gz`をコピー~~

```console
$ cd ~/drbdmanage-docker-volume/
$ cat setup.py | grep .gz
('/usr/share/man/man8/', ['drbdmanage-docker-volume.8.gz']),
$ sudo docker cp 0667f85e7f32:/usr/share/man/man8/drbdmanage-docker-volume.8.gz .
$ ls
COPYING  drbdmanage-docker-volume       Makefile     README     setup.py
debian   drbdmanage-docker-volume.8.gz  MANIFEST.in  setup.cfg  systemd
```

make installを実行する
-----------------

```console
$ sudo make install
python2 setup.py install --record .installfiles
running install
running build
running install_data
copying drbdmanage-docker-volume.8.gz -> /usr/share/man/man8/
running install_egg_info
Writing /usr/local/lib/python2.7/dist-packages/drbdmanage_docker_volume-0.7.egg-info
writing list of installed files to '.installfiles'
```

やりました、インストールできました

* Pluginの起動

```console
$ sudo systemctl enable docker-drbdmanage-plugin.socket
$ sudo systemctl start docker-drbdmanage-plugin.socket
```

DRBDにDocker Volume を作成する
=================================

* ファイルシステムはext4、ボリュームサイズは200MBでDocker Volumeを作成します

```console
$ sudo drbdmanage n
+------------------------------------------------------------------------------+
| Name          | Pool Size | Pool Free |                              | State |
|------------------------------------------------------------------------------|
| docker-master |     16380 |     16372 |                              |    ok |
| docker-node01 |     16380 |     16372 |                              |    ok |
+------------------------------------------------------------------------------+
$ sudo drbdmanage v
No resources defined
$ sudo drbdmanage r
No resources defined
$ sudo docker volume ls
DRIVER              VOLUME NAME
$ sudo docker volume create -d drbdmanage --name=dmvol --opt fs=ext4 --opt size=200
dmvol
```

* 確認

```console
$ sudo docker volume ls         DRIVER              VOLUME NAME
drbdmanage          dmvol
$ sudo drbdmanage r
+------------------------------------------------------------------------------+
| Name  |                                                              | State |
|------------------------------------------------------------------------------|
| dmvol |                                                              |    ok |
+------------------------------------------------------------------------------+
$ sudo drbdmanage v
+------------------------------------------------------------------------------+
| Name  | Vol ID |    Size | Minor |                                   | State |
|------------------------------------------------------------------------------|
| dmvol |      0 | 200 MiB |   100 |                                   |    ok |
+------------------------------------------------------------------------------+
```

複数ノード間で共有できているか確認
===================================

* docker-masterで立ち上げたコンテナからdmvolに書き込み

```console
docker-master:~$ sudo docker run -ti --name=cont -v dmvol:/data --volume-driver=drbdmanage busybox sh
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
8ddc19f16526: Pull complete
Digest: sha256:a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e6
Status: Downloaded newer image for busybox:latest
/ # echo "foo" > /data/test.txt
/ # ls
bin   data  dev   etc   home  proc  root  sys   tmp   usr   var
/ # cat /data/
lost+found/  test.txt
/ # cat /data/test.txt
foo
/ # exit
docker-master:~$
```

* docker-node01で立ち上げたコンテナをdmvolにマウントして先ほど作成したtest.txtがあるか確認する

```console
docker-node01:~$ sudo docker run -ti --name=cont -v dmvol:/data --volume-driver=drbdmanage busybox sh
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
8ddc19f16526: Pull complete
Digest: sha256:a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e6
Status: Downloaded newer image for busybox:latest
/ # cat /data/
lost+found/  test.txt
/ # cat /data/test.txt
foo
/ #
```

# 終わりに

DRBD Manage Docker Volume PluginのReadmeを見るとオプションで細かい設定ができるようなので、時間があればそちらも試してみようと思います。

# 参考
* DRBD公式
    * https://blogs.linbit.com/p/1176/persistent-and-replicated-docker-volumes-with-drbd9-and-drbd-manage/
    * https://www.drbd.org/en/doc/users-guide-90/ch-docker