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