Red Hat Training
A Red Hat training course is available for Red Hat OpenStack Platform
第12章 コントローラーノードの置き換え
特定の状況では、高可用性クラスター内のコントローラーノードに障害が発生することがあり、その場合は、そのコントローラーノードをクラスターから削除して新しいコントローラーノードに置き換える必要があります。
以下のシナリオの手順を実施して、コントローラーノードを置き換えます。コントローラーノードを置き換えるプロセスでは、openstack overcloud deploy
コマンドを実行し、コントローラーノードを置き換えるリクエストでオーバークラウドを更新します。
以下の手順は、高可用性環境にのみ適用されます。コントローラーノード 1 台の場合には、この手順は使用しないでください。
12.1. コントローラー置き換えの準備
オーバークラウドコントローラーノードの置き換えを試みる前に、Red Hat OpenStack Platform 環境の現在の状態をチェックしておくことが重要です。このチェックしておくと、コントローラーの置き換えプロセス中に複雑な事態が発生するのを防ぐことができます。以下の事前チェックリストを使用して、コントローラーノードの置き換えを実行しても安全かどうかを確認してください。チェックのためのコマンドはすべてアンダークラウドで実行します。
手順
アンダークラウドで、
overcloud
スタックの現在の状態をチェックします。$ source stackrc (undercloud) $ openstack stack list --nested
overcloud
スタックと後続の子スタックは、CREATE_COMPLETE
またはUPDATE_COMPLETE
のステータスである必要があります。データベースクライアントツールをインストールします。
(undercloud) $ sudo yum -y install mariadb
root ユーザーのデータベースへのアクセス権限を設定します。
(undercloud) $ sudo cp /var/lib/config-data/puppet-generated/mysql/root/.my.cnf /root/.
アンダークラウドデータベースのバックアップを実行します。
(undercloud) $ mkdir /home/stack/backup (undercloud) $ sudo mysqldump --all-databases --quick --single-transaction | gzip > /home/stack/backup/dump_db_undercloud.sql.gz
- アンダークラウドに、新規ノードプロビジョニング時のイメージのキャッシュと変換に対応できる 10 GB の空きストレージ領域があることを確認します。
コントローラーノードで実行中の Pacemaker の状態をチェックします。たとえば、実行中のコントローラーノードの IP アドレスが 192.168.0.47 の場合には、以下のコマンドで Pacemaker のステータス情報を取得します。
(undercloud) $ ssh heat-admin@192.168.0.47 'sudo pcs status'
出力には、既存のノードで実行中のサービスと、障害が発生しているノードで停止中のサービスがすべて表示されるはずです。
オーバークラウド MariaDB クラスターの各ノードで以下のパラメーターをチェックします。
-
wsrep_local_state_comment: Synced
wsrep_cluster_size: 2
実行中のコントローラーノードで以下のコマンドを使用して、パラメーターをチェックします。以下の例では、コントローラーノードの IP アドレスは、それぞれ 192.168.0.47 と 192.168.0.46 です。
(undercloud) $ for i in 192.168.0.47 192.168.0.46 ; do echo "*** $i ***" ; ssh heat-admin@$i "sudo mysql -p\$(sudo hiera -c /etc/puppet/hiera.yaml mysql::server::root_password) --execute=\"SHOW STATUS LIKE 'wsrep_local_state_comment'; SHOW STATUS LIKE 'wsrep_cluster_size';\""; done
-
RabbitMQ のステータスをチェックします。たとえば、実行中のコントローラーノードの IP アドレスが 192.168.0.47 の場合には、以下のコマンドを実行してステータスを取得します。
(undercloud) $ ssh heat-admin@192.168.0.47 "sudo docker exec \$(sudo docker ps -f name=rabbitmq-bundle -q) rabbitmqctl cluster_status"
running_nodes
キーには、障害が発生しているノードは表示されず、稼働中のノード 2 台のみが表示されるはずです。フェンシングが有効化されている場合には無効にします。たとえば、実行中のコントローラーノードの IP アドレスが 192.168.0.47 の場合には、以下のコマンドを実行してフェンシングを無効にします。
(undercloud) $ ssh heat-admin@192.168.0.47 "sudo pcs property set stonith-enabled=false"
以下のコマンドを実行してフェンシングのステータスを確認します。
(undercloud) $ ssh heat-admin@192.168.0.47 "sudo pcs property show stonith-enabled"
director ノードで Compute サービスがアクティブであることを確認します。
(undercloud) $ openstack hypervisor list
出力では、メンテナンスモードに入っていないすべてのノードが
up
のステータスで表示されるはずです。アンダークラウドコンテナーがすべて実行中であることを確認します。
(undercloud) $ sudo docker ps
12.2. Ceph monitor デーモンの削除
ストレージクラスターから ceph-mon
デーモンを削除するには、以下の手順に従います。コントローラーノードが Ceph monitor サービスを実行している場合には、以下の手順を実施して、ceph-mon デーモンを削除してください。この手順は、コントローラーが到達可能であることを前提としています。
クラスターに新しいコントローラーを追加すると、新しい Ceph monitor デーモンも自動的に追加されます。
手順
置き換えるコントローラーに接続して、root になります。
# ssh heat-admin@192.168.0.47 # sudo su -
注記コントローラーが到達不可能な場合には、ステップ 1 と 2 をスキップして、稼働している任意のコントローラーノードでステップ 3 から手順を続行してください。
root として monitor を停止します。
# systemctl stop ceph-mon@<monitor_hostname>
例:
# systemctl stop ceph-mon@overcloud-controller-1
- 置き換えるコントローラーとの接続を終了します。
既存のコントローラーのいずれかに接続します。
# ssh heat-admin@192.168.0.46 # sudo su -
クラスターから monitor を削除します。
# ceph mon remove <mon_id>
すべてのコントローラーノード上で、
/etc/ceph/ceph.conf
から monitor のエントリーを削除します。たとえば、controller-1 を削除する場合には、controller-1 の IP アドレスとホスト名を削除します。編集前:
mon host = 172.18.0.21,172.18.0.22,172.18.0.24 mon initial members = overcloud-controller-2,overcloud-controller-1,overcloud-controller-0
編集後:
mon host = 172.18.0.22,172.18.0.24 mon initial members = overcloud-controller-2,overcloud-controller-0
注記置き換え用のコントローラーノードが追加されると、director によって該当するオーバークラウドノード上の
ceph.conf
ファイルが更新されます。通常は、director がこの設定ファイルを管理するだけで、手動でファイルを編集する必要はありません。ただし、新規ノードが追加される前に他のノードが再起動してしまった場合には、一貫性を保つために手動でファイルを編集することができます。オプションとして、monitor データをアーカイブし、アーカイブを別のサーバーに保存します。
# mv /var/lib/ceph/mon/<cluster>-<daemon_id> /var/lib/ceph/mon/removed-<cluster>-<daemon_id>
12.3. コントローラーを置き換えるためのクラスター準備
古いノードを置き換える場合には、Pacemaker がノード上で実行されていないことを確認してからそのノードを Pacemaker クラスターから削除する必要があります。
手順
コントローラーノードの IP アドレスの一覧を取得します。
(undercloud) $ openstack server list -c Name -c Networks +------------------------+-----------------------+ | Name | Networks | +------------------------+-----------------------+ | overcloud-compute-0 | ctlplane=192.168.0.44 | | overcloud-controller-0 | ctlplane=192.168.0.47 | | overcloud-controller-1 | ctlplane=192.168.0.45 | | overcloud-controller-2 | ctlplane=192.168.0.46 | +------------------------+-----------------------+
まだ古いノードにアクセスできる場合は、残りのノードのいずれかにログインし、古いノード上の Pacemaker を停止します。以下の例では、overcloud-controller-1 上の Pacemaker を停止しています。
(undercloud) $ ssh heat-admin@192.168.0.47 "sudo pcs status | grep -w Online | grep -w overcloud-controller-1" (undercloud) $ ssh heat-admin@192.168.0.47 "sudo pcs cluster stop overcloud-controller-1"
注記古いノードが物理的に利用できない、または停止している場合には、そのノードでは Pacemaker はすでに停止しているので、この操作を実施する必要はありません。
古いノード上の Pacemaker を停止したら、各ノードの Corosync 設定から古いノードを削除して、Corosync を再起動します。古いノード上の Pacemaker のステータスを確認するには、
pcs status
コマンドを実行し、ステータスがStopped
であることを確認します。以下のコマンドの例では、
overcloud-controller-0
およびovercloud-controller-2
にログインし、overcloud-controller-1
を削除しています。(undercloud) $ for NAME in overcloud-controller-0 overcloud-controller-2; do IP=$(openstack server list -c Networks -f value --name $NAME | cut -d "=" -f 2) ; ssh heat-admin@$IP "sudo pcs cluster localnode remove overcloud-controller-1; sudo pcs cluster reload corosync"; done
残りのノードの中の 1 台にログインして、
crm_node
コマンドで対象のノードをクラスターから削除します。(undercloud) $ ssh heat-admin@192.168.0.47 [heat-admin@overcloud-controller-0 ~]$ sudo crm_node -R overcloud-controller-1 --force
オーバークラウドデータベースは、置き換え手順の実行中に稼働し続ける必要があります。この手順の実行中に Pacemaker が Galera を停止しないようにするには、実行中のコントローラーノードを選択して、そのコントローラーノードの IP アドレスを使用して、アンダークラウドで以下のコマンドを実行します。
(undercloud) $ ssh heat-admin@192.168.0.47 "sudo pcs resource unmanage galera-bundle"
12.4. コントローラーノードの置き換え
コントローラーノードを置き換えるには、置き換えるノードのインデックスを特定します。
- ノードが仮想ノードの場合には、障害の発生したディスクが含まれるノードを特定し、バックアップからそのディスクをリストアします。障害の発生したサーバー上での PXE ブートに使用する NIC の MAC アドレスは、ディスク置き換え後も同じアドレスにしてください。
- ノードがベアメタルノードの場合には、ディスクを置き換え、オーバークラウド設定で新しいディスクを準備し、新しいハードウェア上でノードのイントロスペクションを実施します。
overcloud-controller-1
ノードを overcloud-controller-3
ノードに置き換えるには、以下の手順例を実施します。overcloud-controller-3
ノードの ID は 75b25e9a-948d-424a-9b3b-f0ef70a6eacf
です。
ノードを既存の ironic ノードに置き換えるには、director がノードを自動的に再プロビジョニングしないように、削除するノードをメンテナンスモードに切り替える必要があります。
手順
source コマンドで
stackrc
ファイルを読み込みます。$ source ~/stackrc
overcloud-controller-1
ノードのインデックスを特定します。$ INSTANCE=$(openstack server list --name overcloud-controller-1 -f value -c ID)
インスタンスに関連付けられたベアメタルノードを特定します。
$ NODE=$(openstack baremetal node list -f csv --quote minimal | grep $INSTANCE | cut -f1 -d,)
ノードをメンテナンスモードに切り替えます。
$ openstack baremetal node maintenance set $NODE
コントローラーノードが仮想ノードの場合には、コントローラーホストで以下のコマンドを実行し、障害の発生した仮想ディスクをバックアップからの仮想ディスクに置き換えます。
$ cp <VIRTUAL_DISK_BACKUP> /var/lib/libvirt/images/<VIRTUAL_DISK>
<VIRTUAL_DISK_BACKUP>
を障害の発生した仮想ディスクのバックアップへのパスに、<VIRTUAL_DISK>
を置き換える仮想ディスクの名前にそれぞれ置き換えます。削除するノードのバックアップがない場合には、新しい仮想ノードを使用する必要があります。
コントローラーノードがベアメタルノードの場合には、以下の手順を実施してディスクを新しいベアメタルディスクに置き換えます。
- 物理ハードドライブまたはソリッドステートドライブを置き換えます。
- 障害が発生したノードと同じ設定のノードを準備します。
関連付けられていないノードの一覧を表示し、新規ノードの ID を特定します。
$ openstack baremetal node list --unassociated
新規ノードを
control
プロファイルにタグ付けします。(undercloud) $ openstack baremetal node set --property capabilities='profile:control,boot_option:local' 75b25e9a-948d-424a-9b3b-f0ef70a6eacf
12.5. コントローラーノード置き換えのトリガー
古いコントローラーノードを削除して新規コントローラーノードに置き換えるには、以下の手順を実施します。
手順
削除するノードのインデックスを定義する環境ファイルを作成します (
~/templates/remove-controller.yaml
)。parameters: ControllerRemovalPolicies: [{'resource_list': ['1']}]
ご自分の環境に該当するその他の環境ファイルと共に
remove-controller.yaml
環境ファイルを指定して、オーバークラウドデプロイメントコマンドを実行します。(undercloud) $ openstack overcloud deploy --templates \ -e /home/stack/templates/remove-controller.yaml \ -e /home/stack/templates/node-info.yaml \ [OTHER OPTIONS]
注記-e ~/templates/remove-controller.yaml
は、デプロイメントコマンドのこのインスタンスに対してのみ指定します。これ以降のデプロイメント操作からは、この環境ファイルを削除してください。director は古いノードを削除して、新しいノードを作成してから、オーバークラウドスタックを更新します。以下のコマンドを使用すると、オーバークラウドスタックのステータスをチェックすることができます。
(undercloud) $ openstack stack list --nested
デプロイメントコマンドの実行が完了すると、director の出力には古いノードが新規ノードに置き換えられたことが表示されます。
(undercloud) $ openstack server list -c Name -c Networks +------------------------+-----------------------+ | Name | Networks | +------------------------+-----------------------+ | overcloud-compute-0 | ctlplane=192.168.0.44 | | overcloud-controller-0 | ctlplane=192.168.0.47 | | overcloud-controller-2 | ctlplane=192.168.0.46 | | overcloud-controller-3 | ctlplane=192.168.0.48 | +------------------------+-----------------------+
これで、新規ノードが稼動状態のコントロールプレーンサービスをホストするようになります。
12.6. コントローラーノード置き換え後のクリーンアップ
ノードの置き換えが完了したら、以下の手順を実施してコントローラークラスターの最終処理を行います。
手順
- コントローラーノードにログインします。
Galera クラスターの Pacemaker 管理を有効にし、新規ノード上で Galera を起動します。
[heat-admin@overcloud-controller-0 ~]$ sudo pcs resource refresh galera-bundle [heat-admin@overcloud-controller-0 ~]$ sudo pcs resource manage galera-bundle
最終のステータスチェックを実行して、サービスが正しく実行されていることを確認します。
[heat-admin@overcloud-controller-0 ~]$ sudo pcs status
注記エラーが発生したサービスがある場合には、
pcs resource refresh
コマンドを使用して問題を解決し、そのサービスを再起動します。director を終了します。
[heat-admin@overcloud-controller-0 ~]$ exit
オーバークラウドと対話できるようにするために、source コマンドで
overcloudrc
ファイルを読み込みます。$ source ~/overcloudrc
オーバークラウド環境のネットワークエージェントを確認します。
(overcloud) $ openstack network agent list
古いノードにエージェントが表示される場合には、そのエージェントを削除します。
(overcloud) $ for AGENT in $(openstack network agent list --host overcloud-controller-1.localdomain -c ID -f value) ; do openstack network agent delete $AGENT ; done
必要に応じて、新規ノード上の L3 エージェントホストにルーターを追加します。以下のコマンドは、UUID に 2d1c1dc1-d9d4-4fa9-b2c8-f29cd1a649d4 を使用して L3 エージェントに r1 という名称のルーターを追加する例です。
(overcloud) $ openstack network agent add router --l3 2d1c1dc1-d9d4-4fa9-b2c8-f29cd1a649d4 r1
削除したノードの Compute サービスがオーバークラウドにまだ存在しているので、削除する必要があります。削除したノードの Compute サービスを確認します。
[stack@director ~]$ source ~/overcloudrc (overcloud) $ openstack compute service list --host overcloud-controller-1.localdomain
削除したノードのコンピュートサービスを削除します。
(overcloud) $ for SERVICE in $(openstack compute service list --host overcloud-controller-1.localdomain -c ID -f value ) ; do openstack compute service delete $SERVICE ; done