続けてdokcer環境でpacemaker_remoteを使ってみます。
改訂履歴
2017/02/15 Linux-ha-japanで公開されているpacemaker1.1.15のリポジトリパッケージで再確認した為、内容を更新しました。
コンテナ(pacemake_remote)でのクラスタ構成
コンテナ内で起動したpacemaker_remoteと通信を行って、Pacemakerを起動するノードからの指示に従ってコンテナ内でリソースを起動する構成です。
まずは、dockerをインストールしてあるpacemakerホスト1台(docker01)とあらかじめpacemakerリモートをインストールしているイメージ(remote)から生成したコンテナ(remote1,remote2)で構成してみます。
[root@docker01 ~]# docker --version
Docker version 1.13.1-rc2, build 54f71fd
[root@docker01 ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
remote latest 7c4ab4ed16fd 32 minutes ago 312 MB
busybox latest 7968321274dc 4 weeks ago 1.11 MB
centos latest 67591570dd29 2 months ago 192 MB
リソースは簡易にDummyのみとしています。
以下はstonith無の例ですが、実際にはstonith構成を組むことをお勧めします。
また、pacemakerホストでは、リソースを起動しないことがわかっている為、discovery設定も行っています。
配置先をリソースのmeta属性:containerを設定することでも可能なようですが、今回は普通にlocationで設定しています。
property no-quorum-policy="ignore" \
stonith-enabled="false" \
startup-fencing="false"
rsc_defaults resource-stickiness="INFINITY" \
migration-threshold="1"
primitive container1 ocf:heartbeat:docker \
meta \
remote-node="remote-node1" \
remote-port=10001 \
remote-addr=127.0.0.1 \
params \
run_opts="-P -p 127.0.0.1:10001:3121 -v /etc/pacemaker:/etc/pacemaker" \
run_cmd="/usr/sbin/pacemaker_remoted" \
image="remote" \
name="remote1" \
op start interval="0s" timeout="90s" on-fail="restart" \
op monitor interval="3s" timeout="30s" on-fail="restart" \
op stop interval="0s" timeout="90s" on-fail="block"
primitive container2 ocf:heartbeat:docker \
meta \
remote-node="remote-node2" \
remote-port=10002 \
remote-addr=127.0.0.1 \
params \
run_opts="-P -p 127.0.0.1:10002:3121 -v /etc/pacemaker:/etc/pacemaker" \
run_cmd="/usr/sbin/pacemaker_remoted" \
image="remote" \
name="remote2" \
op start interval="0s" timeout="90s" on-fail="restart" \
op monitor interval="3s" timeout="30s" on-fail="restart" \
op stop interval="0s" timeout="90s" on-fail="block"
primitive dummy-remote Dummy \
op start interval=0s timeout=60s \
op monitor interval=30s timeout=60s \
op stop interval=0s timeout=60s
location loc1 dummy-remote \
rule 300: #uname eq remote-node1 \
rule 200: #uname eq remote-node2
#
location loc2 dummy-remote resource-discovery="never" \
rule -inf: #uname eq cent7-host
order rsc-order-1 0: container1 dummy-remote
order rsc-order-2 0: container2 dummy-remote
動作について
pacemaker_remoteは、Pacemakerからの接続ホストの形で動作し、Pacemakerから接続を行います。
docker環境ではpacemaker_remote側の接続ポート:3121をポート転送して通信させています。
- Pacemakerを起動して、CLIファイルを投入します。WARNINGが出ますが、問題はありません。
[root@docker01 ~]# crm configure load update test.crm
WARNING: loc1: referenced node remote-node1 does not exist
WARNING: loc1: referenced node remote-node2 does not exist
- crm_monコマンドで確認します。
[root@docker01 ~]# crm_mon -1 -Af
Stack: corosync
Current DC: docker01 (version 1.1.15-1.el7-e174ec8) - partition WITHOUT quorum
Last updated: Wed Feb 15 17:29:48 2017 Last change: Wed Feb 15 17:29:35 2017 by root via cibadmin on docker01
3 nodes and 5 resources configured
Online: [ docker01 ]
GuestOnline: [ remote-node1@docker01 remote-node2@docker01 ]
container1 (ocf::heartbeat:docker): Started docker01
container2 (ocf::heartbeat:docker): Started docker01
dummy-remote (ocf::heartbeat:Dummy): Started remote-node1
Node Attributes:
* Node docker01:
* Node remote-node1@docker01:
* Node remote-node2@docker01:
Migration Summary:
* Node docker01:
* Node remote-node1@docker01:
* Node remote-node2@docker01:
- 念の為、コンテナを確認しておきます。
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f96b79ee35a remote "/usr/sbin/pacemak..." 21 seconds ago Up 20 seconds 127.0.0.1:10002->3121/tcp remote2
8e14f57aaa46 remote "/usr/sbin/pacemak..." 21 seconds ago Up 20 seconds 127.0.0.1:10001->3121/tcp remote1
- container1で稼働しているリソースをcontainer2に移動します。
[root@docker01 ~]# crm_resource -M -r dummy-remote -H remote-node2 -f
WARNING: Creating rsc_location constraint 'cli-ban-dummy-remote-on-remote-node1' with a score of -INFINITY for resource dummy-remote on remote-node1.
This will prevent dummy-remote from running on remote-node1 until the constraint is removed using the 'crm_resource --clear' command or manually with cibadmin
This will be the case even if remote-node1 is the last node in the cluster
This message can be disabled with --quiet
[root@docker01 ~]# crm_mon -1 -Af
Stack: corosync
Current DC: docker01 (version 1.1.15-1.el7-e174ec8) - partition WITHOUT quorum
Last updated: Wed Feb 15 17:30:34 2017 Last change: Wed Feb 15 17:30:21 2017 by root via crm_resource on docker01
3 nodes and 5 resources configured
Online: [ docker01 ]
GuestOnline: [ remote-node1@docker01 remote-node2@docker01 ]
container1 (ocf::heartbeat:docker): Started docker01
container2 (ocf::heartbeat:docker): Started docker01
dummy-remote (ocf::heartbeat:Dummy): Started remote-node2
Node Attributes:
* Node docker01:
* Node remote-node1@docker01:
* Node remote-node2@docker01:
Migration Summary:
* Node docker01:
* Node remote-node1@docker01:
* Node remote-node2@docker01:
[root@docker01 ~]# crm_resource -U -r dummy-remote
- container2でリソースのモニターエラーを起こしてみます。migration-threshold="1"なので、リソースがcontainer1にフェイルオーバーします。
[root@cent7-host ~]# docker exec -it remote2 /bin/bash
[root@33bfc717b6c9 /]# rm -rf /var/run/resource-agents/Dummy-dummy-remote.state
[root@docker01 ~]# crm_mon -1 -Af
Stack: corosync
Current DC: docker01 (version 1.1.15-1.el7-e174ec8) - partition WITHOUT quorum
Last updated: Wed Feb 15 17:31:55 2017 Last change: Wed Feb 15 17:31:04 2017 by root via crm_resource on docker01
3 nodes and 5 resources configured
Online: [ docker01 ]
GuestOnline: [ remote-node1@docker01 remote-node2@docker01 ]
container1 (ocf::heartbeat:docker): Started docker01
container2 (ocf::heartbeat:docker): Started docker01
dummy-remote (ocf::heartbeat:Dummy): Started remote-node1
Node Attributes:
* Node docker01:
* Node remote-node1@docker01:
* Node remote-node2@docker01:
Migration Summary:
* Node docker01:
* Node remote-node1@docker01:
* Node remote-node2@docker01:
dummy-remote: migration-threshold=1 fail-count=1 last-failure='Wed Feb 15 17:31:52 2017'
Failed Actions:
* dummy-remote_monitor_30000 on remote-node2 'not running' (7): call=8, status=complete, exitreason='No process state file found',
last-rc-change='Wed Feb 15 17:31:52 2017', queued=0ms, exec=0ms
- 停止します
[root@docker01 ~]# systemctl stop pacemaker
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
実際のサービス運用では、コンテナのネットワークをホスト側に接続するか、ホストのネットワークをコンテナ内に転送するなどの設定が必要になると思います。
ホストのネットワークをコンテナ内のサービスへポート転送する場合には、以下に例で示すようなCLIファイルが必要となります。
(snip)
primitive container1 ocf:heartbeat:docker \
meta \
remote-node="remote-node1" \
remote-port=10001 \
remote-addr=127.0.0.1 \
params \
run_opts="-P -p 80:80 -p 127.0.0.1:10001:3121 -v /etc/pacemaker:/etc/pacemaker" \
run_cmd="/usr/sbin/pacemaker_remoted" \
image="centos:remote2" \
name="remote1" \
op start interval="0s" timeout="90s" on-fail="restart" \
op monitor interval="3s" timeout="30s" on-fail="restart" \
op stop interval="0s" timeout="90s" on-fail="block"
primitive container2 ocf:heartbeat:docker \
meta \
remote-node="remote-node2" \
remote-port=10002 \
remote-addr=127.0.0.1 \
params \
run_opts="-P -p 8080:80 -p 127.0.0.1:10002:3121 -v /etc/pacemaker:/etc/pacemaker" \
run_cmd="/usr/sbin/pacemaker_remoted" \
image="centos:remote2" \
name="remote2" \
op start interval="0s" timeout="90s" on-fail="restart" \
op monitor interval="3s" timeout="30s" on-fail="restart" \
op stop interval="0s" timeout="90s" on-fail="block"
primitive dummy-remote apache \
params \
configfile="/etc/httpd/conf/httpd.conf" \
httpd="/usr/sbin/httpd" \
statusurl="http://localhost:80" \
op start interval=0s timeout=60s \
op monitor interval=30s timeout=60s \
op stop interval=0s timeout=60s
(snip)