第9章 オーバークラウドのスケーリング
オーバークラウドの作成後に、ノードを追加または削除する必要がある場合があります。たとえば、オーバークラウドのコンピュートノードを追加する場合などです。このような状況では、オーバークラウドの更新が必要です。
コンピュートインスタンスの高可用性 (またはインスタンス HA。『コンピュートインスタンスの高可用性』で説明) を使用している場合は、アップグレードとスケールアップはできません。操作を試みても失敗します。
HA を有効化しているインスタンスがある場合には、アップグレードまたはスケールアップを実行する前に無効にしてください。そのためには、 「Rollback」に記載の ロールバック の操作を実行してください。
以下の表を使用して、各ノード種別のスケーリングに対するサポートを判断してください。
表9.1 各ノード種別のスケーリングサポート
|
ノード種別 |
スケールアップ |
スケールダウン |
備考 |
|
コントローラー |
☓ |
☓ | |
|
Compute |
Y |
Y | |
|
Ceph Storage ノード |
Y |
☓ |
オーバークラウドを最初に作成する際に Ceph Storage ノードを 1 つ以上設定する必要があります。 |
|
Block Storage ノード |
☓ |
☓ | |
|
Object Storage ノード |
Y |
Y |
リングを手動で管理する必要があります (「Object Storage ノードの置き換え」に説明を記載)。 |
オーバークラウドをスケーリングする前には、空き領域が少なくとも 10 GB のあることを確認してください。この空き領域は、イメージの変換やノードのプロビジョニングプロセスのキャッシュに使用されます。
9.1. ノードのさらなる追加
director のノードプールにさらにノードを追加するには、登録する新規ノードの詳細を記載した新しい JSON ファイル (例: newnodes.json) を作成します。
{
"nodes":[
{
"mac":[
"dd:dd:dd:dd:dd:dd"
],
"cpu":"4",
"memory":"6144",
"disk":"40",
"arch":"x86_64",
"pm_type":"pxe_ipmitool",
"pm_user":"admin",
"pm_password":"p@55w0rd!",
"pm_addr":"192.0.2.207"
},
{
"mac":[
"ee:ee:ee:ee:ee:ee"
],
"cpu":"4",
"memory":"6144",
"disk":"40",
"arch":"x86_64",
"pm_type":"pxe_ipmitool",
"pm_user":"admin",
"pm_password":"p@55w0rd!",
"pm_addr":"192.0.2.208"
}
]
}これらのパラメーターについての説明は、「オーバークラウドへのノードの登録」を参照してください。
以下のコマンドを実行して、これらのノードを登録します。
$ openstack baremetal import --json newnodes.json
新規ノードを追加した後には、それらのイントロスペクションプロセスを起動します。各新規ノードに以下のコマンドを使用します。
$ ironic node-set-provision-state [NODE UUID] manage $ openstack baremetal introspection start [NODE UUID] $ ironic node-set-provision-state [NODE UUID] provide
このコマンドは、ノードのハードウェアプロパティーの検出とベンチマークを実行します。
イントロスペクションプロセスの完了後には、各新規ノードを任意のロールにタグ付けしてスケーリングします。たとえば、コンピュートノードの場合には、以下のコマンドを使用します。
$ ironic node-update [NODE UUID] add properties/capabilities='profile:compute,boot_option:local'
デプロイメント中に使用するブートイメージを設定します。bm-deploy-kernel および bm-deploy-ramdisk イメージの UUID を確認します。
$ glance image-list +--------------------------------------+------------------------+ | ID | Name | +--------------------------------------+------------------------+ | 09b40e3d-0382-4925-a356-3a4b4f36b514 | bm-deploy-kernel | | 765a46af-4417-4592-91e5-a300ead3faf6 | bm-deploy-ramdisk | | ef793cd0-e65c-456a-a675-63cd57610bd5 | overcloud-full | | 9a51a6cb-4670-40de-b64b-b70f4dd44152 | overcloud-full-initrd | | 4f7e33f4-d617-47c1-b36f-cbe90f132e5d | overcloud-full-vmlinuz | +--------------------------------------+------------------------+
新規ノードの deploy_kernel および deploy_ramdisk 設定にこれらの UUID を設定します。
$ ironic node-update [NODE UUID] add driver_info/deploy_kernel='09b40e3d-0382-4925-a356-3a4b4f36b514' $ ironic node-update [NODE UUID] add driver_info/deploy_ramdisk='765a46af-4417-4592-91e5-a300ead3faf6'
オーバークラウドをスケーリングするには、ロールに必要なノード数を指定して openstack overcloud deploy を再実行する必要があります。たとえば、コンピュートノード 5 台にスケーリングするには、以下のコマンドを実行します。
$ openstack overcloud deploy --templates --compute-scale 5 [OTHER_OPTIONS]
上記のコマンドにより、オーバークラウドのスタック全体が更新されます。このコマンドが更新するのは、スタックのみである点に注意してください。オーバークラウドの削除や、スタックの置き換えは行われません。
コンピュート以外のノードに対する同様のスケジューリングパラメーターなど、最初に作成したオーバークラウドからの環境ファイルおよびオプションをすべて追加するようにしてください。
9.2. コンピュートノードの削除
オーバークラウドからコンピュートノードを削除する必要がある状況が出てくる可能性があります。たとえば、問題のあるコンピュートノードを置き換える必要がある場合などです。
オーバークラウドからコンピュートノードを削除する前に、ワークロードをそのノードから別のコンピュートノードに移行してください。詳しくは、「オーバークラウドのコンピュートノードからの仮想マシンの移行」を参照してください。
次に、オーバークラウド上でノードの Compute サービスを無効化します。これにより、ノードで新規インスタンスがスケジューリングされないようになります。
$ source ~/stack/overcloudrc $ nova service-list $ nova service-disable [hostname] nova-compute $ source ~/stack/stackrc
オーバークラウドノードを削除するには、ローカルのテンプレートファイルを使用して overcloud スタックへの更新が必要です。最初に、オーバークラウドスタックの UUID を特定します。
$ heat stack-list
削除するノードの UUID を特定します。
$ nova list
以下のコマンドを実行してスタックからノードを削除し、それに応じてプランを更新します。
$ openstack overcloud node delete --stack [STACK_UUID] --templates -e [ENVIRONMENT_FILE] [NODE1_UUID] [NODE2_UUID] [NODE3_UUID]
オーバークラウドの作成時に追加の環境ファイルを渡した場合には、オーバークラウドに、不要な変更が手動で加えられないように、ここで -e または --environment-file オプションを使用して環境ファイルを再度指定します。
操作を続行する前に、openstack overcloud node delete コマンドが完全に終了したことを確認します。openstack stack list コマンドを使用して、overcloud スタックが UPDATE_COMPLETE のステータスに切り替わっているかどうかをチェックしてください。
最後に、ノードの Compute サービスを削除します。
$ source ~/stack/overcloudrc $ nova service-list $ nova service-delete [service-id] $ source ~/stack/stackrc
ノードの Open vSwitch エージェントも削除します。
$ source ~/stack/overcloudrc $ neutron agent-list $ neutron agent-delete [openvswitch-agent-id] $ source ~/stack/stackrc
オーバークラウドから自由にノードを削除して、別の目的でそのノードを再プロビジョニングすることができます。
9.3. コンピュートノードの置き換え
コンピュートノードに障害が発生した場合に、機能しているノードに置き換えることができます。コンピュートノードを置き換えるには、以下の手順を使用します。
- 既存のコンピュートノードからワークロードを移行して、ノードをシャットダウンします。この手順は「オーバークラウドのコンピュートノードからの仮想マシンの移行」を参照してください。
- オーバークラウドからコンピュートノードを削除します。この手順は「コンピュートノードの削除」を参照してください。
- 新しいコンピュートノードでオーバークラウドをスケーリングアウトします。その手順は、「ノードのさらなる追加」を参照してください。
このプロセスでは、インスタンスの可用性に影響を与えることなく、ノードを置き換えることができるようにします。
9.4. コントローラーノードの置き換え
特定の状況では、高可用性クラスター内のコントローラーノードに障害が発生することがあり、その場合は、そのコントローラーノードをクラスターから削除して新しいコントローラーノードに置き換える必要があります。このステップには、クラスター内の他のノードとの接続を確認する作業も含まれます。
本項では、コントローラーノードの置き換えの手順について説明します。このプロセスでは openstack overcloud deploy コマンドを実行してコントローラーノードの置き換えを要求し、オーバークラウドを更新します。このプロセスは、自動的には完了しない点に注意してください。オーバークラウドスタックの更新プロセスの途中で、openstack overcloud deploy コマンドによりエラーが報告されて、オーバークラウドスタックの更新が停止します。この時点で、プロセスに手動での介入が必要となり、その後に openstack overcloud deploy のプロセスを続行することができます。
以下の手順は、高可用性環境のみに適用します。コントローラーノード 1 台の場合には、この手順は使用しないでください。
9.4.1. 事前のチェック
オーバークラウドコントローラーノードの置き換えを試みる前に、Red Hat OpenStack Platform 環境の現在の状態をチェックしておくことが重要です。このチェックしておくと、コントローラーの置き換えプロセス中に複雑な事態が発生するのを防ぐことができます。以下の事前チェックリストを使用して、コントローラーノードの置き換えを実行しても安全かどうかを確認してください。チェックのためのコマンドはすべてアンダークラウドで実行します。
アンダークラウドで、
overcloudスタックの現在の状態をチェックします。$ source stackrc $ heat stack-list --show-nested
overcloudスタックと後続の子スタックは、CREATE_COMPLETEまたはUPDATE_COMPLETEのステータスである必要があります。アンダークラウドデータベースのバックアップを実行します。
$ mkdir /home/stack/backup $ sudo mysqldump --all-databases --quick --single-transaction | gzip > /home/stack/backup/dump_db_undercloud.sql.gz $ sudo systemctl stop openstack-ironic-api.service openstack-ironic-conductor.service openstack-ironic-inspector.service openstack-ironic-inspector-dnsmasq.service $ sudo cp /var/lib/ironic-inspector/inspector.sqlite /home/stack/backup $ sudo systemctl start openstack-ironic-api.service openstack-ironic-conductor.service openstack-ironic-inspector.service openstack-ironic-inspector-dnsmasq.service
- アンダークラウドで、新規ノードのプロビジョニング時にイメージのキャッシュと変換に対応できる 10 GB の空きストレージ領域があるかどうかをチェックします。
コントローラーノードで実行中の Pacemaker の状態をチェックします。たとえば、実行中のコントローラーノードの IP アドレスが 192.168.0.47 の場合には、以下のコマンドで Pacemaker のステータス情報を取得します。
$ 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 を使用します)。
$ for i in 192.168.0.47 192.168.0.46 ; do echo "*** $i ***" ; ssh heat-admin@$i "sudo mysql --exec=\"SHOW STATUS LIKE 'wsrep_local_state_comment'\" ; sudo mysql --exec=\"SHOW STATUS LIKE 'wsrep_cluster_size'\""; done
-
RabbitMQ のステータスをチェックします。たとえば、実行中のコントローラーノードの IP アドレスが 192.168.0.47 の場合には、以下のコマンドを実行してステータスを取得します。
$ ssh heat-admin@192.168.0.47 "sudo rabbitmqctl cluster_status"
running_nodesキーには、障害が発生しているノードは表示されず、稼働中のノード 2 台のみが表示されるはずです。フェンシングが有効化されている場合には無効にします。たとえば、実行中のコントローラーノードの IP アドレスが 192.168.0.47 の場合には、以下のコマンドを実行してフェンシングを無効にします。
$ ssh heat-admin@192.168.0.47 "sudo pcs property set stonith-enabled=false"
以下のコマンドを実行してフェンシングのステータスを確認します。
$ ssh heat-admin@192.168.0.47 "sudo pcs property show stonith-enabled"
director ノードで
nova-computeサービスをチェックします。$ sudo systemctl status openstack-nova-compute $ nova hypervisor-list
出力では、メンテナンスモードに入っていないすべてのノードが
upのステータスで表示されるはずです。アンダークラウドサービスがすべて実行中であることを確認します。
$ sudo systemctl -t service
9.4.2. ノードの置き換え
削除するノードのインデックスを特定します。ノードのインデックスは、nova list の出力に表示されるインスタンス名のサフィックスです。
[stack@director ~]$ nova list +--------------------------------------+------------------------+ | ID | Name | +--------------------------------------+------------------------+ | 861408be-4027-4f53-87a6-cd3cf206ba7a | overcloud-compute-0 | | 0966e9ae-f553-447a-9929-c4232432f718 | overcloud-compute-1 | | 9c08fa65-b38c-4b2e-bd47-33870bff06c7 | overcloud-compute-2 | | a7f0f5e1-e7ce-4513-ad2b-81146bc8c5af | overcloud-controller-0 | | cfefaf60-8311-4bc3-9416-6a824a40a9ae | overcloud-controller-1 | | 97a055d4-aefd-481c-82b7-4a5f384036d2 | overcloud-controller-2 | +--------------------------------------+------------------------+
この例では、overcloud-controller-1 ノードを削除して、overcloud-controller-3 に置き換えます。初めにノードをメンテナンスモードに切り替えて、director が障害の発生したノードを再プロビジョニングしないようにします。nova list で表示されるインスタンスの ID を、ironic node-list で表示されるノード ID と相関させます。
[stack@director ~]$ ironic node-list +--------------------------------------+------+--------------------------------------+ | UUID | Name | Instance UUID | +--------------------------------------+------+--------------------------------------+ | 36404147-7c8a-41e6-8c72-a6e90afc7584 | None | 7bee57cf-4a58-4eaf-b851-2a8bf6620e48 | | 91eb9ac5-7d52-453c-a017-c0e3d823efd0 | None | None | | 75b25e9a-948d-424a-9b3b-f0ef70a6eacf | None | None | | 038727da-6a5c-425f-bd45-fda2f4bd145b | None | 763bfec2-9354-466a-ae65-2401c13e07e5 | | dc2292e6-4056-46e0-8848-d6e96df1f55d | None | 2017b481-706f-44e1-852a-2ee857c303c4 | | c7eadcea-e377-4392-9fc3-cf2b02b7ec29 | None | 5f73c7d7-4826-49a5-b6be-8bfd558f3b41 | | da3a8d19-8a59-4e9d-923a-6a336fe10284 | None | cfefaf60-8311-4bc3-9416-6a824a40a9ae | | 807cb6ce-6b94-4cd1-9969-5c47560c2eee | None | c07c13e6-a845-4791-9628-260110829c3a | +--------------------------------------+------+--------------------------------------+
ノードをメンテナンスモードに切り替えます。
[stack@director ~]$ ironic node-set-maintenance da3a8d19-8a59-4e9d-923a-6a336fe10284 true
新規ノードを control プロファイルでタグ付けします。
[stack@director ~]$ ironic node-update 75b25e9a-948d-424a-9b3b-f0ef70a6eacf add properties/capabilities='profile:control,boot_option:local'
削除するノードインデックスを定義する YAML ファイルを作成します (~/templates/remove-controller.yaml)。
parameters:
ControllerRemovalPolicies:
[{'resource_list': ['1']}]
インデックス 0 のノードを置き換える場合には、ノードの置き換えを開始する前に、Heat テンプレートを編集してブートストラップのノードインデックスとノード検証インデックスを変更します。director の Heat テンプレートコレクションのコピーを作成して (「カスタムのコア Heat テンプレートの使用」 を参照)、以下のコマンドを overcloud.yaml ファイルに対して実行します。
$ sudo sed -i "s/resource\.0/resource.1/g" ~/templates/my-overcloud/overcloud.yaml
これにより、以下のリソースのノードインデックスが変更されます。
ControllerBootstrapNodeConfig:
type: OS::TripleO::BootstrapNode::SoftwareConfig
properties:
bootstrap_nodeid: {get_attr: [Controller, resource.0.hostname]}
bootstrap_nodeid_ip: {get_attr: [Controller, resource.0.ip_address]}および
AllNodesValidationConfig:
type: OS::TripleO::AllNodes::Validation
properties:
PingTestIps:
list_join:
- ' '
- - {get_attr: [Controller, resource.0.external_ip_address]}
- {get_attr: [Controller, resource.0.internal_api_ip_address]}
- {get_attr: [Controller, resource.0.storage_ip_address]}
- {get_attr: [Controller, resource.0.storage_mgmt_ip_address]}
- {get_attr: [Controller, resource.0.tenant_ip_address]}
Corosync での settle の試行回数を減らすことによって、置き換えのプロセスをスピードアップすることができます。 環境ファイルの ExtraConfig パラメーターに以下の hieradata を追加します。
parameter_defaults:
ExtraConfig:
pacemaker::corosync::settle_tries: 5
ノードインデックスを特定した後には、オーバークラウドを再デプロイして、remove-controller.yaml 環境ファイルを追加します。
[stack@director ~]$ openstack overcloud deploy --templates --control-scale 3 -e ~/templates/remove-controller.yaml [OTHER OPTIONS]
オーバークラウドの作成時に追加の環境ファイルまたはオプションを渡した場合には、予定外の変更がオーバークラウドに加えられないように、その環境ファイルまたはオプションをここで再度渡してください。
ただし、 -e ~/templates/remove-controller.yaml が必要なのは、この場合には 1 回のみである点に注意してください。
director は古いノードを削除して、新しいノードを作成してから、オーバークラウドスタックを更新します。以下のコマンドを使用すると、オーバークラウドスタックのステータスをチェックすることができます。
[stack@director ~]$ heat stack-list --show-nested
9.4.3. 手動での介入
ControllerNodesPostDeployment の段階中には、オーバークラウドスタックの更新が ControllerLoadBalancerDeployment_Step1 で UPDATE_FAILED エラーにより停止します。これは、一部の Puppet モジュールがノードの置き換えをサポートしてないためです。処理のこの時点で手動による介入が必要です。以下に記載する設定ステップに従ってください。
コントローラーノードの IP アドレスの一覧を取得します。以下に例を示します。
[stack@director ~]$ nova list ... +------------------------+ ... +-------------------------+ ... | 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 | ... +------------------------+ ... +-------------------------+
既存のノードの
/etc/corosync/corosync.confファイルで、削除されたノードのnodeidの値を確認します。たとえば、既存のノードが 192.168.0.47 のovercloud-controller-0の場合には、以下のコマンドを実行します。[stack@director ~]$ ssh heat-admin@192.168.0.47 "sudo cat /etc/corosync/corosync.conf"
このコマンドにより、削除されたノードの ID が含まれる
nodelistが表示されます (overcloud-controller-1)。nodelist { node { ring0_addr: overcloud-controller-0 nodeid: 1 } node { ring0_addr: overcloud-controller-1 nodeid: 2 } node { ring0_addr: overcloud-controller-2 nodeid: 3 } }削除された
nodeidの値は、後で使用するときのために書き留めておいてください。上記の例では、2 がその値です。各ノードの Corosync 設定から障害の発生したノードを削除して、Corosync を再起動します。この例では、
overcloud-controller-0とovercloud-controller-2にログインして以下のコマンドを実行します。[stack@director] ssh heat-admin@192.168.0.47 "sudo pcs cluster localnode remove overcloud-controller-1" [stack@director] ssh heat-admin@192.168.0.47 "sudo pcs cluster reload corosync" [stack@director] ssh heat-admin@192.168.0.46 "sudo pcs cluster localnode remove overcloud-controller-1" [stack@director] ssh heat-admin@192.168.0.46 "sudo pcs cluster reload corosync"
残りのノードの中の 1 台にログインして、
crm_nodeコマンドで対象のノードをクラスターから削除します。[stack@director] ssh heat-admin@192.168.0.47 [heat-admin@overcloud-controller-0 ~]$ sudo crm_node -R overcloud-controller-1 --force
このノードにログインした状態を維持します。
障害が発生したノードを RabbitMQ クラスターから削除します。
[heat-admin@overcloud-controller-0 ~]$ sudo rabbitmqctl forget_cluster_node rabbit@overcloud-controller-1
障害が発生したノードを MongoDB から削除します。ノードの内部 API 接続のための IP アドレスを特定します。
[heat-admin@overcloud-controller-0 ~]$ sudo netstat -tulnp | grep 27017 tcp 0 0 192.168.0.47:27017 0.0.0.0:* LISTEN 13415/mongod
ノードが
primaryレプリカセットであることを確認します。[root@overcloud-controller-0 ~]# echo "db.isMaster()" | mongo --host 192.168.0.47:27017 MongoDB shell version: 2.6.11 connecting to: 192.168.0.47:27017/echo { "setName" : "tripleo", "setVersion" : 1, "ismaster" : true, "secondary" : false, "hosts" : [ "192.168.0.47:27017", "192.168.0.46:27017", "192.168.0.45:27017" ], "primary" : "192.168.0.47:27017", "me" : "192.168.0.47:27017", "electionId" : ObjectId("575919933ea8637676159d28"), "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 1000, "localTime" : ISODate("2016-06-09T09:02:43.340Z"), "maxWireVersion" : 2, "minWireVersion" : 0, "ok" : 1 } byeこれで、現在のノードがプライマリーかどうかが表示されるはずです。そうでない場合には、
primaryキーに示されているノードの IP アドレスを使用します。プライマリーノードで MongoDB に接続します。
[heat-admin@overcloud-controller-0 ~]$ mongo --host 192.168.0.47 MongoDB shell version: 2.6.9 connecting to: 192.168.0.47:27017/test Welcome to the MongoDB shell. For interactive help, type "help". For more comprehensive documentation, see http://docs.mongodb.org/ Questions? Try the support group http://groups.google.com/group/mongodb-user tripleo:PRIMARY>
MongoDB クラスターのステータスを確認します。
tripleo:PRIMARY> rs.status()
_idキーを使用してノードを特定し、nameキーを使用して障害の発生したノードを削除します。この場合にはnameに192.168.0.45:27017を指定して Node 1 を削除します。tripleo:PRIMARY> rs.remove('192.168.0.45:27017')重要PRIMARYレプリカセットに対してコマンドを実行する必要があります。"replSetReconfig command must be sent to the current replica set primary."
上記のメッセージが表示された場合には、
PRIMARYに指定されているノード上の MongoDB に再ログインします。注記障害の発生したノードのレプリカセットを削除する際には、通常以下のような出力が表示されます。
2016-05-07T03:57:19.541+0000 DBClientCursor::init call() failed 2016-05-07T03:57:19.543+0000 Error: error doing query: failed at src/mongo/shell/query.js:81 2016-05-07T03:57:19.545+0000 trying reconnect to 192.168.0.47:27017 (192.168.0.47) failed 2016-05-07T03:57:19.547+0000 reconnect 192.168.0.47:27017 (192.168.0.47) ok
MongoDB を終了します。
tripleo:PRIMARY> exit
Galera クラスター内のノードの一覧を更新します。
[heat-admin@overcloud-controller-0 ~]$ sudo pcs resource update galera wsrep_cluster_address=gcomm://overcloud-controller-0,overcloud-controller-3,overcloud-controller-2
-
新規ノードに対して Galera クラスターのチェックが行われるように設定します。既存のノードから新規ノードの同じ場所に
/etc/sysconfig/clustercheckをコピーします。 -
rootユーザーが新規ノードの Gelera にアクセスできるように設定します。既存のノードから新規ノードの同じ場所に/root/.my.cnfをコピーします。 新規ノードをクラスターに追加します。
[heat-admin@overcloud-controller-0 ~]$ sudo pcs cluster node add overcloud-controller-3
各ノードで
/etc/corosync/corosync.confファイルをチェックします。新規ノードのnodeidが削除したノードと同じ場合には、その値を nodeid 値に更新します。たとえば、/etc/corosync/corosync.confファイルに新規ノード (overcloud-controller-3) のエントリーが記載されています。nodelist { node { ring0_addr: overcloud-controller-0 nodeid: 1 } node { ring0_addr: overcloud-controller-2 nodeid: 3 } node { ring0_addr: overcloud-controller-3 nodeid: 2 } }上記の例では、新規ノードが削除されたノードと同じ
nodeidを使用している点に注意してください。この値を、使用していないノードの ID 値に更新します。以下に例を示します。node { ring0_addr: overcloud-controller-3 nodeid: 4 }新規ノードを含む各コントローラーノードの
/etc/corosync/corosync.confファイルでnodeidの値を更新します。既存のノードのみで Corosync サービスを再起動します。たとえば、
overcloud-controller-0で以下のコマンドを実行します。[heat-admin@overcloud-controller-0 ~]$ sudo pcs cluster reload corosync
overcloud-controller-2で以下のコマンドを実行します。[heat-admin@overcloud-controller-2 ~]$ sudo pcs cluster reload corosync
このコマンドは、新規ノードでは実行しないでください。
新規コントローラーノードを起動します。
[heat-admin@overcloud-controller-0 ~]$ sudo pcs cluster start overcloud-controller-3
新規ノード上で Keystone サービスを有効にします。残りのノードから director ホストに
/etc/keystoneディレクトリーをコピーします。[heat-admin@overcloud-controller-0 ~]$ sudo -i [root@overcloud-controller-0 ~]$ scp -r /etc/keystone stack@192.168.0.1:~/.
新規コントローラーノードにログインします。新規コントローラーノードから
/etc/keystoneディレクトリーを削除して、director ホストからkeystoneファイルをコピーします。[heat-admin@overcloud-controller-3 ~]$ sudo -i [root@overcloud-controller-3 ~]$ rm -rf /etc/keystone [root@overcloud-controller-3 ~]$ scp -r stack@192.168.0.1:~/keystone /etc/. [root@overcloud-controller-3 ~]$ chown -R keystone: /etc/keystone [root@overcloud-controller-3 ~]$ chown root /etc/keystone/logging.conf /etc/keystone/default_catalog.templates
/etc/keystone/keystone.confを編集してadmin_bind_hostおよびpublic_bind_hostのパラメーターを新規コントローラーノードの IP アドレスに設定します。これらの IP アドレスを確認するには、ip addrコマンドを使用して、以下のネットワーク内の IP アドレスを見つけます。-
admin_bind_host: プロビジョニングネットワーク -
public_bind_host: 内部 API ネットワーク
注記カスタムの
ServiceNetMapパラメーターを使用してオーバークラウドをデプロイした場合には、これらのネットワークは異なる場合があります。たとえば、プロビジョニングネットワークが
192.168.0.0/24サブネットを使用して、内部 API が172.17.0.0/24サブネットを使用している場合には、以下のコマンドを使用して、それらのネットワーク上のノードの IP アドレスを特定します。[root@overcloud-controller-3 ~]$ ip addr | grep "192\.168\.0\..*/24" [root@overcloud-controller-3 ~]$ ip addr | grep "172\.17\.0\..*/24"
-
Pacemaker を使用して、いくつかのサービスを有効化および再起動します。クラスターは現在メンテナンスモードに設定されていますが、サービスを有効化するには、このモードを一時的に無効にする必要があります。以下に例を示します。
[heat-admin@overcloud-controller-3 ~]$ sudo pcs property set maintenance-mode=false --wait
全ノードで Galera サービスが起動するのを待ちます。
[heat-admin@overcloud-controller-3 ~]$ sudo pcs status | grep galera -A1 Master/Slave Set: galera-master [galera] Masters: [ overcloud-controller-0 overcloud-controller-2 overcloud-controller-3 ]
必要な場合には、新規ノードで
cleanupを実行します。[heat-admin@overcloud-controller-3 ~]$ sudo pcs resource cleanup galera --node overcloud-controller-3
全ノードで
httpdサービスが起動するまで待ちます。[heat-admin@overcloud-controller-3 ~]$ sudo pcs status | grep httpd -A1 Clone Set: httpd-clone [httpd] Started: [ overcloud-controller-0 overcloud-controller-2 overcloud-controller-3 ]
必要な場合には、新規ノードで
cleanupを実行します。[heat-admin@overcloud-controller-3 ~]$ sudo pcs resource cleanup httpd --node overcloud-controller-3
クラスターをメンテナンスモードに再度切り替えます。
[heat-admin@overcloud-controller-3 ~]$ sudo pcs property set maintenance-mode=true --wait
手動の設定が完了しました。オーバークラウドのコマンドを再度実行して、スタックの更新を継続します。
[stack@director ~]$ openstack overcloud deploy --templates --control-scale 3 [OTHER OPTIONS]
オーバークラウドの作成時に追加の環境ファイルまたはオプションを渡した場合には、予定外の変更がオーバークラウドに加えられないように、その環境ファイルまたはオプションをここで再度渡してください。ただし、remove-controller.yaml ファイルは必要なくなった点に注意してください。
9.4.4. オーバークラウドサービスの最終処理
オーバークラウドのスタックの更新が完了したら、最終の設定が必要です。コントローラーノードの 1 つにログインして、Pacemaker で停止されているサービスを更新します。
[heat-admin@overcloud-controller-0 ~]$ for i in `sudo pcs status|grep -B2 Stop |grep -v "Stop\|Start"|awk -F"[" '/\[/ {print substr($NF,0,length($NF)-1)}'`; do echo $i; sudo pcs resource cleanup $i; done最終のステータスチェックを実行して、サービスが正しく実行されていることを確認します。
[heat-admin@overcloud-controller-0 ~]$ sudo pcs status
エラーが発生したサービスがある場合には、pcs resource cleanup コマンドを使用して、問題の解決後にそのサービスを再起動します。
director を終了します。
[heat-admin@overcloud-controller-0 ~]$ exit
9.4.5. L3 エージェントのルーターホスティングの最終処理
オーバークラウドと対話できるようにするために、source コマンドで overcloudrc ファイルを読み込みます。ルーターをチェックして、L3 エージェントがオーバークラウド環境内のルーターを適切にホストしていることを確認します。以下の例では、r1 という名前のルーターを使用します。
[stack@director ~]$ source ~/overcloudrc [stack@director ~]$ neutron l3-agent-list-hosting-router r1
このリストには、新しいノードの代わりに、依然として古いノードが表示される場合があります。これを置き換えるには、環境内の L3 ネットワークエージェントを一覧表示します。
[stack@director ~]$ neutron agent-list | grep "neutron-l3-agent"
新しいノードと古いノード上でエージェントの UUID を特定します。新しいノードのエージェントにルーターを追加し、古いノードからそのルーターを削除します。以下に例を示します。
[stack@director ~]$ neutron l3-agent-router-add fd6b3d6e-7d8c-4e1a-831a-4ec1c9ebb965 r1 [stack@director ~]$ neutron l3-agent-router-remove b40020af-c6dd-4f7a-b426-eba7bac9dbc2 r1
ルーターに対して最終チェックを実行し、すべてがアクティブであることを確認します。
[stack@director ~]$ neutron l3-agent-list-hosting-router r1
古いコントローラーノードをポイントしている既存の Neutron エージェントを削除します。以下に例を示します。
[stack@director ~]$ neutron agent-list -F id -F host | grep overcloud-controller-1 | ddae8e46-3e8e-4a1b-a8b3-c87f13c294eb | overcloud-controller-1.localdomain | [stack@director ~]$ neutron agent-delete ddae8e46-3e8e-4a1b-a8b3-c87f13c294eb
9.4.6. Compute サービスの最終処理
削除されたノードの Compute サービスはオーバークラウドにまだ存在しているので、削除する必要があります。source コマンドで overcloudrc ファイルを読み込み、オーバークラウドと対話できるようにします。削除したノードの Compute サービスをチェックします。
[stack@director ~]$ source ~/overcloudrc [stack@director ~]$ nova service-list | grep "overcloud-controller-1.localdomain"
ノードの Compute サービスを削除します。たとえば、overcloud-controller-1.localdomain の nova-scheduler サービスの ID が 5 の場合には、以下のコマンドを実行します。
[stack@director ~]$ nova service-delete 5
削除したノードの各サービスでこのタスクを実行します。
新しいノードで openstack-nova-consoleauth サービスをチェックします。
[stack@director ~]$ nova service-list | grep consoleauth
サービスが実行していない場合には、コントローラーノードにログインしてサービスを再起動します。
[stack@director] ssh heat-admin@192.168.0.47 [heat-admin@overcloud-controller-0 ~]$ pcs resource restart openstack-nova-consoleauth
9.4.7. 結果
障害が発生したコントローラーノードと、関連サービスが新しいノードに置き換えられました。
「Object Storage ノードの置き換え」 のように Object Storage でリングファイルの自動構築を無効にした場合には、新規ノード用に Object Storage リングファイルを手動で構築する必要があります。リングファイルの手動構築についての詳しい情報は、「Object Storage ノードの置き換え」を参照してください。
9.5. Ceph Storage ノードの置き換え
director では、director で作成したクラスター内の Ceph Storage ノードを置き換えることができます。手順については、『オーバークラウド向けの Red Hat Ceph Storage』を参照してください。
9.6. Object Storage ノードの置き換え
Object Storage クラスターのノードを置き換えるには、以下を行う必要があります。
- 新規 Object Storage ノードでオーバークラウドを更新して、director によりリングファイルが作成されないようにします。
-
swift-ring-builderを使用して手動でクラスターにノードを追加するか、クラスターからノードを削除します。
以下の手順では、クラスターの整合性を保ちながらノードを置き換える方法を説明します。この例では、ノードが 2 つある Object Storage クラスターを使用します。目的は、別のノードを追加して、問題のあるノードを置き換えることです。
まず、以下の内容が含まれる ~/templates/swift-ring-prevent.yaml という名前の環境ファイルを作成します。
parameter_defaults: SwiftRingBuild: false RingBuild: false ObjectStorageCount: 3
SwiftRingBuild および RingBuild パラメーターにより、オーバークラウドが自動的に Object Storage とコントローラーノードそれぞれのリングファイルを構築するかどうかが定義されます。ObjectStorageCount は、環境内で Object Storage ノードをいくつ指定するかを定義します。今回の例では、ノードを 2 つから 3 つにスケーリングします。
swift-ring-prevent.yaml の一部として、オーバークラウドの残りの環境ファイルと合わせて、openstack overcloud deploy ファイルも追加します。
$ openstack overcloud deploy --templates [ENVIRONMENT_FILES] -e swift-ring-prevent.yaml
このファイルのパラメーターが以前の環境ファイルのパラメーターよりも優先されるように、このファイルを環境ファイルの一覧の最後に追加します。
再デプロイメントが完了したら、オーバークラウドには追加の Object Storage が含まれるようになりますが、ノードのストレージディレクトリーは作成されておらず、ノードのオブジェクトストアのリングファイルもまだ構築されていません。そのため、手動でストレージのディレクトリーを作成して、リングファイルを構築する必要があります。
以下の手順を使用して、コントローラーノードでのリングファイル構築も行なってください。
新規ノードにログインしてストレージのディレクトリーを作成します。
$ sudo mkdir -p /srv/node/d1 $ sudo chown -R swift:swift /srv/node/d1
このディレクトリーで、外部のストレージデバイスをマウントすることもできます。
ノードに既存のリングファイルをコピーします。heat-admin ユーザーとして、コントローラーノードにログインしてから、スーパーユーザーに切り替えます。たとえば、IP アドレスが 192.168.201.24 のコントローラーノードの場合は以下のようになります。
$ ssh heat-admin@192.168.201.24 $ sudo -i
コントローラーノードからの /etc/swift/*.builder ファイルを新しい Object Storage ノードの /etc/swift/ ディレクトリーにコピーします。必要に応じて、ファイルを director ホストに移動します。
[root@overcloud-controller-0 ~]# scp /etc/swift/*.builder stack@192.1.2.1:~/.
次に、新規ノードにファイルを転送します。
[stack@director ~]$ scp ~/*.builder heat-admin@192.1.2.24:~/.
新しい Object Storage ノードに heat-admin ユーザーとしてログインして、スーパーユーザーに切り替えます。たとえば、IP アドレスが 192.168.201.29 の Object Storage ノードの場合は以下のようになります。
$ ssh heat-admin@192.168.201.29 $ sudo -i
これらのファイルを /etc/swift ディレクトリーにコピーします。
# cp /home/heat-admin/*.builder /etc/swift/.
新規の Object Storage ノードをアカウント、コンテナー、オブジェクトリングに追加します。新規ノードに以下のコマンドを実行します。
# swift-ring-builder /etc/swift/account.builder add zX-IP:6002/d1 weight # swift-ring-builder /etc/swift/container.builder add zX-IP:6001/d1 weight # swift-ring-builder /etc/swift/object.builder add zX-IP:6000/d1 weight
これらのコマンドでは、以下の値を置き換えてください。
- zX
- X は、指定のゾーンに適した整数に置き換えます (例: ゾーン 1 には z1)。
- IP
-
アカウント、コンテナー、オブジェクトサービスがリッスンするのに使用する IP。これは、特に、
/etc/swift/object-server.confと/etc/swift/account-server.conf、/etc/swift/container-server.confのDEFAULTセクションのbind_ipなど、各ストレージノードの IP アドレスと同じでなければなりません。 - 重み
- 他のデバイスと比較したデバイスの相対的な重み付けを入力します。通常、これは 100 となっています。
リングファイル上で swift-ring-builder を使用して、リングファイルにある現在のノードの既存値を確認します。
# swift-ring-builder /etc/swift/account.builder
アカウント、コンテナー、オブジェクトリングから置き換えるノードを削除します。各ノードに対して、以下のコマンドを実行します。
# swift-ring-builder /etc/swift/account.builder remove IP # swift-ring-builder /etc/swift/container.builder remove IP # swift-ring-builder /etc/swift/object.builder remove IP
IP はノードの IP アドレスに置き換えます。
すべてのノードをまたいでパーティションの再配分を行います。
# swift-ring-builder /etc/swift/account.builder rebalance # swift-ring-builder /etc/swift/container.builder rebalance # swift-ring-builder /etc/swift/object.builder rebalance
/etc/swift/ の全コンテンツの所有者を root ユーザーと swift グループに変更します。
# chown -R root:swift /etc/swift
openstack-swift-proxy サービスを再起動します。
# systemctl restart openstack-swift-proxy.service
この時点で、リングファイル (*.ring.gz および *.builder) は、新しいノード上で更新されているはずです。
/etc/swift/account.builder /etc/swift/account.ring.gz /etc/swift/container.builder /etc/swift/container.ring.gz /etc/swift/object.builder /etc/swift/object.ring.gz
これらのファイルは、コントローラーノードと既存の Object Storage ノード上の /etc/swift/ にコピーします (削除するノードは除く)。必要に応じて、ファイルを director ホストに移動します。
[root@overcloud-objectstorage-2 swift]# scp *.builder stack@192.1.2.1:~/ [root@overcloud-objectstorage-2 swift]# scp *.ring.gz stack@192.1.2.1:~/
次に各ノードで /etc/swift/ にこのファイルをコピーします。
各ノードで、/etc/swift/ の内容すべての所有者を root ユーザーと swift グループに変更します。
# chown -R root:swift /etc/swift
新規ノードが追加され、リングファイルの一部になります。リングから以前のノードを削除する前に、他のノードから新規ノードの初期のデータを複製する必要があります。
リングから以前のノードを削除するには、ObjectStorageCount の数を減らして以前のリングを省略します。今回は 3 から 2 に減らします。
parameter_defaults: SwiftRingBuild: false RingBuild: false ObjectStorageCount: 2
新規環境ファイル (remove-object-node.yaml) を作成して、以前の Object Storage ノードを特定し、削除します。今回の場合は overcloud-objectstorage-1 を削除します。
parameter_defaults:
ObjectStorageRemovalPolicies:
[{'resource_list': ['1']}]デプロイメントのコマンドで両環境ファイルを指定します。
$ openstack overcloud deploy --templates -e swift-ring-prevent.yaml -e remove-object-node.yaml ...
director は、オーバークラウドから Object Storage ノードを削除して、オーバークラウド上の残りのノードを更新し、ノードの削除に対応します。

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.