OpenStackサーバー更改時のトラブル対応(computeノード編)

カバー

はじめに

私たちのチームでは、OpenStackを活用して利用者に仮想環境を提供しています。OpenStackは、オープンソースソフトウェア(OSS)のクラウドコンピューティングプラットフォームです。仮想環境上でのマシン、ストレージ、ネットワークなどのリソースを統合管理できるインフラストラクチャを提供します。私たちはこのOpenStackをオンプレミス環境で数年前に導入しました。しかし、当時購入したサーバーの保守期限が近づいていたため、これを機にサーバーの更改作業を進めることになりました。この記事では、その過程で発生したcomputeノードのトラブルと対応内容について紹介します。

サーバー更改の概要

既存OpenStack環境

構築当初のOpenStackのバージョンはMitakaでしたが、数年前にバージョンアップを行い現在はQueensを使用しています。ノードの構成は以下のとおりです。

No.ノード台数OS更改する台数
1controller2CentOS 7.5.18042
2network2CentOS 7.5.18042
3compute8CentOS 7.5.18044
4block4CentOS 7.5.18043
5object3CentOS 7.5.18043

OS選定と更改方針

OSは「Ubuntu」を採用しました。選定理由は以下のとおりです。

候補採否の理由
UbuntuOpenStack公式でサポートが明記されており、各バージョンにLTS(Long-Term Support)があるため
CentOS Stream安定版の先行確認環境の位置付けであり、運用上の安定性に懸念があるため
Rocky Linux
AlmaLinux
CentOSの後継として利用されているが、OpenStack公式ではサポートが明記されていないため

UbuntuのバージョンはUbuntu 18.04 LTSを採用しました。Ubuntu 18.04 LTSのサポート期限は2023年5月であり、本来であればUbuntu 20.04 LTS以上を採用すべきです。しかし、QueensはUbuntu 20.04 LTSに対応しておらず、Ubuntu 20.04 LTSを使用するためには、OpenStackをQueensからUssuriまで4段階もバージョンアップする必要があります。このOSおよびOpenStackのバージョンアップとサーバー更改を同時に行うことは極めて困難であったため、まずはUbuntu 18.04 LTSでサーバー更改を行い、その後、OSおよびOpenStackのバージョンアップを行う方針としました。サーバー更改後の構成は以下のとおりです。

No.ノード台数OS更改対象
1controller2Ubuntu 18.04.6 LTS
2network2Ubuntu 18.04.6 LTS
3compute4CentOS 7.5.1804
4compute4Ubuntu 18.04.6 LTS
5block1CentOS 7.5.1804
6block3Ubuntu 18.04.6 LTS
7object3Ubuntu 18.04.6 LTS

更改方法

構築当初の手順書とOpenStack公式の手順を参考に、新computeノードをOpenStackに1台追加します。その後、旧computeノード上のインスタンスを移行し、旧computeノードをOpenStackから削除します。この手順を繰り返して作業を進めます。

移行方法

移行対象インスタンス

旧computeノードから新computeノードへ移行するインスタンスは以下のとおりです。

インスタンス種類

※1:OpenStackが提供するデータベースサービスです。データベースのデプロイ、管理、スケーリングを簡単に実行できる仕組みを提供します。詳細についてはOpenStack公式を参照してください。
※2:OpenStackが提供する共有ファイルシステムサービスです。仮想マシンやアプリケーションが利用可能な共有ファイルシステムの作成、管理をサポートします。詳細についてはOpenStack公式を参照してください。

移行方法

インスタンスの数が多いため、openstackコマンドを用いたスクリプトを作成し、移行作業を自動化します。このスクリプトは、利用者へのサービス影響を最小限に抑えるために、atコマンドを使用し、夜間に実行します。

【スクリプトの処理内容】

  1. インスタンスの状態を確認します。
  2. インスタンスの状態が起動状態の場合、インスタンスを停止状態にします。
  3. 指定したcomputeノードにインスタンスを移行します。
  4. 上記1~3の処理を全インスタンスについて繰り返します。

スクリプトで使用するopenstackコマンドは以下のとおりです。

openstackコマンド用途
openstack server show <インスタンスID>指定したインスタンスの状態を確認する
openstack server stop <インスタンスID>指定したインスタンスを停止状態にする
openstack server migrate --live <新computeノード名> <インスタンスID>指定したcomputeノードにインスタンスを移行する

トラブルシューティング

新computeノードでインスタンスが作成できない(設定不足)

新computeノードにOpenStackのパッケージをインストールし、必要なコンフィグファイルを設定した後、Novaコンポーネントのサービスを起動しました。次に、openstack compute service listコマンドを実行したところ、新computeノードのNovaサービスが正常に表示されました。しかし、新computeノード上でインスタンスの作成を試みたところエラーが発生し、computeノードが正常に動作していない状況であることが判明しました。/var/log/nova-compute.logを確認したところ、以下のようなエラーメッセージが出力されていました。

ERROR nova.compute.manager [req-35424485-5aae-434e-87fc-7b3472b4bd21 - - - - -] Error updating resources for node compute201dev.: OSError: [Errno 2] No such file or directory: '/usr/lib/python2.7/dist-packages/instances'
ERROR nova.compute.manager Traceback (most recent call last):
ERROR nova.compute.manager File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 7579, in update_available_resource_for_node
ERROR nova.compute.manager rt.update_available_resource(context, nodename)
ERROR nova.compute.manager File "/usr/lib/python2.7/dist-packages/nova/compute/resource_tracker.py", line 704, in update_available_resource
ERROR nova.compute.manager resources = self.driver.get_available_resource(nodename)
ERROR nova.compute.manager File "/usr/lib/python2.7/dist-packages/nova/virt/libvirt/driver.py", line 6475, in get_available_resource
ERROR nova.compute.manager disk_info_dict = self._get_local_gb_info()
ERROR nova.compute.manager File "/usr/lib/python2.7/dist-packages/nova/virt/libvirt/driver.py", line 5744, in _get_local_gb_info
ERROR nova.compute.manager info = libvirt_utils.get_fs_info(CONF.instances_path)
ERROR nova.compute.manager File "/usr/lib/python2.7/dist-packages/nova/virt/libvirt/utils.py", line 370, in get_fs_info
ERROR nova.compute.manager hddinfo = os.statvfs(path)
ERROR nova.compute.manager OSError: [Errno 2] No such file or directory: '/usr/lib/python2.7/dist-packages/instances'

/etc/nova/nova.confを確認したところ、instances_pathが設定されていなかったため、この設定を追加しました。その後、再度インスタンスの作成を試みたところ、上記のエラーメッセージは出力されなくなりましたが、インスタンスの作成には依然として失敗しました。さらなる調査の結果、openstack hypervisor listコマンドを実行すると、新computeノードが一覧に表示されておらず、何らかの設定が不足していることが判明しました。この問題についてOpenStack公式(Queensバージョン)を確認したところ、「Add the compute node to the cell database」という項目がありました。この項目の作業に必要な以下のコマンドを実行していなかったことがわかりました。

# su -s /bin/bash -c "nova-manage cell_v2 discover_hosts" nova

原因は、この機能はNewtonリリースで導入されたもので、サーバー更改の手順検討時に参照したMitaka構築時の手順にはこのコマンドが記載されていなかったことにありました。このコマンドは、実行中のcomputeノードを発見し、それらをNovaの管理データベースに登録するための操作を行います。このコマンドを実行することで、openstack hypervisor listコマンドで新computeノードが一覧に表示されるようになりました。

新computeノードでインスタンスが作成できない(CPUモデルの未サポート)

新computeノードでインスタンスを作成しようとしましたが、以下のエラーが発生し、作成に失敗しました。

Instance failed to spawn: libvirtError: internal error: process exited while connecting to monitor:yyyy-MM-ddTHH:mm:SS.ssssssZ qemu-system-x86_64: CPU feature avx512dq not found

エラーメッセージに記載されている「avx512dq」について調査した結果、これは第3世代Intel Xeon(開発コード名:Ice Lake)で追加された命令セット拡張であることがわかりました。そこで、新旧computeノードのCPUを確認したところ、新computeノードのCPUはIce Lakeを搭載しており、一方で旧computeノードのCPUは第1世代Intel Xeon(開発コード名:Skylake)を搭載していることが判明しました。さらに、libvirt関連のエラーが発生していることから、新旧computeノードにおけるlibvirtdおよびQEMUのバージョンも確認しました。その結果、新computeノードのQEMUバージョンが旧computeノードに比べて古い状態であることが判明しました。

旧computeノード新computeノード
libvirtd3.9.04.0.0
QEMU2.9.02.5.0

そこで、QEMUがサポートしているCPUモデルやオプションを確認するため、新computeノードでqemu-system-x86_64 -cpu helpコマンドを実行しました。その結果、新computeノードのQEMUではIce LakeのCPUモデルがサポートされておらず、オプションにも「avx512dq」が含まれていないことが確認できました。

# qemu-system-x86_64 -cpu help
x86 qemu64 QEMU Virtual CPU version 2.5+
x86 phenom AMD Phenom(tm) 9550 Quad-Core Processor
x86 core2duo Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz
x86 kvm64 Common KVM processor
x86 qemu32 QEMU Virtual CPU version 2.5+
x86 kvm32 Common 32-bit KVM processor
x86 coreduo Genuine Intel(R) CPU T2600 @ 2.16GHz
x86 486
x86 pentium
x86 pentium2
x86 pentium3
x86 athlon QEMU Virtual CPU version 2.5+
x86 n270 Intel(R) Atom(TM) CPU N270 @ 1.60GHz
x86 Conroe Intel Celeron_4x0 (Conroe/Merom Class Core 2)
x86 Penryn Intel Core 2 Duo P9xxx (Penryn Class Core 2)
x86 Nehalem Intel Core i7 9xx (Nehalem Class Core i7)
x86 Nehalem-IBRS Intel Core i7 9xx (Nehalem Core i7, IBRS update)
x86 Westmere Westmere E56xx/L56xx/X56xx (Nehalem-C)
x86 Westmere-IBRS Westmere E56xx/L56xx/X56xx (IBRS update)
x86 SandyBridge Intel Xeon E312xx (Sandy Bridge)
x86 SandyBridge-IBRS Intel Xeon E312xx (Sandy Bridge, IBRS update)
x86 IvyBridge Intel Xeon E3-12xx v2 (Ivy Bridge)
x86 IvyBridge-IBRS Intel Xeon E3-12xx v2 (Ivy Bridge, IBRS)
x86 Haswell-noTSX Intel Core Processor (Haswell, no TSX)
x86 Haswell-noTSX-IBRS Intel Core Processor (Haswell, no TSX, IBRS)
x86 Haswell Intel Core Processor (Haswell)
x86 Haswell-IBRS Intel Core Processor (Haswell, IBRS)
x86 Broadwell-noTSX Intel Core Processor (Broadwell, no TSX)
x86 Broadwell-noTSX-IBRS Intel Core Processor (Broadwell, no TSX, IBRS)
x86 Broadwell Intel Core Processor (Broadwell)
x86 Broadwell-IBRS Intel Core Processor (Broadwell, IBRS)
x86 Opteron_G1 AMD Opteron 240 (Gen 1 Class Opteron)
x86 Opteron_G2 AMD Opteron 22xx (Gen 2 Class Opteron)
x86 Opteron_G3 AMD Opteron 23xx (Gen 3 Class Opteron)
x86 Opteron_G4 AMD Opteron 62xx class CPU
x86 Opteron_G5 AMD Opteron 63xx class CPU
x86 host KVM processor with all supported host features (only available in KVM mode)
Recognized CPUID flags:
fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 pn clflush ds acpi mmx fxsr sse sse2 ss ht tm ia64 pbe
pni|sse3 pclmulqdq|pclmuldq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cid fma cx16 xtpr pdcm pcid dca sse4.1|sse4_1 sse4.2|sse4_2 x2apic movbe popcnt tsc-deadline aes xsave osxsave avx f16c rdrand hypervisor
fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx avx512f rdseed adx smap pcommit clflushopt clwb avx512pf avx512er avx512cd
md-clear spec-ctrl ssbd
syscall nx|xd mmxext fxsr_opt|ffxsr pdpe1gb rdtscp lm|i64 3dnowext 3dnow
lahf_lm cmp_legacy svm extapic cr8legacy abm sse4a misalignsse 3dnowprefetch osvw ibs xop skinit wdt lwp fma4 tce nodeid_msr tbm topoext perfctr_core perfctr_nb
invtsc
ibpb virt-ssbd
xstore xstore-en xcrypt xcrypt-en ace2 ace2-en phe phe-en pmm pmm-en
kvmclock kvm_nopiodelay kvm_mmu kvmclock kvm_asyncpf kvm_steal_time kvm_pv_eoi kvm_pv_unhalt kvmclock-stable-bit
npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pause_filter pfthreshold
xsaveopt xsavec xgetbv1 xsaves
arat

以上の調査結果を踏まえ、CPUモデルにIce Lakeをサポートし、「avx512dq」オプションを含むQEMUバージョンにすれば、インスタンスを起動できると考えました。この仮説に基づき、QEMUのバージョンを順番に更新したところ、バージョン「2.11.1」で期待通りの結果が得られました。

# qemu-system-x86_64 -cpu help
Available CPUs:
x86 486
x86 Broadwell-IBRS Intel Core Processor (Broadwell, IBRS)
x86 Broadwell-noTSX-IBRS Intel Core Processor (Broadwell, no TSX, IBRS)
x86 Broadwell-noTSX Intel Core Processor (Broadwell, no TSX)
x86 Broadwell Intel Core Processor (Broadwell)
x86 Cascadelake-Server Intel Xeon Processor (Cascadelake)
x86 Conroe Intel Celeron_4x0 (Conroe/Merom Class Core 2)
x86 EPYC-IBPB AMD EPYC Processor (with IBPB)
x86 EPYC AMD EPYC Processor
x86 Haswell-IBRS Intel Core Processor (Haswell, IBRS)
x86 Haswell-noTSX-IBRS Intel Core Processor (Haswell, no TSX, IBRS)
x86 Haswell-noTSX Intel Core Processor (Haswell, no TSX)
x86 Haswell Intel Core Processor (Haswell)
x86 Icelake-Client Intel Core Processor (Icelake)
x86 Icelake-Server Intel Xeon Processor (Icelake)
x86 IvyBridge-IBRS Intel Xeon E3-12xx v2 (Ivy Bridge, IBRS)
x86 IvyBridge Intel Xeon E3-12xx v2 (Ivy Bridge)
x86 Nehalem-IBRS Intel Core i7 9xx (Nehalem Core i7, IBRS update)
x86 Nehalem Intel Core i7 9xx (Nehalem Class Core i7)
x86 Opteron_G1 AMD Opteron 240 (Gen 1 Class Opteron)
x86 Opteron_G2 AMD Opteron 22xx (Gen 2 Class Opteron)
x86 Opteron_G3 AMD Opteron 23xx (Gen 3 Class Opteron)
x86 Opteron_G4 AMD Opteron 62xx class CPU
x86 Opteron_G5 AMD Opteron 63xx class CPU
x86 Penryn Intel Core 2 Duo P9xxx (Penryn Class Core 2)
x86 SandyBridge-IBRS Intel Xeon E312xx (Sandy Bridge, IBRS update)
x86 SandyBridge Intel Xeon E312xx (Sandy Bridge)
x86 Skylake-Client-IBRS Intel Core Processor (Skylake, IBRS)
x86 Skylake-Client Intel Core Processor (Skylake)
x86 Skylake-Server-IBRS Intel Xeon Processor (Skylake, IBRS)
x86 Skylake-Server Intel Xeon Processor (Skylake)
x86 Westmere-IBRS Westmere E56xx/L56xx/X56xx (IBRS update)
x86 Westmere Westmere E56xx/L56xx/X56xx (Nehalem-C)
x86 athlon QEMU Virtual CPU version 2.5+
x86 core2duo Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz
x86 coreduo Genuine Intel(R) CPU T2600 @ 2.16GHz
x86 kvm32 Common 32-bit KVM processor
x86 kvm64 Common KVM processor
x86 n270 Intel(R) Atom(TM) CPU N270 @ 1.60GHz
x86 pentium
x86 pentium2
x86 pentium3
x86 phenom AMD Phenom(tm) 9550 Quad-Core Processor
x86 qemu32 QEMU Virtual CPU version 2.5+
x86 qemu64 QEMU Virtual CPU version 2.5+
x86 base base CPU model type with no features enabled
x86 host KVM processor with all supported host features (only available in KVM mode)
x86 max Enables all features supported by the accelerator in the current host
Recognized CPUID flags:
fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 pn clflush ds acpi mmx fxsr sse sse2 ss ht tm ia64 pbe
pni pclmulqdq dtes64 monitor ds-cpl vmx smx est tm2 ssse3 cid fma cx16 xtpr pdcm pcid dca sse4.1 sse4.2 x2apic movbe popcnt tsc-deadline aes xsave osxsave avx f16c rdrand hypervisor
fsgsbase tsc-adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm avx512dq avx512f mpx rdseed adx smap avx512ifma pcommit clflushopt clwb avx512pf avx512er avx512cd sha-ni avx512bw avx512vl
avx512vbmi umip pku ospke avx512vbmi2 gfni vaes vpclmulqdq avx512vnni avx512bitalg avx512-vpopcntdq la57 rdpid
avx512-4vnniw avx512-4fmaps md-clear spec-ctrl arch-capabilities ssbd
syscall nx mmxext fxsr-opt pdpe1gb rdtscp lm 3dnowext 3dnow
lahf-lm cmp-legacy svm extapic cr8legacy abm sse4a misalignsse 3dnowprefetch osvw ibs xop skinit wdt lwp fma4 tce nodeid-msr tbm topoext perfctr-core perfctr-nb
invtsc
wbnoinvd ibpb amd-ssbd virt-ssbd amd-no-ssb
xstore xstore-en xcrypt xcrypt-en ace2 ace2-en phe phe-en pmm pmm-en
kvmclock kvm-nopiodelay kvm-mmu kvmclock kvm-asyncpf kvm-steal-time kvm-pv-eoi kvm-pv-unhalt kvm-pv-tlb-flush kvmclock-stable-bit
npt lbrv svm-lock nrip-save tsc-scale vmcb-clean flushbyasid decodeassists pause-filter pfthreshold
xsaveopt xsavec xgetbv1 xsaves
arat
rdctl-no ibrs-all rsba skip-l1dfl-vmentry ssb-no mds-no pschange-mc-no taa-no

新computeノードでQEMUのバージョンを「2.11.1」にアップグレードするには、パッケージの依存関係からceph-commonのバージョンを「10.2.11」から「12.2.0」に引き上げる必要がありました。ただし、この処理には一つ懸念がありました。それは、blockノードが管理するCeph※3のバージョン「10.2.11」との互換性です。computeノードのceph-commonはblockノードのCephとの通信を担います。したがって、双方のバージョンが異なる場合、通信のインターフェース部分で互換性問題が発生する可能性がありました。しかし、今回のバージョン引き上げは2バージョンの差に過ぎないため、インターフェースに大きな変更が加わっている可能性は低いと判断しました。この仮説に基づき、試験的にceph-commonを「12.2.0」にアップグレードする対応を実施しました。その結果、インスタンスは正常に作成できました。また、インスタンスに対してボリュームをアタッチして読み書きできることを確認しました。

※3:OSSの分散ストレージソフトウェアです。OpenStackのCinderと連携して高可用性、冗長性、スケーラビリティーを提供します。詳細についてはOpenStack環境でBlockストレージを増設する - 基礎知識編を参照してください。

インスタンスがopenstackコマンドで移行できない

今回の移行は、インスタンスが停止状態で進めることを想定し、openstack server migrateコマンドを使用して移行を試みました。しかし、以下のエラーが発生しました。

# openstack server migrate --live compute1 e395f33f-7bed-44e8-bc45-01081d635aa2
Cannot 'os-migrateLive' instance e395f33f-7bed-44e8-bc45-01081d635aa2 while it is in vm_state stopped (HTTP 409) (Request-ID: req-27788ce6-69c4-4954-884d-3425d34cd2eb)

停止状態では移行できない可能性があるため、休止状態や起動状態に変更して移行を試みましたが、いずれも成功しませんでした。

  • 休止状態の場合
# openstack server migrate --live compute1 707bbb1f-75e3-4285-b718-3ad7ad956da5
Cannot 'os-migrateLive' instance 707bbb1f-75e3-4285-b718-3ad7ad956da5 while it is in vm_state suspended (HTTP 409) (Request-ID: req-b0ddde85-dd7c-4896-97d2-f6c8ca334598)
  • 起動状態の場合
# openstack server migrate --live compute1 707bbb1f-75e3-4285-b718-3ad7ad956da5
compute3 は共有ストレージ上にありません: Shared storage live-migration requires either shared storage or boot-from-volume with no local disks. (HTTP 400) (Request-ID: req-954b3aef-e1f2-4de0-80d2-5f7a426d256a)

エラー内容から推測すると、openstack server migrateコマンドはインスタンスの移行には対応していない可能性があります。この問題を解決するため、別の方法を検討する必要がありました。OpenStackでは、統一されたコマンドラインクライアントであるopenstackコマンドが提供されています。通常、多くの操作がこのコマンドで実行可能ですが、すべての機能がカバーされているわけではありません。OpenStackの各コンポーネントには、それぞれ専用のコマンドラインクライアントが用意されている場合があり、特定の操作にはこれらを利用する必要があります。例えば、computeサービスであるNovaコンポーネントではnovaコマンドが提供されています。そこで、問題解決のためにnovaコマンドを調査しました。nova helpコマンドを実行してコマンド一覧を確認した結果、インスタンス移行に関連するnova migrateコマンドが見つかりました。このコマンドを用いることで、指定したcomputeノードにインスタンスを正常に移行できる可能性が高いと考えました。

手順は以下のとおりです。

  1. nova migrateコマンドを実行します。
# nova migrate --host compute5 --poll e395f33f-7bed-44e8-bc45-01081d635aa2
Server migrating... 100% complete
Finished
  1. インスタンスの状態を確認します。
# openstack server show e395f33f-7bed-44e8-bc45-01081d635aa2
  1. インスタンスの状態がVERIFY_RESIZE(移行成功)であることを確認し、nova resize-confirmコマンド(移行の確定)を実行します。
# nova resize-confirm e395f33f-7bed-44e8-bc45-01081d635aa2

上記の手順を行うことで、問題なくインスタンスを移行することができました。

ただし、インスタンスを移行する際には、ホストアグリゲートの設定に注意が必要です。ホストアグリゲートが設定されているインスタンスをnova migrateコマンドで移行する場合、移行先のcomputeノードがホストアグリゲートの設定に含まれている必要があります。ホストアグリゲートとは、OpenStackの機能の一つで、特定の特性を持つcomputeノードをグループ化する仕組みです。私たちのOpenStack環境では、この機能を活用して、Linux系OSを起動するcomputeノードとWindows OSを起動するcomputeノードをホストアグリゲートで分類しています。例えば、Linux系OSを起動するcomputeノードをホストアグリゲートとして定義し、その設定を持つフレーバーを使用してインスタンスを作成すると、そのインスタンスはLinux系OSを起動するcomputeノード上に作成されます。

旧computeノードのサービスがリサイズ途中の情報が残っていて削除できない

インスタンスの移行が完了した旧computeノード(ノード名:compute4)のnova-computeサービス(サービスID:27)を削除するためopenstack compute service deleteコマンドを実行したところ、以下のメッセージが表示され、サービスの削除が失敗しました。

# openstack compute service delete 27
Failed to delete compute service with ID '27': Unable to delete compute service that has in-progress migrations. Complete the migrations or delete the instances first. (HTTP 409) (Request-ID: req-7752c29a-4e8d-4046-83d3-ff19eada8cd8)
1 of 1 compute services failed to delete.

また、/var/log/nova/nova-api.logを確認すると、以下のエラーメッセージが出力されていました。

There are 1 in-progress migrations involving the host. Migrations (uuid:status): 24fa8417-d350-4278-a802-07a5d78811b0:pre-migrating

移行の状態を詳しく確認するためにnova migration-listコマンドを実行したところ、該当インスタンスの状態がpre-migratingと表示されました。これは、数年前に開始されたインスタンスのcompute2からcompute4への移行処理が、現在も「処理中」の状態であり、移行が完了していないことを示しています。これが原因でnova-computeサービスの削除に失敗しています。

# nova migration-list
+------+--------------------------------------+-------------+------------+----------------+--------------+--------------+---------------+--------------------------------------+------------+------------+----------------------------+----------------------------+-----------+
| Id | UUID | Source Node | Dest Node | Source Compute | Dest Compute | Dest Host | Status | Instance UUID | Old Flavor | New Flavor | Created At | Updated At | Type |
+------+--------------------------------------+-------------+------------+----------------+--------------+--------------+---------------+--------------------------------------+------------+------------+----------------------------+----------------------------+-----------+
| 331 | 82645d5b-7692-43c5-b920-d165472c0ba8 | compute2 | compute4 | compute2 | compute4 | 192.168.1.38 | pre-migrating | 24fa8417-d350-4278-a802-07a5d78811b0 | 185 | 191 | 2018-11-02T07:59:11.000000 | 2019-09-28T01:59:21.000000 | resize |
+------+--------------------------------------+-------------+------------+----------------+--------------+--------------+---------------+--------------------------------------+------------+------------+----------------------------+----------------------------+-----------+

この状態になっている原因は、インスタンスの作成者がOpenStack Dashboardを使用してリサイズ操作を実行した後、リサイズを確定しないままインスタンスを削除したことで、移行処理が途中の状態(pre-migrating)のまま維持され、正常な移行が行えなくなった可能性が高いと考えられます。状態をpre-migrating以外にすればこの問題は解消すると考えられますが、インスタンスがすでに削除されているため、OpenStack Dashboardやコマンドラインクライアントから状態を更新することはできません。そのため、データベースを直接確認し、状態のカラムをfailedに更新しました。

  1. インスタンスの状態を確認します。
> select * from migrations where instance_uuid = '24fa8417-d350-4278-a802-07a5d78811b0'\G
*************************** 1. row ***************************
created_at: 2018-11-02 07:59:11
updated_at: 2019-09-28 01:59:21
deleted_at: NULL
id: 331
source_compute: compute2
dest_compute: compute4
dest_host: 192.168.1.38
status: pre-migrating
instance_uuid: 24fa8417-d350-4278-a802-07a5d78811b0
old_instance_type_id: 185
new_instance_type_id: 191
source_node: compute2
dest_node: compute4
deleted: 0
migration_type: resize
hidden: 0
memory_total: NULL
memory_processed: NULL
memory_remaining: NULL
disk_total: NULL
disk_processed: NULL
disk_remaining: NULL
uuid: 82645d5b-7692-43c5-b920-d165472c0ba8
  1. インスタンスの状態をfailedに更新します。
> update migrations set status='failed' where instance_uuid='24fa8417-d350-4278-a802-07a5d78811b0';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0

この更新により、旧computeノードのnova-computeサービスを削除することができました。

おわりに

本記事では、OpenStackのcomputeノードを更改した際に発生したトラブルへの対応内容を紹介しました。本記事が、OpenStackを運用されている方や、これから導入やサーバ更改を検討される方々のお役に立てば幸いです。今後、blockノードやcontrollerノードなど、他のノードの移行に関するノウハウについても順次紹介していく予定です。


TOP
アルファロゴ 株式会社アルファシステムズは、ITサービス事業を展開しています。このブログでは、技術的な取り組みを紹介しています。X(旧Twitter)で更新通知をしています。