仮想サーバを構築するための基盤メモ 2024/03/28版

VMware/vSphereがあんなことになってしまったので問い合わせが多いのでメモ

2024/03/28 初版作成
2024/12/13 バージョン情報などをアップデート

VMware vSpere

VMware vSphere / ESXi はBrocadeに買収されたことで、アレな感じになって迷走中

Microsoft Hyper-V

Windows Serverにも含まれるHyper-V

Hyper-V Sevrer 2019という仮想基盤だけのやつは無料製品としてあるんだけど、2022版が出ていないまま、Windows Server 2025の時代になり、単品のHyper-V Serverはなくなった模様。

物理サーバ間を稼働中の仮想マシンを移動させることは、Windows Serverのフェイルオーバークラスタリング(MSFC/WSFC)、System Center Virtual Machine Managerを利用することで実現する。(ライブマイグレーションの概要)

Nutanix

VMware vSAN/HCI環境を似たような構成で移行しようとすると、Nutanixになる。(というか、NutanixをまねしたのがvSAN)

vSAN = AOS Storage
ESXi hypervisor=Nutanix Acropolis Hypervisor(AHV)
vCenter Server=Prism

単体AHVに標準でPrism Elementも含まれてて、これだけでもクラスタを組める

Prism Centralは、Prism Elementで作ったクラスタを複数まとめて管理したり、また、仮想マシンをSecure boot対応にする場合の暗号化キー管理などを行える。

RHEV/RHV → RedHat OpenShift Virtualization

RedHat Virtualization / RedHat Enterprise Virtualzation、RHEVというのがあったんだけど、これはRHEV4.4で終了したプロダクトとなる。

RHEV4.4はRHEL 8.xベースの上に構築する。

後継はRedHat OpenShift Virtualizationとなる。

旧ドキュメント: Product Documentation for Red Hat Virtualization 4.4

ドキュメント: OpenShift Container PlatformAbout OpenShift Virtualization

Proxmox VE

Proxmox Virtual Environment は最初はRHEL or Debianベースでコンテナを動かすやつだったものが、時代の流れでDebianベースのKVM/qemu仮想マシンとlxcコンテナを動かすやつに変わっていったもの

長く続くプロダクトなので、一通り使える Web GUIが備わっているし、複数物理サーバの一括管理物理サーバ間の仮想マシン移動(Online Migration)HA機能があるが、Webでは設定できずコマンド実行が必要な機能は多い。

debian 12ベースの上に構築されている。

一般向けドキュメント: Proxmox VE Documentation Index
旧来からの資料サイト: PVE wiki

Oracle OLVM

Oracle VM Server for x86 というのがあったんだけどOracle VM 3で終了になった。

後継として、Oracle LinuxのKVMベースで構築して、管理UIとして Oracle Linux Virtualization Manager を提供する、という形に変わっている。

oVirtを利用していて、そもそもRedHatVirtualization 4.xのOracle版がOLVM 4.xとなる

RedHatが4.4で提供をやめたので今後どうなるかなぁ、と思っていたら、OLVMの方は4.5を出してOracle Linux 9.x環境でも構築できるようになったので一安心

Oracle Linux 8.x, 9.x ベースで構築

oVirt

RHV/RHEV/OLVMで利用している元の技術 oVirt

RHVは4.4.xで止まっているが、oVirtの方は4.5.xが出ていて、Oracleから2024/7にOLVMも4.5が出た。

oVirt 4.5.4からはRHEL9.xベースで構築することが可能になった。

ドキュメント: oVirt documentation

Citrix Hypervisor(XenServer)

Linux KVMより歴史が古い仮想化技術 Xen を使用したもの。

2024/03/25にXenServer 8が出たばかり

vCenterに相当するものはXenCenterとなっている。

XCP-ng / Vates

XenServerのオープンソース版がXCP-ng だったんだけど、なんかいつの間にかXCP-ngの商用サポート版として Vates なるものが登場してる

Vatesの方にはHCIプロダクトとして、XOSTORなるものもあるようだ

サポートと価格について

Sangfor HCI

構成がよくわからんけど Sangfor HCI というのがあるらしい

ZStack Cloud

中国で開発されているZStack

インストール用ISO提供あり

中国産なのでopenEulerベースかと思ったら、CentOS 7ベースのh76c,h79cとRocky Linux 8ベースのh84r だった。また、ISOがリリースされているのはx86_64向けのみだけど、GUI的にはARM, 龍芯系(mips64el,loongarch)向けも想定されてる模様。

ドキュメント: ZStack Cloud Documentation
github: https://github.com/zstackio/zstack

参照先

vinchin How to Migrate RHV/RHEV VMs to Other Hosts?
この記事にRHEVからの乗り換え先として「VMware, Citrix Hypervisor/XenServer, XCP-ng, Oracle OLVM, oVirt, Sangfor HCI, OpenStack, ZStack, Huawei FusionCompute, and H3C CAS/UIS」と記載されていて、知らないのがあるな、というのが記事を書くきっかけ

Storware vProtect documentation Virtual Machines
バックアップソフトのマニュアルなんだけど、対応してる各仮想環境でどういう風にバックアップを取るのかという構成図がある。

CephのOSD毎のPlacement Groupの数を確認する

Cephのテスト環境を構築してみた。

シナリオ通りに構築を進めていき、とりあえずは問題なくは終わった。
終わったんだけど、最後にステータスでも確認してみるかとceph healthを実行してみたところHEALTH_WARNが・・・

[root@ceph01 ~]# ceph health
HEALTH_WARN too many PGs per OSD (480 > max 300)
[root@ceph01 ~]#

OSDにたくさんのPGが割り当てられてる、といってるけど、具体的にはどれくらいあるんだろう?

と調べていくと、stackoverflowにある、下記のPGとOSDの関係性に関する質問を発見
Ceph too many pgs per osd: all you need to know

そこで紹介されている「Get the Number of Placement Groups Per Osd」に、OSD毎のPG数をコマンドで確認する手法が掲載されていた。

「ceph pg dump」の出力結果を整形して見やすいようにしている、というものだった。

ceph pg dump | awk '
BEGIN { IGNORECASE = 1 }
 /^PG_STAT/ { col=1; while($col!="UP") {col++}; col++ }
 /^[0-9a-f]+\.[0-9a-f]+/ { match($0,/^[0-9a-f]+/); pool=substr($0, RSTART, RLENGTH); poollist[pool]=0;
 up=$col; i=0; RSTART=0; RLENGTH=0; delete osds; while(match(up,/[0-9]+/)>0) { osds[++i]=substr(up,RSTART,RLENGTH); up = substr(up, RSTART+RLENGTH) }
 for(i in osds) {array[osds[i],pool]++; osdlist[osds[i]];}
}
END {
 printf("\n");
 printf("pool :\t"); for (i in poollist) printf("%s\t",i); printf("| SUM \n");
 for (i in poollist) printf("--------"); printf("----------------\n");
 for (i in osdlist) { printf("osd.%i\t", i); sum=0;
   for (j in poollist) { printf("%i\t", array[i,j]); sum+=array[i,j]; sumpool[j]+=array[i,j] }; printf("| %i\n",sum) }
 for (i in poollist) printf("--------"); printf("----------------\n");
 printf("SUM :\t"); for (i in poollist) printf("%s\t",sumpool[i]); printf("|\n");
}'

これをテスト環境で実行してみると下記の様な出力を得られた

[root@ceph01 ~]# ceph pg dump | awk '
BEGIN { IGNORECASE = 1 }
 /^PG_STAT/ { col=1; while($col!="UP") {col++}; col++ }
 /^[0-9a-f]+\.[0-9a-f]+/ { match($0,/^[0-9a-f]+/); pool=substr($0, RSTART, RLENGTH); poollist[pool]=0;
 up=$col; i=0; RSTART=0; RLENGTH=0; delete osds; while(match(up,/[0-9]+/)>0) { osds[++i]=substr(up,RSTART,RLENGTH); up = substr(up, RSTART+RLENGTH) }
 for(i in osds) {array[osds[i],pool]++; osdlist[osds[i]];}
}
END {
 printf("\n");
 printf("pool :\t"); for (i in poollist) printf("%s\t",i); printf("| SUM \n");
 for (i in poollist) printf("--------"); printf("----------------\n");
 for (i in osdlist) { printf("osd.%i\t", i); sum=0;
   for (j in poollist) { printf("%i\t", array[i,j]); sum+=array[i,j]; sumpool[j]+=array[i,j] }; printf("| %i\n",sum) }
 for (i in poollist) printf("--------"); printf("----------------\n");
 printf("SUM :\t"); for (i in poollist) printf("%s\t",sumpool[i]); printf("|\n");
}'
dumped all in format plain

pool :  4       5       6       7       8       9       10      11      12      13      14      1       2       15      3       | SUM
----------------------------------------------------------------------------------------------------------------------------------------
osd.4   39      29      25      36      27      24      35      34      30      28      34      33      35      29      32      | 470
osd.5   36      35      28      31      21      29      27      37      37      30      32      36      37      27      37      | 480
osd.6   38      37      30      35      30      24      37      33      32      31      27      32      33      31      27      | 477
osd.7   33      34      30      31      25      34      35      42      32      33      21      30      31      28      33      | 472
osd.8   29      32      39      35      28      39      31      34      36      35      38      34      35      24      21      | 490
osd.9   32      34      33      33      37      38      39      27      30      31      28      29      27      26      26      | 470
osd.10  39      31      34      24      35      36      35      40      34      37      37      45      32      31      37      | 527
osd.11  25      26      30      33      36      42      27      30      42      31      28      32      28      35      31      | 476
osd.0   27      39      38      29      35      24      34      26      28      31      38      23      33      31      32      | 468
osd.1   29      30      29      28      43      24      34      30      22      34      30      37      34      44      29      | 477
osd.2   27      32      35      33      31      38      21      24      30      26      37      26      26      36      33      | 455
osd.3   30      25      33      36      36      32      29      27      31      37      34      27      33      42      46      | 498
----------------------------------------------------------------------------------------------------------------------------------------
SUM :   384     384     384     384     384     384     384     384     384     384     384     384     384     384     384     |
[root@ceph01 ~]#

また、NAKAMURA Minoru’s Home Pageにある「RADOS の概略 (RADOS と CRUSH と Placement Group の関係)」は、Cephの理解に役に立った

OpenStack上の仮想インスタンスを物理サーバ間移動(マイグレーション)させる手法について

2022/04/20追記

このページに記載しているのはOpenStack Pike(16番目のリリース)ぐらいまでの話です。

それ以降のOpenStackについては関わっていないので不明です。


OpenStackで仮想インスタンスを動かしている場合に、物理サーバ間を移動させる手法について、いまいちまとまっているものがなかったので、メモ。

・物理サーバを指定して仮想インスタンスを起動

→ 不可能

アベイラビリティーゾーン(availability-zone)というサーバをまとめたグループ(雑な表現)を指定して起動することまでしかできない

・仮想インスタンスを稼働中に物理サーバを移動させる

→ 可能

例えば起動ディスクを含めcinderボリュームを使っている場合、下記コマンドで実施できる

# openstack server migrate --live 移動先ComputeNode --block-migration 仮想インスタンスUUID --wait

なぜか「migrate」と「migration」の2つの単語が混じっている、という不親切なつくりなので、惑わされないこと。

上記だと、移動が終わるまでコマンドが終了しない。「–wait」を抜いた場合、下記の様な形でマイグレーションの進捗状況を確認することが出来る

# openstack server migrate --live 移動先ComputeNode --block-migration 仮想インスタンスUUID
# nova server-migration-list
# nova server-mgirationshow 仮想インスタンスUUID マイグレーション番号

「openstack sevrer show 仮想インスタンスUUID」では進捗のパーセンテージのみ確認可能。

それに対して、「nova server-mgirationshow 仮想インスタンスUUID マイグレーション番号」では、全体で何バイト転送する必要があり、現在何バイト転送が終了しているか、といった詳細を確認することができる。

参考資料
 nova Migrate instances
 nova Live-migrate instances

・止まってる物理サーバ上にあった仮想インスタンスを他の物理サーバで起動させる

→ nova evacuateコマンドで可能

# nova evacuate 仮想インスタンスUUID 移動先ComputeNode

nova evacuateは、元々起動していた物理サーバ上の「nova-compute」と通信が取れない場合に実行できる。

nova-computeと通信が取れる状態だとエラーになる・・・無理矢理実行したいのであれば、該当サーバ上のnova-computeを落とせばできなくもない。

参考資料
 nova Evacuate instances
 nova Recover from a failed compute node

・ERRORステータスになっててmigrateが出来ない

「nova reset-state 仮想インスタンスUUID」を実行することで、ステータスがリセットできる。

参考資料
 nova Troubleshoot Compute