9.5. Docker コンテナーの Pacemaker サポート (テクノロジープレビュー)
重要
Docker コンテナーの Pacemaker サポートは、テクノロジープレビュー目的でのみ実現されています。テクノロジープレビューの意味については、テクノロジープレビュー機能のサポート範囲 を参照してください。
テクノロジープレビューであるこの機能には 1 つの例外があります。Red Hat Enterprise Linux 7.4 以降、Red Hat は、Red Hat Openstack Platform (RHOSP) デプロイメントで Pacemaker バンドルの使用を完全にサポートします。
Pacemaker は、必要なインフラストラクチャーで Docker コンテナーを起動するための特殊構文 (bundle) に対応しています。Pacemaker バンドルを作成したら、バンドルがカプセル化する Pacemaker リソースを作成できます。
- 「Pacemaker バンドルリソースの設定」 では、Pacemaker バンドルを作成するコマンドについて説明し、各バンドルパラメーターに定義できるパラメーターについてまとめた表が記載されています。
- 「バンドルでの Pacemaker リソースの設定」 では、Pacemaker バンドルに含まれているリソースの設定について説明しています。
- 「Pacemaker バンドルの制限」 では、Pacemaker バンドルの制限について説明しています。
- 「Pacemaker バンドル設定の例」 は、Pacemaker バンドルの設定例を説明しています。
9.5.1. Pacemaker バンドルリソースの設定
Docker コンテナーの Pacemaker バンドルを作成するコマンド構文は以下の通りです。このコマンドを使用すると、その他のリソースをカプセル化しないバンドルが作成されます。バンドルでクラスターリソースを作成する方法については、「バンドルでの Pacemaker リソースの設定」 を参照してください。
pcs resource bundle create bundle_id container docker [container_options] [network network_options] [port-map port_options]... [storage-map storage_options]... [meta meta_options] [--disabled] [--wait[=n]]
必要な bundle_id パラメーターは、バンドルに対する一意の名前にする必要があります。
--disabled
オプションを指定すると、バンドルは自動的に起動されません。--wait
オプションを指定すると、Pacemaker は、バンドルが起動するまで最大 n
秒待機し、成功時、またはエラー時に 1 を返します。n
を指定しないと、デフォルトの 60 分に設定されます。
以下のセクションでは、Pacemaker バンドルの各要素に設定できるパラメーターを説明します。
9.5.1.1. Docker パラメーター
表9.6「Docker コンテナーのパラメーター」 は、バンドルに設定できる
docker
コンテナーオプションを説明します。
注記
Pacemaker で
docker
バンドルを設定する前に、Docker をインストールし、バンドルの実行が許可されているすべてのノードで完全に設定済みの Docker イメージを提供する必要があります。
フィールド | デフォルト | 説明 |
---|---|---|
image
|
Docker イメージタグ (必須)
| |
replicas
|
正の場合は
promoted-max の値。そうでない場合は 1 です。
|
起動するコンテナーインスタンスの数を指定する正の整数
|
replicas-per-host
|
1
|
単一ノードで起動できるコンテナーインスタンスの数を指定する正の整数
|
promoted-max
|
0
|
正であれば、非負の整数は、マスターロールにおいてサービスを実行できる多くのレプリカとともに、コンテナー化されたサービスが複数のサービスとして扱われる必要があることを示しています。
|
network
| |
これが指定されている場合、これは Docker コンテナーのネットワーク設定として docker run コマンドに渡されます。
|
run-command
| /usr/sbin/pacemaker_remoted バンドルにリソースが含まれる場合、それ以外はなし
|
このコマンドは、起動する際にコンテナー内で実行されます ("PID 1")。バンドルにリソースが含まれる場合、このコマンドは pacemaker_remoted デーモンを起動する必要があります(ただし、他のタスクを実行するスクリプトを使用することもできます)。
|
options
| |
docker run コマンドに渡す、追加のコマンドラインオプション
|
9.5.1.2. (バンドルネットワークパラメーター
表9.7「バンドルリソースネットワークパラメーター」 では、バンドルに設定できる
ネットワーク
オプションを説明します。
フィールド | デフォルト | 説明 |
---|---|---|
add-host
|
TRUE
|
TRUE で
ip-range-start が使用されている場合、Pacemaker は自動的に、コンテナー内の /etc/hosts ファイルに各レプリカ名と割り当てられた IP のエントリーがあることを確認します。
|
ip-range-start
| |
指定されている場合、Pacemaker は各コンテナーインスタンスに対して暗黙的な
ocf:heartbeat:IPaddr2 リソースを作成します。この IP アドレスは、Docker 要素の replicas パラメーターとして指定された数だけ連続アドレスを使用します。これらのアドレスは、ホストのネットワークから使用して、コンテナー内のサービスに到達できます。ただし、コンテナー自身の中では表示されません。現在サポートされているアドレスは、IPv4 のみです。
|
host-netmask
|
32
| ip-range-start が指定されている場合、IP アドレスは、この CIDR ネットマスクで(多数のビットとして)作成されます。
|
host-interface
| | ip-range-start が指定されている場合、IP アドレスはこのホストインターフェイスに作成されます(デフォルトでは、IP アドレスから決定されます)。
|
control-port
|
3121
|
バンドルに Pacemaker リソースが含まれる場合、クラスターは、コンテナー内の Pacemaker Remote との通信に、この整数 の TCP ポートを使用します。コンテナーがデフォルトポートでリッスンできない場合、これはコンテナーが
ip-range-start (この場合は replicas-per-host は 1 である必要があります)ではなくホストのネットワークを使用している場合や、バンドルがデフォルトポートですでにリッスンしている可能性がある場合に発生する可能性があります。ホストまたはコンテナーで設定されている PCMK_remote_port 環境変数は、バンドル接続に対して無視されます。
Pacemaker バンドル設定が
control-port パラメーターを使用する場合、バンドルに独自の IP アドレスがある場合は、corosync を実行しているすべてのクラスターノード、およびその IP アドレスでポートを開く必要があります。代わりに、バンドルが network="host" コンテナーパラメーターを設定している場合は、すべてのクラスターノードから各クラスターノードの IP アドレスでポートを開く必要があります。
|
注記
レプリカは、バンドル ID とダッシュそしてゼロから始まる整数カウンターで名前が付けられます。たとえば、
httpd-bundle
という名前のバンドルで replicas=2
が設定されている場合、そのコンテナーの名前は httpd-bundle-0
および httpd-bundle-1
になります。
ネットワークパラメーターに加えて、バンドルに
port-map
パラメーターをオプションで指定できます。表9.8「バンドルリソースポートマップパラメーター」 では、これらの port-map
パラメーターを説明します。
フィールド | デフォルト | 説明 |
---|---|---|
id
| |
ポートマッピングの一意の名前 (必須)
|
port
| |
これが指定されている場合、ホストネットワーク上のこの TCP ポート番号(
ip-range-start が指定されている場合はコンテナーの割り当てられた IP アドレス上)への接続がコンテナーネットワークに転送されます。port または range のうち 1 つがポートマッピングで指定される必要があります。
|
internal-port
| port の値
| port と internal-port が指定されている場合、ホストのネットワーク上の ポート への接続は、コンテナーネットワーク上のこのポートに転送されます。
|
range
| | range が指定されている場合は、ホストネットワーク上( ip-range-start が指定されている場合は、コンテナーの割り当てられた IP アドレス上)上のこれらの TCP ポート番号( first_port-last_port)への接続が、コンテナーネットワーク内の同じポートに転送されます。port または range のうち 1 つだけをポートマッピングに指定する必要があります。
|
注記
バンドルにリソースが含まれる場合、Pacemaker は自動的に
control-port
をマッピングします。そのため、ポートマッピングでそのポートを指定する必要はありません。
9.5.1.3. バンドルストレージパラメーター
必要に応じて、バンドルの
storage-map
パラメーターを設定できます。表9.9「バンドルリソースストレージマッピングパラメーター」 では、これらのパラメーターを説明します。
フィールド | デフォルト | 説明 |
---|---|---|
id
| |
ストレージマッピングの一意の名前 (必須)
|
source-dir
| |
コンテナーにマッピングされるホストファイルシステム上の絶対パス。
storage-map パラメーターを設定する際には、source-dir と source-dir-root のいずれかを指定する必要があります。
|
source-dir-root
| |
各コンテナーインスタンスのホスト上で異なるサブディレクトリーを使用した、コンテナーにマッピングされるホストのファイルシステム上のパスの開始。このサブディレクトリーには、バンドル名と同じ名前が付けられ、ダッシュと 0 から始まる整数カウンターも加えられます。
storage-map パラメーターを設定する際には、source-dir と source-dir-root の 1 つだけを指定する必要があります。
|
target-dir
| |
ホストストレージがマッピングされるコンテナー内のパス名 (必須)
|
options
| |
ストレージをマッピングする際に使用するファイルシステムマウントオプション
|
ホスト上のサブディレクトリーが
source-dir-root
パラメーターを使用して命名される方法の例として、source-dir-root=/path/to/my/directory
、target-dir=/srv/appdata
、バンドルの名前が replicas=2
の mybundle
という名前で、クラスターは mybundle- 0 と mybundle
- 1
というホスト名を持つ 2 つのコンテナーインスタンスを作成します。そして、コンテナーを実行しているホストに /path/to/my/directory/mybundle-0 と / path/to/my
/directory/mybundle-1 の 2 つのディレクトリー
を作成します。各コンテナーには、これらのディレクトリーのいずれかが与えられ、コンテナー内で実行されているアプリケーションには /srv/appdata
というディレクトリーが表示されます。
注記
Pacemaker は、ソースディレクトリーがすでにホストに存在しない場合の動作を定義しません。ただし、コンテナーテクノロジーまたはそのリソースエージェントがソースディレクトリーを作成します。
注記
バンドルに Pacemaker リソースが含まれる場合、Pacemaker は自動的に
source-dir=/etc/pacemaker/authkeytarget-dir=/
etc/pacemaker/authkey および source-dir-root=/
var/log/pacemaker/bundlestarget-dir=/var/
log
と同等のものをコンテナーにマップするため、storage-map
パラメーターを設定するときにこれらのパスを指定する必要はありません。
重要
PCMK_authkey_location
環境変数は、クラスターのノード上の /etc/pacemaker/authkey
のデフォルト以外に設定することはできません。
9.5.2. バンドルでの Pacemaker リソースの設定
バンドルは必要に応じて、1 つの Pacemaker クラスターリソースを含めることができます。バンドルに含まれていないリソースと同様に、クラスターリソースには、操作、インスタンス属性、メタデータ属性を定義することができます。バンドルにリソースが含まれている場合は、コンテナーイメージに Pacemaker Remote デーモンを含める必要があり、
ip-range-start
または control-port
をバンドルで設定する必要があります。Pacemaker は、接続用に暗黙的な ocf:pacemaker:remote
リソースを作成し、コンテナー内で Pacemaker Remote を起動して、Pacemaker リモートを使用してリソースを監視および管理します。バンドルに複数のコンテナーインスタンス(レプリカ)がある場合、Pacemaker リソースは暗黙的なクローンとして機能します。バンドルが promoted-max
オプションをゼロ以上に設定した場合、これは多状態クローンになります。
コマンドの bundle パラメーターと、リソースを含める
バンドル
ID を指定して、pcs resource create コマンドで Pacemaker バンドルにリソースを作成します。リソースを含む Pacemaker バンドルの作成例は、「Pacemaker バンドル設定の例」 を参照してください。
重要
リソースを含むバンドルのコンテナーにはアクセス可能なネットワーク環境が必要です。それにより、クラスターノードの Pacemaker はコンテナー内の Pacemaker Remote にコンタクトできます。たとえば、
docker
オプション --net=none
はリソースと併用しないでください。デフォルトの(コンテナー内の個別のネットワーク領域を使用)は、ip-range-start
パラメーターと組み合わせて機能します。docker
オプション --net=host
が使用されている場合(コンテナーがホストのネットワーク領域を共有する)、バンドルごとに一意の control-port
パラメーターを指定する必要があります。ファイアウォールでは、control-port
へのアクセスを許可する必要があります。
9.5.2.1. ノード属性とバンドルリソース
バンドルにクラスターリソースが含まれる場合、リソースエージェントはマスタースコアなどのノード属性を設定する可能性があります。ただし、コンテナーでは、ノードが属性を取得するべきかどうかはっきりしません。
コンテナーがホストされているノードに関係なく、コンテナーが同じ共有ストレージを使用している場合は、バンドルノード自体でマスタースコアを使用することが適切です。一方、コンテナーが、基礎となるホストからエクスポートされたストレージを使用する場合は、基礎となるホストでマスタースコアを使用することがより適切です。これは特定の状況に依存するため、
container-attribute-target
リソースメタデータ属性を使用すると、使用するアプローチを指定できます。host
に設定されている場合、ユーザー定義のノード属性は基礎となるホストでチェックされます。その他の場合は、ローカルノード (この場合はバンドルノード) が使用されます。この動作はユーザー定義の属性にのみ適用されます。クラスターは、#uname
などのクラスター定義属性に対してローカルノードを常にチェックします。
container-attribute-target
が host
に設定されている場合、クラスターは追加の環境変数をリソースエージェントに渡して、ノード属性を適切に設定します。
9.5.2.2. メタデータ属性とバンドルリソース
バンドルで設定されているメタデータ属性は、バンドルに含まれるリソースや、バンドルに対して Pacemaker によって作成されたリソースによって継承されます。これには、
priority
、target-role
、is-managed
などのオプションが含まれます。
9.5.3. Pacemaker バンドルの制限
Pacemaker バンドルは以下の制限で動作します。
- バンドルはグループに含まれていないことや、pcs コマンドで明示的にクローン化されていない場合もあります。これには、バンドルが含むリソースや、バンドルに対して Pacemaker によって明示的に作成されたリソースが含まれます。ただし、バンドルが
replicas
の値が 1 より大きい場合、バンドルはクローンであるかのように動作することに注意してください。 - バンドルが管理されていない場合や、クラスターがメンテナンスモードの際に Pacemaker を再起動すると、バンドルが不具合を起こすことがあります。
- バンドルには、インスタンス属性、使用率属性、または操作がありません。しかし、バンドルに含まれるリソースには、これらがあります。
- リソースを含むバンドルは、バンドルが個別の
control-port
を使用する場合にのみ、Pacemaker リモートノードで実行できます。
9.5.4. Pacemaker バンドル設定の例
以下の例では、
httpd- bundle
というバンドル ID で Pacemaker bundle を作成します。これには、httpd
というリソース ID を持つ ocf:heartbeat:apache
リソースが含まれます。
この手順には、以下の前提設定が必要です。
- Docker が、クラスターの各ノードでインストールされ有効化されている。
pcmktest:http
という名前の既存の Docker イメージがあります。- コンテナーイメージに、Pacemaker Remote デーモンが含まれている。
- コンテナーイメージに、設定済みの Apache Web サーバーが含まれている。
- クラスターのすべてのノードには、
/var/local/containers/httpd-bundle-0
、/var/local/containers/httpd-bundle-1
、および/var/local/containers/httpd-bundle-2
ディレクトリーがあり、Web サーバーの root のindex.html
ファイルが含まれます。実稼働環境では、単一の共有ドキュメント root の方が高くなりますが、この例では、この設定では、Web サーバーに接続し、提供されるindex.html
ファイルを検証できるように、各ホスト上のindex.html
ファイルを異なるものにすることが可能です。
この手順により、Pacemaker バンドルに以下のパラメーターが設定されます。
- バンドル ID は
httpd-bundle
です。 - 以前に設定された Docker コンテナーイメージは
pcmktest:http
です。 - この例は、3 コンテナーインスタンスを起動します。
- この例では、コマンドラインオプション
--log-driver=journald
を docker run コマンドに渡します。このパラメーターは必須ではありませんが、追加のオプションを docker コマンドに渡す方法を示すために含まれています。--log-driver=journald
の値は、コンテナー内のシステムログが基礎となるホストのsystemd
ジャーナルにログインすることを意味します。 - Pacemaker は、3 つの連続した暗黙的な
ocf:heartbeat:IPaddr2
リソースを作成します。これは、各コンテナーイメージ用に 1 つ、IP アドレス 192.168.122.131 で始まります。 - IP アドレスは、ホストインターフェイス eth0 で作成されます。
- IP アドレスは、CIDR ネットマスクが 24 で作成されます。
- この例では、
http-port
のポートマップ ID を作成します。コンテナーの割り当てられた IP アドレスのポート 80 への接続がコンテナーネットワークに転送されます。 - この例では、
httpd-root
のストレージマップ ID を作成します。このストレージマッピングについて以下で説明します。source-dir-root
の値は/var/local/containers
です。これは、各コンテナーインスタンスに対してホスト上の異なるサブディレクトリーを使用して、コンテナーにマップされるホストのファイルシステム上のパスの開始を指定します。target-dir
の値は/var/www/html
で、ホストストレージがマッピングされるコンテナー内のパス名を指定します。- ファイルシステム
rw
マウントオプションは、ストレージのマッピング時に使用されます。 - この例のコンテナーにはリソースが含まれているため、Pacemaker は自動的にコンテナーに
source-dir=/etc/pacemaker/authkey
と同等のものをマッピングします。そのため、ストレージマッピングにそのパスを指定する必要はありません。
この例では、既存のクラスター設定が
temp-cib.xml
という名前の一時ファイルに配置され、temp-cib.xml.deltasrc
という名前のファイルにコピーされます。クラスター設定に対するすべての変更は、tmp-cib.xml
ファイルに対して行われます。udpates が完了すると、この手順では pcs cluster cib-push コマンドの diff-against
オプションを使用して、設定ファイルへの更新のみがアクティブな設定ファイルにプッシュされるようにします。
#pcs cluster cib tmp-cib.xml
#cp tmp-cib.xml tmp-cib.xml.deltasrc
#pcs -f tmp.cib.xml resource bundle create httpd-bundle
\container docker image=pcmktest:http replicas=3
\options=--log-driver=journald
\network ip-range-start=192.168.122.131 host-interface=eth0
\host-netmask=24 port-map id=httpd-port port=80
\storage-map id=httpd-root source-dir-root=/var/local/containers
\target-dir=/var/www/html options=rw
\ #pcs -f tmp-cib.xml resource create httpd ocf:heartbeat:apache
\statusurl=http://localhost/server-status bundle httpd-bundle
#pcs cluster cib-push tmp-cib.xml diff-against=tmp-cib.xml.deltasrc