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

続けてdokcer環境でpacemaker_remoteを使ってみます。

# 改訂履歴
2017/02/15 Linux-ha-japanで公開されているpacemaker1.1.15のリポジトリパッケージで再確認した為、内容を更新しました。

# コンテナ(pacemake_remote)でのクラスタ構成
コンテナ内で起動したpacemaker_remoteと通信を行って、Pacemakerを起動するノードからの指示に従ってコンテナ内でリソースを起動する構成です。
まずは、dockerをインストールしてあるpacemakerホスト１台(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で設定しています。


```crm
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
```

2) 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:
```

3) 念の為、コンテナを確認しておきます。

```
[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
```

4) 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

```


5) 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
```

6) 停止します

```
[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)
```