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 リソースを作成できます。

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 秒待ち、成功すれば 0 を、失敗すれば 1 を返します。n を指定しないと、デフォルトで 60 分に指定されます。
以下のセクションでは、Pacemaker バンドルの各要素に設定できるパラメーターを説明します。

9.5.1.1. Docker パラメーター

表9.6「Docker コンテナーのパラメーター」 は、バンドルに設定できる docker コンテナーオプションを説明します。

注記

Pacemaker で docker バンドルを設定する前に、Docker をインストールし、バンドルの実行が許可されている各ノード上に完全に設定した Docker イメージを展開します。

表9.6 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「バンドルリソースネットワークパラメーター」 では、バンドルに設定できる network オプションを説明します。

表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 に設定されている必要があります)。あるいは、バンドルが、デフォルトのポートで既にリッスンしている Pacemaker Remote ノードで実行している場合も考えられます。ホストやコンテナーで設定されている PCMK_remote_port 環境変数は、バンドル接続に対しては無視されます。

注記

レプリカは、バンドル ID とダッシュそしてゼロから始まる整数カウンターで名前が付けられます。httpd-bundle というバンドル名により replicas=2 が設定されれば、 そのコンテナーの名前は httpd-bundle-0httpd-bundle-1 になります。
ネットワークパラメーターに加え、バンドルに port-map パラメーターを任意で指定できます。表9.8「バンドルリソースポートマップパラメーター」 では、これらの port-map パラメーターを説明しています。

表9.8 バンドルリソースポートマップパラメーター

フィールドデフォルト説明
id
ポートマッピングの一意の名前 (必須)
port
これが指定されると、ホストネットワーク上 ((ip-range-start が指定されていル場合は、コンテナーの、割り当てられた IP アドレス上)) のこの TCP ポート番号に対する接続 がコンテナーネットワークに転送されます。port または range のいずれ 1 つがポートマッピングで指定される必要があります。
internal-port
port の値
portinternal-port が指定されている場合は、ホストネットワーク上の 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「バンドルリソースストレージマッピングパラメーター」 では、これらのパラメーターを説明しています。

表9.9 バンドルリソースストレージマッピングパラメーター

フィールドデフォルト説明
id
ストレージマッピングの一意の名前 (必須)
source-dir
コンテナーにマッピングされるホストファイルシステム上の絶対パス。storage-map パラメーターを設定する際には、source-dirsource-dir-root のいずれかを指定する必要があります。
source-dir-root
各コンテナーインスタンスのホスト上で異なるサブディレクトリーを使用した、コンテナーにマッピングされるホストのファイルシステム上のパスの開始。このサブディレクトリーには、バンドル名と同じ名前が付けられ、ダッシュと 0 から始まる整数カウンターも加えられます。storage-map パラメーターを設定するときには、source-dirsource-dir-root のいずれかを完全に指定する必要があります。
target-dir
ホストストレージがマッピングされるコンテナー内のパス名 (必須)
options
ストレージをマッピングする際に使用するファイルシステムマウントオプション
ホスト上のサブディレクトリーが source-dir-root パラメーターで名前が付けられる仕組みの例として、source-dir-root=/path/to/my/directorytarget-dir=/srv/appdata、バンドルに replicas=2mybundle という名前が指定されている場合、クラスターは、mybundle-0mybundle-1 というホスト名で 2 つのコンテナーインスタンスを作成します。また、コンテナーを実行しているホスト上で 2 つのディレクトリー (/path/to/my/directory/mybundle-0/path/to/my/directory/mybundle-1) を作成します。各コンテナーには、いずれかのディレクトリーが与えられ、そのコンテナー内で実行しているアプリケーションには、/srv/appdata というディレクトリが表示されます。

注記

Pacemaker は、ソースディレクトリが既にホストに存在しない場合の動作を定義しません。ただし、コンテナーテクノロジーまたはそのリソースエージェントがソースディレクトリーを作成します。

注記

If the bundle contains a Pacemaker resource, Pacemaker will automatically map the equivalent of source-dir=/etc/pacemaker/authkeytarget-dir=/etc/pacemaker/authkey and source-dir-root=/var/log/pacemaker/bundlestarget-dir=/var/log into the container, so it is not necessary to specify those paths in when configuring storage-map parameters.

重要

PCMK_authkey_location 環境変数は、クラスターのノード上の /etc/pacemaker/authkey のデフォルト以外に設定することはできません。

9.5.2. バンドルでの Pacemaker リソースの設定

バンドルは必要に応じて、1 つの Pacemaker クラスターリソースを含めることができます。バンドルに含まれていないリソースと同様に、クラスターリソースには、操作、インスタンス属性、メタデータ属性を定義することができます。バンドルにリソースが含まれる場合、コンテナーイメージは Pacemaker Remote デーモンを含む必要があります。また、ip-range-start または control-port はバンドルで設定する必要があります。Pacemaker は、接続に対して暗黙的な ocf:pacemaker:remote リソースを作成し、コンテナー内で Peacemaker Remote を起動して、Pacemaker Remote でリソースを監視・管理します。バンドルに 2 つ以上のコンテナーインスタンス (レプリカ) がある場合、Pacemaker リソースは暗黙的なクローンとして機能します。バンドルが promoted-max オプションを、0 を超えるように設定した場合、これは多状態クローンになります。
pcs resource create コマンドで Pacemaker バンドルでリソースを作成します。これは、コマンドに bundleを指定し、リソースを含むバンドル ID を指定して行います。リソースを含む 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-targethost に設定されると、クラスターは、追加の環境変数をリソースエージェノに渡します。これにより、ノード属性を正しく設定できるようになります。

9.5.2.2. メタデータ属性とバンドルリソース

バンドルで設定されているメタデータ属性は、バンドルに含まれるリソースや、バンドルに対して Pacemaker によって作成されたリソースによって継承されます。これには、prioritytarget-roleis-managed などのオプションが含まれます。

9.5.3. Pacemaker バンドルの制限

Pacemaker バンドルは以下の制限で動作します。
  • バンドルはグループに含まれていないことや、pcs コマンドで明示的にクローン化されていないことがあります。これには、バンドルが含むリソースや、バンドルに対して Pacemaker によって明示的に作成されたリソースが含まれます。ただし、バンドルの replicas の値が 1 未満で設定されると、バンドルはクローンであるかのように動作することに注意してください。
  • バンドルが管理されていない場合や、クラスターがメンテナンスモードの際に Pacemaker を再起動すると、バンドルが不具合を起こすことがあります。
  • バンドルには、インスタンス属性、使用率属性、または操作がありません。しかし、バンドルに含まれるリソースには、これらがあります。
  • リソースを含むバンドルは、バンドルが、一意な異なる control-port を使用する場合にのみ、Pacemaker Remote ノードで実行できます。

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 が対象となるが、この例では、この設定により、各ホスト上の index.html ファイルを別のものにすることが可能。そのため、Web サーバーに接続して、サービスされる index.html ファイルを確認することが可能。
この手順により、Pacemaker バンドルに以下のパラメーターが設定されます。
  • バンドル ID は httpd-bundle です。
  • 以前設定した Docker コンテナーイメージは pcmktest:http です。
  • この例は、3 コンテナーインスタンスを起動します。
  • この例では、コマンドラインオプション --log-driver=journalddocker 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 ファイルに対して行われます。更新が完了すると、pcs cluster cib-pushdiff-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