2020年7月30日木曜日

無償版ESXiでPacemakerのSTONITHを実装する

前回、CentOS 8にPacemakerを導入し、Squidをクラスタ構成にて構築した。

★前回の記事はこちら↓

今回はPacemakerの2ノードクラスタ構成で必要な設定となるSTONITHについて記載する。

STONITHとは

Pacemakerでは、2台のノードでクラスタを構成する場合は、STONITHの設定が必須となる。STONITHとは、「Shoot-The-Other-Node-In-The-Head」の略称であり、OSやクラスタリソースがハングアップした際に、強制的にノードの電源を停止させることで、ハングアップを解消させる機能となる。

STONITHは物理サーバであれば、商用向けのサーバに標準で搭載されているIPMI (例えばHPE製サーバであればiLO) の機能を利用して物理サーバ自体の電源をOFFにする。

仮想マシンであれば、仮想化ハイパーバイザ (ESXiやHyper-V) や仮想環境の統合管理機能 (vCenter ServerやSystem Center) に対して仮想マシンの電源をOFFにする指示を行うことでSTONITHを実現する。

VMware仮想環境におけるSTONITH実装方法

VMware仮想環境の場合、Pacemakerに標準で含まれるSTONITHエージェントとしてfence_vmware_soapがあり、ESXiに対してもサポートはしているのだが、前提としてvSphere APIを利用してESXiに対して仮想マシンの電源操作ができる必要がある。

しかし、無償版ESXiではvSphere APIが利用できないことからfence_vmware_soapは動作させることができない。そこで、GitHubで公開されているjosenk氏作成のfence_ESXiのスクリプトを利用してSTONITHの実装を行ってみた。なお、ライセンス形態はGPL (GNU General Public License) となる。

環境

今回fence_ESXiにてSTONITHの設定を行うクラスタの構成図は以下の通りとなる。2台の以下のノードでクラスタを構成する。それぞれのノードとなる仮想マシンは別のESXiで稼働しており、ESXiは無償版ライセンスで稼働している。

  • ノード#1 : t3021cent
  • ノード#2 : t3022cent

fence_ESXiのスクリプトをCentOS 8で動作するよう改修

ダウンロードしたfence_ESXiは「/usr/sbin」配下に配置し、実行権限を付与する。

# chown root:root /usr/sbin/fence_ESXi
# chmod 755 /usr/sbin/fence_ESXi
# ls -l /usr/sbin/fence_ESXi
-rwxr-xr-x 1 root root  3049  7月 23 20:19 /usr/sbin/fence_ESXi

fence_ESXiはPythonでコーディングされている。しかし、そのまま実行するとPythonのバージョン差異などによってCentOS 8では動作しない。fence_ESXiを動作させるためには、以下4点の修正が必要となる

  • 1行目の/usr/bin/python/usr/bin/python3に修正
  • インデントがタブではなくスペース x 8になっている箇所があるため修正
  • exceptionsモジュールはPython3では標準モジュールとして組み込まれたため不要となることから、importの対象から削除
  • conn.log_expect関数は引数が3つに変更されたため、先頭のoptionsの引数を削除

上記変更をsedで記載すると以下のようになる。

sed -i -e 's#/usr/bin/python#/usr/bin/python3#g' \
    -e 's/^        /\t/g' \
    -e 's/, exceptions//g' \
    -e 's/conn.log_expect(options, /conn.log_expect(/g' \
    /usr/sbin/fence_ESXi

fence_ESXiの動作確認

fence_ESXi実行時のオプションは以下の通り。

オプション 説明
--ip=<IP or Hostname> ESXiのIPアドレスまたはホスト名を指定。
--username=<Username> ESXiのSSH接続可能なユーザを指定。通常はrootになると思われる。
--password=<Password> usernameで指定したユーザのパスワードを指定。
-o <Action> ESXiに実行するアクションを指定する。仮想マシン一覧表示 (list)、ステータス表示 (status)、電源ON (on)、電源OFF (off)のアクションを選択可能。

コマンド実行例は以下の通り。Pacemakerのノードとなる仮想マシンがリストに含まれていれば問題ない。

# /usr/sbin/fence_ESXi --ip=192.168.33.10 --username=root --password="XXXXXXXX" -o list
~(中略)~
t3022cent,14
~(以下略)~

電源ON (on)、電源OFF (off)の動作も試してみよう。エラーが表示されず、「Success」と表示されればOKとなる。

# /usr/sbin/fence_ESXi --ip=192.168.33.10 --username=root --password="XXXXXXXX" -o off -n t3022cent
Success: Powered OFF
# /usr/sbin/fence_ESXi --ip=192.168.33.10 --username=root --password="XXXXXXXX" -o status -n t3022cent
Status: OFF
# /usr/sbin/fence_ESXi --ip=192.168.33.10 --username=root --password="XXXXXXXX" -o on -n t3022cent
Success: Powered ON
# /usr/sbin/fence_ESXi --ip=192.168.33.10 --username=root --password="XXXXXXXX" -o status -n t3022cent
Status: ON

Pacemakerへfence_ESXiを使ったSTONITHデバイスを作成

スクリプトが正常に動作することを確認できたら、実際にfence_ESXiを使ってSTONITHデバイスを作成してみよう。作成するSTONITHデバイスの設定は以下の通りとなる。

STONITHデバイス名 実行ノード 電源操作対象ノード 電源操作対象ESXi
rs-stonith-01 ノード#1 (t3021cent) ノード#2 (t3022cent) 192.168.33.10
rs-stonith-02 ノード#2 (t3022cent) ノード#1 (t3021cent) 192.168.33.12

STONITHデバイスの作成はpcs stonith createコマンドにて行う。

# pcs stonith create rs-stonith-01 fence_ESXi ipaddr=192.168.33.10 login=root passwd="XXXXXXXX"
# pcs stonith create rs-stonith-02 fence_ESXi ipaddr=192.168.33.12 login=root passwd="XXXXXXXX"

STONITHデバイスは、実行ノード以外で起動させる必要はないため、実行ノード以外のノードで起動しないようロケーション制約を設定する。

# pcs constraint location rs-stonith-01 avoids t3022cent
# pcs constraint location rs-stonith-02 avoids t3021cent
# pcs constraint
Location Constraints:
  Resource: rg-01
    Constraint: location-rg-01
      Rule: boolean-op=or score=-INFINITY
        Expression: pingd lt 1
        Expression: not_defined pingd
  Resource: rs-stonith-01
    Disabled on:
      Node: t3022cent (score:-INFINITY)
  Resource: rs-stonith-02
    Disabled on:
      Node: t3021cent (score:-INFINITY)
Ordering Constraints:
Colocation Constraints:
Ticket Constraints:

STONITHデバイス作成直後は、エラーが表示されることがあるようなので、一度エラーをpcs stonith cleanupコマンドでクリーンアップしておく。

# pcs stonith cleanup
Cleaned up all resources on all nodes

最終的に、クラスタの構成は以下の通り。

# pcs status
Cluster name: clst-01
Cluster Summary:
  * Stack: corosync
  * Current DC: t3021cent (version 2.0.3-5.el8_2.1-4b1f869f0f) - partition with quorum
  * Last updated: Thu Jul 23 22:57:43 2020
  * Last change:  Thu Jul 23 22:57:26 2020 by hacluster via crmd on t3022cent
  * 2 nodes configured
  * 8 resource instances configured

Node List:
  * Online: [ t3021cent t3022cent ]

Full List of Resources:
  * Resource Group: rg-01:
    * rs-vip-33 (ocf::heartbeat:IPaddr2):       Started t3021cent
    * rs-systemd-squid  (systemd:squid):        Started t3021cent
  * Clone Set: rs-systemd-unbound-clone [rs-systemd-unbound]:
    * Started: [ t3021cent t3022cent ]
  * Clone Set: rs-ping-33-clone [rs-ping-33]:
    * Started: [ t3021cent t3022cent ]
  * rs-stonith-01       (stonith:fence_ESXi):   Started t3021cent
  * rs-stonith-02       (stonith:fence_ESXi):   Started t3022cent

Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled

STONITHの動作確認

STONITHを発生させるには、クラスタ間通信を行うネットワークをすべて切断すればよいが、今回は手軽にコマンドにてSTONITHを実行してみることにする。STONITHの手動実行はpcs stonith fence <電源操作対象ノード>にて行う。

# pcs stonith fence t3022cent
Node: t3022cent fenced

STONITHが実行され、ノード#2 (t3022cent) がOFFLINEになっていることがわかる。

# pcs status
Cluster name: clst-01
Cluster Summary:
  * Stack: corosync
  * Current DC: t3021cent (version 2.0.3-5.el8_2.1-4b1f869f0f) - partition with quorum
  * Last updated: Thu Jul 23 23:08:47 2020
  * Last change:  Thu Jul 23 23:03:04 2020 by root via cibadmin on t3022cent
  * 2 nodes configured
  * 8 resource instances configured

Node List:
  * Online: [ t3021cent ]
  * OFFLINE: [ t3022cent ]

Full List of Resources:
  * Resource Group: rg-01:
    * rs-vip-33 (ocf::heartbeat:IPaddr2):       Started t3021cent
    * rs-systemd-squid  (systemd:squid):        Started t3021cent
  * Clone Set: rs-systemd-unbound-clone [rs-systemd-unbound]:
    * Started: [ t3021cent ]
    * Stopped: [ t3022cent ]
  * Clone Set: rs-ping-33-clone [rs-ping-33]:
    * Started: [ t3021cent ]
    * Stopped: [ t3022cent ]
  * rs-stonith-01       (stonith:fence_ESXi):   Started t3021cent
  * rs-stonith-02       (stonith:fence_ESXi):   Stopped

Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled

ESXiのVMware Host Clientでも、Power Off VMが実行されたのちPower On VMが実行されている。これは、STONITHのデフォルト動作がノードの再起動であるためであり、電源OFFしたのち電源ONが実行される正常な動作となる

まとめ

STONITHはクラスタリソースを正常に稼働させるうえで必要な機能であるが、クラスタの構築中などでは予期せぬタイミングでノードの電源OFFが発生することがある。クラスタの構築中は、メンテナンスモードにするなどして運用するほうが効率的な場合もあるだろう。

0 件のコメント:

コメントを投稿

人気の投稿