Pacemaker1.1.17新機能(bundle)

## bundleの概要
- dockerコンテナを制御する為のリソースとして新たに作成された種別。(PM1.1.18から、rktランタイムもサポートされています)
- group/clone/masterと同列にbundleが指定可能。
- bundleとしては、内部でPacemakerホスト側にIPaddr2、remote、dockerリソースを生成して利用。
- bundleの内部にprimitiveリソースとして、コンテナで実行するリソースを指定。
- コンテナ側にはpacemaker_remoteと、必要なライブラリ関係とresource_agent、起動するリソース(リンクの例ではhttp)が必要となる。

![Bundle2.png](https://qiita-image-store.s3.amazonaws.com/0/80018/1695ee3b-33f1-b21b-c1a2-59879bd9c3f0.png)

## 動作確認
 - crmshは、まだ、bundleに未対応の為、動作確認時には、wikiページで紹介されているようにcibadminを利用して直接cibに流し込みます。
  - https://github.com/ClusterLabs/crmsh/issues/191

### 環境
 - 今回は、そろそろ最初のバージョンが出るであろうPM2.0系の開発版を利用して、単ノードで確認してみます。
 - RHEL7.4
 - docker ce版(17.12.1-ce)

### 準備
 - ホストOS(RHEL7.4)にPacemakerをインストールします
 - docker ce版もインストールします
 - dockerコンテナ内で起動するpacemaker_remoteとの通信用にauthkeyを生成しておきます。

```
# mkdir /etc/pacemaker
# dd if=/dev/urandom of=/etc/pacemaker/authkey bs=4096 count=1
```
 - dockerにNetwork設定(/usr/lib/systemd/system/docker.service)をして、再起動しておきます。

```
(snip)
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock
(snip)
```

 - centos7のイメージをdockerにpullしておきます
 - 
```
[root@rh74-test ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              ff426288ea90        8 weeks ago         207MB
```
 - 本家のwiki手順に従ってコンテナ用のファイルを準備しておきます

```
# mkdir -p /root/bundle-walk-through \
  /var/log/pacemaker/bundles/httpd-bundle-{0,1,2} \
  /var/local/containers/httpd-bundle-{0,1,2}
# for i in 0 1 2; do cat >/var/local/containers/httpd-bundle-$i/index.html <<EOF
<html>
<head><title>Bundle test</title></head>
<body>
<h1>httpd-bundle-$i @ $(hostname)</h1>
</body>
</html>
EOF
done
```

 - 本家のwiki手順に従ってDockerファイルを準備しておきます

```
# cat >/root/bundle-walk-through/Dockerfile <<EOF
FROM centos:xxxxx
RUN yum update -y
RUN yum install -y httpd bind-utils curl lsof wget which
RUN yum install -y pacemaker pacemaker-remote resource-agents
EOF
```

 - 本家のwiki手順に従って上のDockerファイルでイメージを作成しておきます

```
# cd /root/bundle-walk-through
# docker rmi pcmktest:http
# docker build -t pcmktest:http .

[root@rh74-test ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
pcmktest            http                1049e2ef71e9        4 days ago          673MB
centos              latest              ff426288ea90        8 weeks ago         207MB
```

 - クラスタのプロパティを設定するだけのcrmファイルを準備しておきます

```
property no-quorum-policy="ignore" \
        stonith-enabled="false" \
        startup-fencing="false"

rsc_defaults resource-stickiness="INFINITY" \
        migration-threshold="INFINITY"
```

 - Pacemakerで単ノードを起動します
 - 作成しておいたcrmファイルを先に流し込みます
 - 設定ファイルをcibadminコマンドで流し込みます(crmシェルが使えない為、cibadminで流し込みます）

```
cibadmin --modify --allow-create --scope resources -X '<bundle id="httpd-bundle">
    <docker image="pcmktest:http" replicas="2" replicas-per-host="2" options="--log-driver=journald" />
    <network ip-range-start="192.168.20.188" host-interface="ens192" host-netmask="24">
      <port-mapping id="httpd-port" port="80"/>
    </network>
    <storage>
      <storage-mapping id="httpd-root"
        source-dir-root="/var/local/containers"
        target-dir="/var/www/html"
        options="rw"/>
      <storage-mapping id="httpd-logs"
        source-dir-root="/var/log/pacemaker/bundles"
        target-dir="/etc/httpd/logs"
        options="rw"/>
    </storage>
    <primitive class="ocf" id="httpd" provider="heartbeat" type="apache" >
      <operations>
        <op id="rabbitmq-monitor-interval-10" interval="10" name="monitor" timeout="40"/>
        <op id="rabbitmq-start-interval-0s" interval="0s" name="start" timeout="200s"/>
        <op id="rabbitmq-stop-interval-0s" interval="0s" name="stop" timeout="200s" />
     </operations>
    </primitive>
'

```

 - 以下のような状態になれば起動は完了です。

```
[root@rh74-test ~]# crm_mon -1 -Af
Stack: corosync
Current DC: rh74-test (version 2.0.0-f788652cf4) - partition WITHOUT quorum
Last updated: Tue Mar  6 14:36:29 2018
Last change: Tue Mar  6 14:36:08 2018 by root via cibadmin on rh74-test

3 nodes configured
8 resources configured

Online: [ rh74-test ]
GuestOnline: [ httpd-bundle-0@rh74-test httpd-bundle-1@rh74-test ]

Active resources:

 Docker container set: httpd-bundle [pcmktest:http] (unique)
   httpd-bundle-0 (192.168.20.188)      (ocf::heartbeat:apache):        Started rh74-test
   httpd-bundle-1 (192.168.20.189)      (ocf::heartbeat:apache):        Started rh74-test

Node Attributes:
* Node httpd-bundle-0@rh74-test:
* Node httpd-bundle-1@rh74-test:
* Node rh74-test:

Migration Summary:
* Node rh74-test:
* Node httpd-bundle-0@rh74-test:
* Node httpd-bundle-1@rh74-test:
[root@rh74-test ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                      NAMES
eac00211bca3        pcmktest:http       "/usr/sbin/pacemaker…"   14 seconds ago      Up 13 seconds       192.168.20.189:80->80/tcp, 192.168.20.189:3121->3121/tcp   httpd-bundle-docker-1
cea5d42a3404        pcmktest:http       "/usr/sbin/pacemaker…"   14 seconds ago      Up 13 seconds       192.168.20.188:80->80/tcp, 192.168.20.188:3121->3121/tcp   httpd-bundle-docker-0

```

### 動作
 - コンテナ内のapacheにアクセスしてみます

```
[root@rh74-test ~]# curl -X GET http://192.168.20.188                                                                                                                            
<html>
<head><title>Bundle test</title></head>
<body>
<h1>httpd-bundle-0 @ rh74-test</h1>
</body>
</html>
[root@rh74-test ~]# curl -X GET http://192.168.20.189                                                                                                                            
<html>
<head><title>Bundle test</title></head>
<body>
<h1>httpd-bundle-1 @ rh74-test</h1>
</body>
</html>
```

### 注意点
 - Bundle内のリソース故障によってフェンシング(STONITH)が実行したいとしても、Bundleリソースの場合には、コンテナ(この設定の場合にはdocker)の停止・開始によって代替えされます。
 - これは、Pacemaker_remoteのKVM WorkthroughのVirtualDomainによるremote管理の場合と同様です。(VirtualDomain管理の場合には、VirtualDomain RAの停止・開始よって代替えされます)
 - 現状、replicasなどのコンテナ（数）のスケールに対応していません。変更した場合には、全てのBundle管理下のコンテナは再起動します。 
  - スケールについては、2.0リリース版では、Bundleのadd-hostオプション(false設定)にて対応される予定です。
 
## 補足情報
 - bundle(コンテナ)内では、最初にpacemaker_remoteが実行され(起動後pcmk-initに名称変更)、そのプロセスからpacemekre_remoteがforkされて実行されます。

```
[root@cent7-host1 ~]# docker exec -it httpd-bundle1-docker-1 /bin/bash                                                                                                                                                  
[root@httpd-bundle1-1 /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 00:52 ?        00:00:00 pcmk-init
root         9     1  0 00:52 ?        00:00:00 /usr/sbin/pacemaker_remoted
root       102     1  0 00:52 ?        00:00:00 /sbin/httpd -DSTATUS -f /etc/httpd/conf/httpd.conf -c PidFile /var/run//httpd.pid
apache     105   102  0 00:52 ?        00:00:00 /sbin/httpd -DSTATUS -f /etc/httpd/conf/httpd.conf -c PidFile /var/run//httpd.pid
apache     107   102  0 00:52 ?        00:00:00 /sbin/httpd -DSTATUS -f /etc/httpd/conf/httpd.conf -c PidFile /var/run//httpd.pid
apache     108   102  0 00:52 ?        00:00:00 /sbin/httpd -DSTATUS -f /etc/httpd/conf/httpd.conf -c PidFile /var/run//httpd.pid
apache     110   102  0 00:52 ?        00:00:00 /sbin/httpd -DSTATUS -f /etc/httpd/conf/httpd.conf -c PidFile /var/run//httpd.pid
apache     111   102  0 00:52 ?        00:00:00 /sbin/httpd -DSTATUS -f /etc/httpd/conf/httpd.conf -c PidFile /var/run//httpd.pid
root       120     0  3 00:52 ?        00:00:00 /bin/bash
root       132   120  0 00:52 ?        00:00:00 ps -ef
```

 - dokcer RAとfence_dockerでBundleをマネテ見た構成は以下のリンクにあります。
  - Bundleの場合にはfence_dockerは利用出来ませんが、docker RAを直に使うとfence_dockerが利用出来ます。
   - https://qiita.com/HideoYamauchi/items/e6ba46e101599a21447a

##関連リンク
 - http://wiki.clusterlabs.org/wiki/Bundle_Walk-Through
 - https://qiita.com/datake914/items/a61a1aead43ffa058da9