Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

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

表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 パラメーターを説明します。

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

フィールドデフォルト説明
id
ポートマッピングの一意の名前 (必須)
port
これが指定されている場合、ホストネットワーク上のこの TCP ポート番号( ip-range-start が指定されている場合はコンテナーの割り当てられた IP アドレス上)への接続がコンテナーネットワークに転送されます。port または range のうち 1 つがポートマッピングで指定される必要があります。
internal-port
portの値
portinternal-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 の 1 つだけを指定する必要があります。
target-dir
ホストストレージがマッピングされるコンテナー内のパス名 (必須)
options
ストレージをマッピングする際に使用するファイルシステムマウントオプション
ホスト上のサブディレクトリーが source-dir-root パラメーターを使用して命名される方法の例として、source-dir-root=/path/to/my/directorytarget-dir=/srv/appdata、バンドルの名前が replicas=2mybundle という名前で、クラスターは 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-targethost に設定されている場合、クラスターは追加の環境変数をリソースエージェントに渡して、ノード属性を適切に設定します。

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

バンドルで設定されているメタデータ属性は、バンドルに含まれるリソースや、バンドルに対して Pacemaker によって作成されたリソースによって継承されます。これには、prioritytarget-roleis-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=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 ファイルに対して行われます。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