Red Hat Training
A Red Hat training course is available for Red Hat OpenStack Platform
コンピュートインスタンスの高可用性
コンピュートインスタンスの高可用性設定
OpenStack Documentation Team
rhos-docs@redhat.com
概要
第1章 概要
本ガイドでは、高可用性 (HA) を使用してインスタンスを保護する方法について説明します。HA のバックエンドは Pacemaker Cluster Manager です。Pacemaker により、コンピュートノードおよびアプリケーションの障害を検知し、障害発生を予測して対応する機能が追加されます。本ガイドの手順は、director でデプロイされ、完全な HA 状態で設定された既存の Red Hat OpenStack Platform 環境に適しています。
インスタンスの高可用性を実装している間は、アップグレードやスケールアップの操作はできません。アップグレードやスケールアップを試行しても失敗します。
また、インスタンスの高可用性を有効にすると、将来、director を使用したアップグレードはできなくなります。これは、メジャーアップグレードとマイナーアップグレードの両方に該当します。詳しくは、https://access.redhat.com/solutions/2661641 を参照してください。
第2章 環境の要件および前提条件
本ガイドで使用する環境の要件と前提条件は以下のとおりです。
- Red Hat OpenStack Platform director を使用して環境がデプロイされていること。
- コントロールプレーンでフェンシングが手動で有効化されていること。
- インスタンスを HA に設定した後に overcloud stack の更新が実行されないこと。
以下のパッケージが全ノードにインストールされていること。
-
fence-agents-4.0.11-37
(以降) -
pacemaker-1.1.12-22.el7_1.4.x86_64
(以降) -
resource-agents-3.9.5-54.el7_2.18
(以降)
-
- コンピュートおよびコントロールプレーンの両方を完全に停止する必要がある。
- 一時ストレージおよびブロックストレージの共有ストレージが環境内で有効になっていること。
- メッセージブローカー (AMQP) が各コンピュートノードのホスト名を有効と認識していること。
コンピュートノードのホスト名を確認するには、以下のコマンドを実行します。
heat-admin@compute-n # sudo openstack-config --get /etc/nova/nova.conf DEFAULT host
2.1. 共有ストレージの例外
通常、インスタンスに高可用性を設定するには、共有ストレージが必要です。no-shared-storage のオプションの使用を試みると、退避中に InvalidSharedStorage エラーが表示されて、別のノードではインスタンスの電源がオンにならない可能性が高くなります。ただし、全インスタンスが Block Storage (cinder) ボリュームから起動するように設定されている場合には、インスタンスのディスクイメージを保管するための共有ストレージは必要ないため、no-shared-storage オプションを使用して全インスタンスを退避することができます。
退避中に、インスタンスが Block Storage ボリュームから起動するように設定されている場合には、退避されるインスタンスはいずれも、同じボリュームから起動することが予想されますが、別のコンピュートノード上で起動することになります。そのため、OS イメージとアプリケーションデータはその Block Storage ボリューム上に保持されているので、退避されたインスタンスは、ジョブを即時に再起動することができます。
第3章 インストール
コンピュートノード上の libvirtd および全 OpenStack サービスを無効にすることから開始します。
heat-admin@compute-n # sudo openstack-service disable heat-admin@compute-n # sudo systemctl stop libvirtd heat-admin@compute-n # sudo systemctl disable libvirtd
pacemaker-remote に使用するための認証キーを作成します。コンピュートノードで以下のステップを実行します。
heat-admin@compute-1 # sudo mkdir -p /etc/pacemaker/ heat-admin@compute-1 # sudo dd if=/dev/urandom of=/etc/pacemaker/authkey bs=4096 count=1 heat-admin@compute-1 # sudo cp /etc/pacemaker/authkey ./ heat-admin@compute-1 # sudo chown heat-admin:heat-admin authkey
このキーを director ノードにコピーしてから、残りのコンピュートおよびコントローラーノードにコピーします。
stack@director # scp authkey heat-admin@node-n:~/ heat-admin@node-n # sudo mkdir -p --mode=0750 /etc/pacemaker heat-admin@node-n # sudo chgrp haclient /etc/pacemaker heat-admin@node-n # sudo chown root:haclient /etc/pacemaker/authkey
全コンピュートノードで pacemaker-remote を有効化します。
heat-admin@compute-n # sudo systemctl enable pacemaker_remote heat-admin@compute-n # sudo systemctl start pacemaker_remote
必要とされるバージョンの pacemaker (
1.1.12-22.el7_1.4.x86_64
) および resource-agents (3.9.5-40.el7_1.5.x86_64
) パッケージがコントローラーノードとコンピュートノードにインストールされていることを確認します。heat-admin@controller-n # sudo rpm -qa | egrep \'(pacemaker|resource-agents)'
overcloudrc ファイルを使用して NovaEvacuate Active/Passive リソースを作成し、
auth_url
、username
、tenant
、password
の値を指定します。stack@director # scp overcloudrc heat-admin@controller-1:~/ heat-admin@controller-1 # . ~/overcloudrc heat-admin@controller-1 # sudo pcs resource create nova-evacuate ocf:openstack:NovaEvacuate auth_url=$OS_AUTH_URL username=$OS_USERNAME password=$OS_PASSWORD tenant_name=$OS_TENANT_NAME # 1
- 1
- 共有ストレージを使用していない場合には、no_shared_storage=1 オプションを追加してください。詳しい説明は、「共有ストレージの例外」 を参照してください。
nova-evacuate が Floating IP リソース、Image サービス (glance)、OpenStack Networking サービス (neutron)、Compute サービス(nova) の後に起動されることを確認します。
heat-admin@controller-1 # for i in $(sudo pcs status | grep IP | awk \'{ print $1 }\'); do sudo pcs constraint order start $i then nova-evacuate ; done heat-admin@controller-1 # for i in openstack-glance-api-clone neutron-metadata-agent-clone openstack-nova-conductor-clone; do sudo pcs constraint order start $i then nova-evacuate require-all=false ; done
コントロールプレーンの全 OpenStack リソースを無効にします。
heat-admin@controller-1 # sudo pcs resource disable openstack-core-clone --wait=540
上記のコマンドのタイムアウト値 (--wait=540) は、例として使用しているだけです。Identity サービスを停止するのに必要な時間 (およびハードウェアの処理能力) に応じて、タイムアウト時間を増やすことを検討してください。
cibadmin
データを使用して現在のコントローラー一覧を作成します。heat-admin@controller-1 # controllers=$(sudo cibadmin -Q -o nodes | grep uname | sed s/.*uname..// | awk -F\" '{print $1}') heat-admin@controller-1 # echo $controllers
osprole=controller
プロパティーでこれらのノードをコントローラーとしてタグ付けします。heat-admin@controller-1 # for controller in ${controllers}; do sudo pcs property set --node ${controller} osprole=controller ; done
環境内にすでに存在する stonith デバイスの一覧を作成します。
heat-admin@controller-1 # stonithdevs=$(sudo pcs stonith | awk \'{print $1}') heat-admin@controller-1 # echo $stonithdevs
コントロールプレーンサービスをタグ付けし、一覧内の stonith デバイスをスキップして、上記で特定したコントローラーのみで実行されるようにします。
heat-admin@controller-1 # for i in $(sudo cibadmin -Q --xpath //primitive --node-path | tr ' ' \'\n' | awk -F "id=\'" '{print $2}' | awk -F "\'" '{print $1}' | uniq); do found=0 if [ -n "$stonithdevs" ]; then for x in $stonithdevs; do if [ $x = $i ]; then found=1 fi done fi if [ $found = 0 ]; then sudo pcs constraint location $i rule resource-discovery=exclusive score=0 osprole eq controller fi done
pacemaker 内にコンピュートノードのリソースの追加を開始します。最初に neutron-openvswitch-agent を追加します。
heat-admin@controller-1 # sudo pcs resource create neutron-openvswitch-agent-compute systemd:neutron-openvswitch-agent op start timeout 200s stop timeout 200s --clone interleave=true --disabled --force heat-admin@controller-1 # sudo pcs constraint location neutron-openvswitch-agent-compute-clone rule resource-discovery=exclusive score=0 osprole eq compute heat-admin@controller-1 # sudo pcs constraint order start neutron-server-clone then neutron-openvswitch-agent-compute-clone require-all=false
次に Compute の libvirtd リソースを追加します。
heat-admin@controller-1 # sudo pcs resource create libvirtd-compute systemd:libvirtd op start timeout 200s stop timeout 200s --clone interleave=true --disabled --force heat-admin@controller-1 # sudo pcs constraint location libvirtd-compute-clone rule resource-discovery=exclusive score=0 osprole eq compute heat-admin@controller-1 # sudo pcs constraint order start neutron-openvswitch-agent-compute-clone then libvirtd-compute-clone heat-admin@controller-1 # sudo pcs constraint colocation add libvirtd-compute-clone with neutron-openvswitch-agent-compute-clone
次に openstack-ceilometer-compute リソースを追加します。
heat-admin@controller-1 # sudo pcs resource create ceilometer-compute systemd:openstack-ceilometer-compute op start timeout 200s stop timeout 200s --clone interleave=true --disabled --force heat-admin@controller-1 # sudo pcs constraint location ceilometer-compute-clone rule resource-discovery=exclusive score=0 osprole eq compute heat-admin@controller-1 # sudo pcs constraint order start openstack-ceilometer-notification-clone then ceilometer-compute-clone require-all=false heat-admin@controller-1 # sudo pcs constraint order start libvirtd-compute-clone then ceilometer-compute-clone heat-admin@controller-1 # sudo pcs constraint colocation add ceilometer-compute-clone with libvirtd-compute-clone
次に nova-compute リソースを追加します。
heat-admin@controller-1 # . /home/heat-admin/overcloudrc heat-admin@controller-1 # sudo pcs resource create nova-compute-checkevacuate ocf:openstack:nova-compute-wait auth_url=$OS_AUTH_URL username=$OS_USERNAME password=$OS_PASSWORD tenant_name=$OS_TENANT_NAME domain=localdomain op start timeout=300 --clone interleave=true --disabled --force heat-admin@controller-1 # sudo pcs constraint location nova-compute-checkevacuate-clone rule resource-discovery=exclusive score=0 osprole eq compute heat-admin@controller-1 # sudo pcs constraint order start openstack-nova-conductor-clone then nova-compute-checkevacuate-clone require-all=false heat-admin@controller-1 # sudo pcs resource create nova-compute systemd:openstack-nova-compute --clone interleave=true --disabled --force heat-admin@controller-1 # sudo pcs constraint location nova-compute-clone rule resource-discovery=exclusive score=0 osprole eq compute heat-admin@controller-1 # sudo pcs constraint order start nova-compute-checkevacuate-clone then nova-compute-clone require-all=true heat-admin@controller-1 # sudo pcs constraint order start nova-compute-clone then nova-evacuate require-all=false heat-admin@controller-1 # sudo pcs constraint order start libvirtd-compute-clone then nova-compute-clone heat-admin@controller-1 # sudo pcs constraint colocation add nova-compute-clone with libvirtd-compute-clone
コンピュートノード用に stonith デバイスを追加します。各コンピュートノードで以下のコマンドを実行します。
heat-admin@controller-1 # sudo pcs stonith create ipmilan-overcloud-compute-N fence_ipmilan pcmk_host_list=overcloud-compute-0 ipaddr=10.35.160.78 login=IPMILANUSER passwd=IPMILANPW lanplus=1 cipher=1 op monitor interval=60s;
ここで、
-
N は各コンピュートノードを識別するための番号に置き換えます (例:
ipmilan-overcloud-compute-1
、ipmilan-overcloud-compute-2
など)。 - IPMILANUSER および IPMILANPW は、IPMI デバイスのユーザー名とパスワードに置き換えます。
-
N は各コンピュートノードを識別するための番号に置き換えます (例:
別の fence-nova stonith デバイスを作成します。
heat-admin@controller-1 # . overcloudrc heat-admin@controller-1 # sudo pcs stonith create fence-nova fence_compute \ auth-url=$OS_AUTH_URL \ login=$OS_USERNAME \ passwd=$OS_PASSWORD \ tenant-name=$OS_TENANT_NAME \ record-only=1 action=off --force
コンピュートノードがフェンシング後に回復できるようにします。
heat-admin@controller-1 # sudo pcs property set cluster-recheck-interval=1min
コンピュートノードのリソースを作成して、stonith level 1 にノードの物理フェンスデバイスと fence-nova の両方が含まれるように設定します。そのためには、各コンピュートノードに対して以下のコマンドを実行します。
heat-admin@controller-1 # sudo pcs resource create overcloud-compute-N ocf:pacemaker:remote reconnect_interval=60 op monitor interval=20 heat-admin@controller-1 # sudo pcs property set --node overcloud-compute-N osprole=compute heat-admin@controller-1 # sudo pcs stonith level add 1 overcloud-compute-N ipmilan-overcloud-compute-N,fence-nova heat-admin@controller-1 # sudo pcs stonith
N は、各コンピュートノードを識別するための番号に置き換えます (例:
overcloud-compute-1
、overcloud-compute-2
など)。これらの識別番号を使用して、前のステップで作成した stonith デバイスに各コンピュートノードを照合します (例:overcloud-compute-1
およびipmilan-overcloud-compute-1
)。コントロールおよびコンピュートプレーンサービスを有効にします。
heat-admin@controller-1 # sudo pcs resource enable openstack-core-clone
環境が安定するまでしばらく待ってから、失敗したリソースをクリーンアップします。
heat-admin@controller-1 # sleep 60 heat-admin@controller-1 # sudo pcs resource cleanup heat-admin@controller-1 # sudo pcs status heat-admin@controller-1 # sudo pcs property set stonith-enabled=true
第4章 高可用性のテスト
以下の手順を実行すると、コンピュートノードは警告なしで意図的に再起動されます。
オーバークラウド上でインスタンスを 1 つまたは複数起動し、それらのインスタンスをホストしているコンピュートノードをクラッシュさせます。
stack@director # . overcloudrc stack@director # nova boot --image cirros --flavor 2 test-failover stack@director # nova list --fields name,status,host stack@director # . stackrc stack@director # ssh -lheat-admin compute-n heat-admin@compute-n # echo c > /proc/sysrq-trigger
しばらくすると、それらのインスタンスはオンラインのコンピュートノードで再起動されるはずです。再起動されていることを確認するには以下のコマンドを実行します。
stack@director # nova list --fields name,status,host stack@director # nova service-list