3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

pacemaker_remoteについて(その2) コンテナ(docker)環境

3
Last updated at Posted at 2015-10-28

続けて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をポート転送して通信させています。

  1. 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
  1. 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:
  1. 念の為、コンテナを確認しておきます。
[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
  1. 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

  1. 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
  1. 停止します
[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)
3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?