Proxmox VE cluster再構築と移行の雑記

Lenovo ThinkCentre M75s Gen 5を購入したので、Proxmox VEクラスタを再構築して移行した時の記録

はじめに

既存のProxmox VEクラスタはTX1320 M2を3台構成で構築していました。
2024年にダラダラと機材を買い集めたりして Lenovo ThinkCentre M75s Gen 5 - Hardware and ECC memory でECCメモリが動作しそうなことも分かったので、いよいよThinkCentre M75s Gen 5を3台構成でProxmox VEクラスタを再構築して移行することにしました。

設定とか細かい話はさておき、概要や経緯などを整理しておこうと思います。

構成情報

おおよその機器構成の比較は以下の通り。  

TX1320 M2 (01) TX1320 M2 (02, 03) ThinkCentre M75s Gen5
Shipset C236 C236 AMD Phoenix PRO 665
CPU model Xeon E3-1220v5 Xeon E3-1230v5 Ryzen 7 Pro 8700G (APU)
Core/Thread 4C/4T 4C/8T 8C/16T
CPU Mark - Single Thread Rating 2,070 2,196 3,960
CPU Mark - Multithread Rating 5,815 7,930 31,762
Memory DDR4-2133 ECC 16GB x4(64GB) DDR4-2133 ECC 16GB x2(32GB) DDR5-5600 ECC 32GB x2(64GB)
System disk SATA SSD WD Green 120GB SATA SSD WD Green 120GB 付属(NVMe SSD 256GB)
Data disk SATA SSD MX500 2TB SATA SSD MX500 2TB SATA SSD Intel DC S4500 3.84TB
Ethernet GbE x2 / iRMC x1 GbE x2 / iRMC x1 (Advanced) 1GbE x1 (DASH)
Remote管理機能 iRMC iRMC + Advanced NanoKVM
PCI slot 1 PCIe 3.0 x8 - 空き PCIe 3.0 x8 - 空き PCIe 3.0 x16 - Intel X520
PCI slot 2 PCIe 3.0 x8 - 空き PCIe 3.0 x8 - 空き PCIe 3.0 x1 - NanoKVM PCIe
PCI slot 3 PCIe 3.0 x4 - 空き PCIe 3.0 x4 - 空き -
PCI slot 4 PCIe 3.0 x1 - 空き PCIe 3.0 x1 - 空き -
電源 250W 250W 260W

TX1320 M2は2017年に PRIMERGY TX1320 M2が来たよー の辺りで購入したもの。
01は新品だけど02,03はたまたま当時安かった中古の構成品を調達したので、ハードウェア構成が少し違う。

ThinkCentre M75s Gen5は細々とパーツを集めていたので、調達時期が不安定。
一応手元のメモによれば時期感はこれくらい。

時期 品目 メモ
2022年くらい Intel X520 貰いものなので2022年くらいから部屋に眠ってたやつだと思う(曖昧)
2024年4月25日 Intel DC S4500 結局eBayから購入した(※)。到着は5月末くらいだったと思う。
2024年9月30日 NanoKVM PCIe いつのロットか忘れたけど3個セットで公式から買ったはず
2024年12月6日 ThinkCentre M75s Gen 5 1台目の検証機。大体同日くらいでメモリも買った。
2025年3月20日 Rucks ICX7150-24 10GbE SW
2025年3月21日 ThinkCentre M75s Gen 5 残りの2台は2点セットで購入

※最初はAmazonで買おうとしたけど、マーケットプレイスの業者が2連続で「ご注文商品在庫切れになっております。全額返金させて頂きますので注文キャンセルをお願いいたします。」などと回答してきた。キャンセルは商品を用意できない業者側の都合ではないですかとAmazonに通告。無在庫転売してた品目の差額補正をサボっていたせいで注文請けてから赤字になることに気付いたんじゃないだろうか。願わくば廃業するかAmazonにBANされて欲しい。

費用

クラスタ構築の生々しい費用感を載せておきます。
大体1基20万強なので、TX1320 M2を構築した時の費用感と比べると…性能を考えると、まぁ、まぁ…比較的、心なしか、同じくらい、なんじゃないでしょうか。楽天リーベイツ様様です。
おまけで基幹SWの更改とかCeph用バックプレーンの10G SWも追加しているので、それは参考程度に。

用途 品目 カテゴリ 単価(税込) 個数 金額
仮想サーバー #1 ThinkCentre M75s gen 5 #1 本体 ¥108,779 1 ¥108,779
楽天リーベイツ還元 ポイント ¥-21,756 1 ¥-21,756
KSM56E46BD8KM-32HA ECCメモリ ¥27,958 2 ¥55,916
NanoKVM-PCIe KVM拡張カード ¥6,866 1 ¥6,866
Intel X520 10GbE NIC ¥0 1 ¥0
SFP+ 10GbE Module ¥0 2 ¥0
Intel DC S4500 Series 3.84TB SSD ¥61,162 1 ¥61,162
仮想サーバー #2 ThinkCentre M75s gen 5 #1 本体 ¥105,904 1 ¥105,904
楽天リーベイツ還元 ポイント ¥-21,181 1 ¥-21,181
KSM56E46BD8KM-32HA ECCメモリ ¥27,678 2 ¥55,356
NanoKVM-PCIe KVM拡張カード ¥6,866 1 ¥6,866
Intel X520 10GbE NIC ¥0 1 ¥0
SFP+ 10GbE Module ¥0 2 ¥0
Intel DC S4500 Series 3.84TB SSD ¥61,162 1 ¥61,162
仮想サーバー #3 ThinkCentre M75s gen 5 #1 本体 ¥105,904 1 ¥105,904
楽天リーベイツ還元 ポイント ¥-21,181 1 ¥-21,181
KSM56E46BD8KM-32HA ECCメモリ ¥27,678 2 ¥55,356
NanoKVM-PCIe KVM拡張カード ¥6,866 1 ¥6,866
Intel X520 10GbE NIC ¥0 1 ¥0
SFP+ 10GbE Module ¥0 2 ¥0
Intel DC S4500 Series 3.84TB SSD ¥61,162 1 ¥61,162
基幹SW Rucks ICX7150-24 L2SW ¥35,624 1 ¥35,624
SFP+ 10GbE Module ¥0 3 ¥0
Ceph用SW JT-S508CL-8S 10GbE SW ¥10,593 1 ¥10,593
SFP+ 10GbE Module ¥0 3 ¥0
その他 その他 ケーブル類 ¥5,000 1 ¥5,000
合計 ¥678,399

インストール設定

Proxmox VE自体は大体こんな感じでインストール。IP周りは省略。

pve-a01 pve-a02 pve-a03 Tag
Power - Intelligent Cooling Balance mode Balance mode Balance mode BIOS
Filesystem ext4 ext4 ext4 Proxmox installer
Disk /dev/nvme0n1 /dev/nvme0n1 /dev/nvme0n1 Proxmox installer
Country Japan Japan Japan Proxmox installer
Timezone Asia/Tokyo Asia/Tokyo Asia/Tokyo Proxmox installer
Keymap jp jp jp Proxmox installer
Email root@example.com root@example.com root@example.com Proxmox installer
Management interface enp12s0f1 enp12s0f1 enp12s0f1 Proxmox installer
Hostname pve-a01 pve-a02 pve-a03 Proxmox installer

初期設定とか

人によりけりなのでメモ程度に列挙。

Repositoryの設定

WebUIからEnterpriseなpveとcephのリポジトリをDisable、pve-no-subscriptionを追加。

NTP(chrony)の設定

デフォルトのNTPを無効にして家の中のNTPサーバーに向け直す。IPは文書用なのでコピペしても動かないよ。

1
2
3
4
5
6
7
8
~# sed -i -e "s/^pool /#pool /" /etc/chrony/chrony.conf
~# cat <<__EOL__ > /etc/chrony/sources.d/ainoniwa.net.sources
# NTP 1
server 192.0.2.1 iburst
# NTP 2
server 192.0.2.2 iburst
__EOL__
~# systemctl restart chrony

Nested KVMの確認

見た感じデフォルトで有効になっているのでOK

1
2
~# cat /sys/module/kvm_amd/parameters/nested 
1

lm-sensorsの追加

lm-sensorsパッケージを追加して温度確認できるように。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
~# apt install -y lm-sensors
~# sensors
amdgpu-pci-0d00
Adapter: PCI adapter
vddgfx:        1.43 V  
vddnb:       914.00 mV 
edge:         +55.0°C  
PPT:          36.10 W  (avg =  34.05 W)

nvme-pci-0200
Adapter: PCI adapter
Composite:    +37.9°C  (low  = -273.1°C, high = +85.8°C)
                       (crit = +86.8°C)
Sensor 1:     +39.9°C  (low  = -273.1°C, high = +65261.8°C)
Sensor 2:     +37.9°C  (low  = -273.1°C, high = +65261.8°C)

k10temp-pci-00c3
Adapter: PCI adapter
Tctl:         +73.4°C  

WebUIを443/TCPでも使えるように

デフォルトの管理WebUIのポート番号が8006なので、443でアクセスしても繋がるようにしておく。

1
2
3
4
5
~# cat <<__EOL__ > /etc/network/interfaces.d/vmbr0.post-up.conf
iface vmbr0 inet static
        post-up ( iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8006 )
__EOL__
~# ifreload -a

Proxmox VEのクラスタ設定

最初にクラスタを作るノードに公開鍵を登録しておく。
特にrootユーザーの authorized_keys は実体が /etc/pve に置かれているので、クラスタを組んだ後にcorosyncで共有されてしまう。

1
2
3
4
5
6
~# ls -l .ssh/
total 12
lrwxrwxrwx 1 root root   29 Apr 26 16:37 authorized_keys -> /etc/pve/priv/authorized_keys
-rw-r----- 1 root root  117 Apr 26 16:37 config
-rw------- 1 root root 3381 Apr 26 16:37 id_rsa
-rw-r--r-- 1 root root  738 Apr 26 16:37 id_rsa.pub

こんな感じでWebUIから作る。

Join Informationからクラスタ参加情報をコピー

PasswordとCluster networkのサブネットを選択してJoin

上手くいくとクラスタを作成したノード側にクラスタノードが追加されます。
Joinした側のノードのWebUIは一度接続が切れるので、そちらは閉じて良い。
必要なノード数分作業して、全部登録されたらOK。

Cephクラスタ設定

Host -> CephまたはDatacenter -> CephからCeph Squid (19.2)をインストール

memo
Datacenter -> Cephから設定しても、全ノードに適用されるわけでは無いのでHost -> Cephから設定した方が分かりやすいと思います。

Public Networkだけを裏の10G Linkを使うように設定します。

残りのノードも同様にHost -> CephからCeph Squid (19.2)をインストール。
1台目でConfigurationが終わっているので、2台目以降はInstallationのみで完了です。

Ceph Monitorの追加

デフォルトでは1台目にしかmonitor/managerが設定されていませんので、Ceph -> MonitorからMonitorとManagerに2,3台目を追加します。

Ceph OSDの追加

なにかで使っていると No Disks unused と言われるので、その場合はwipeします。

1
2
3
4
5
~# wipefs --all /dev/sda
/dev/sda: 8 bytes were erased at offset 0x00000200 (gpt): 45 46 49 20 50 41 52 54
/dev/sda: 8 bytes were erased at offset 0x37e3ee55e00 (gpt): 45 46 49 20 50 41 52 54
/dev/sda: 2 bytes were erased at offset 0x000001fe (PMBR): 55 aa
/dev/sda: calling ioctl to re-read partition table: Success

とても有名なSSDの書き込みキャッシュ無効化の話。Forumでもたまに話題になります。

今回のOSD用SSDはSATA接続の INTEL SSDSC2KB038T7 ですが、デフォルトでは書き込みキャッシュが有効になっていました。

1
2
3
4
5
6
~# hdparm -I /dev/sda | grep -i cache
        cache/buffer size  = unknown
           *    Write cache
           *    Mandatory FLUSH_CACHE
           *    FLUSH_CACHE_EXT
           *    All write cache is non-volatile

あとでベンチマークを取るので、これは一旦有効のまま進めます。

OSDに追加できるDiskは /dev/sda しかないので、自動的に選択されました。そのほかの設定はそのままです。

3台分設定出来たら完了です。

VMイメージ用Cephプールを作成

安直に datastore を作ります。
PG Autoscaler Modeは on でもそう実害は無いと思いますが https://pve.proxmox.com/wiki/Deploy_Hyper-Converged_Ceph_Cluster#pve_ceph_pools のデフォルトに合わせて warn にしておきます。

作成すると自動的に Datacenter/Storage に追加されます。

VMイメージ用プールに透過圧縮を設定

初期状態では透過圧縮機能が有効になっていません。 VMイメージの場合は割と圧縮が効く印象ですので、有効にしていきます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
~# ceph df detail
--- RAW STORAGE ---
CLASS    SIZE   AVAIL    USED  RAW USED  %RAW USED
ssd    10 TiB  10 TiB  82 MiB    82 MiB          0
TOTAL  10 TiB  10 TiB  82 MiB    82 MiB          0
 
--- POOLS ---
POOL       ID  PGS   STORED   (DATA)  (OMAP)  OBJECTS     USED   (DATA)  (OMAP)  %USED  MAX AVAIL  QUOTA OBJECTS  QUOTA BYTES  DIRTY  USED COMPR  UNDER COMPR
.mgr        1    1  769 KiB  769 KiB     0 B        2  2.3 MiB  2.3 MiB     0 B      0    3.3 TiB            N/A          N/A    N/A         0 B          0 B
datastore   2  128      0 B      0 B     0 B        0      0 B      0 B     0 B      0    3.3 TiB            N/A          N/A    N/A         0 B          0 B

圧縮アルゴリズムとしては、とりあえずlz4を選んでおけば良いと思います。
参考: https://stackoverflow.com/questions/67537111/how-do-i-decide-between-lz4-and-snappy-compression

lz4は公式プラグインとしては提供されないので、その点については注意。

BlueStore supports inline compression using snappy, zlib, or lz4. Please note that the lz4 compression plugin is not distributed in the official release. https://docs.ceph.com/en/quincy/rados/configuration/bluestore-config-ref/#inline-compression

compression_modeaggressive だと圧縮不可のclient hintを付与していない限り、可能な範囲で圧縮してくれるようになります。
書き込み済みのデータは圧縮されないので、出来ればOSD Pool作成時に設定しておきたいです。

ひとまず以下のように設定。(クラスタなので、どこか1つのノードで設定すればOK)

1
2
3
4
~# ceph osd pool set datastore compression_algorithm lz4
set pool 2 compression_algorithm to lz4
~# ceph osd pool set datastore compression_mode aggressive
set pool 2 compression_mode to aggressive

ちゃんと compression_algorithm lz4 compression_mode aggressive が設定されています。

1
2
3
~# ceph osd pool ls detail
pool 1 '.mgr' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 1 pgp_num 1 autoscale_mode on last_change 19 flags hashpspool stripe_width 0 pg_num_max 32 pg_num_min 1 application mgr read_balance_score 3.00
pool 2 'datastore' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 128 pgp_num 128 autoscale_mode warn last_change 25 flags hashpspool stripe_width 0 compression_algorithm lz4 compression_mode aggressive application rbd read_balance_score 1.01

CephFSの設定

CephFSも使えるとcloud-initや起動時のhook-scriptが格納出来て便利なので作成します。
まずはMetadata Serversを3台分設定します。

Create CephFSから作成。大した量を置かないのでPGは32にしておきます。

自動的にPoolが作成されるので、こちらも透過圧縮設定を入れておきます。

1
2
3
4
~# ceph osd pool set cephfs_data compression_algorithm lz4
set pool 3 compression_algorithm to lz4
~# ceph osd pool set cephfs_data compression_mode aggressive
set pool 3 compression_mode to aggressive

Live MigrationのNWと帯域

Live migrationで使うLinkをCephと同じ10Gネットワークに設定して、帯域を750 MiB/sに設定しておきます。

Notificationの対応

Mailを無効にして代わりにSlackを使います。
まずはSlackへのNotificationの追加。

元々あった mail-to-root はModifyでEnableのチェックを外しておきます。

Notification Matcherを新しく追加します。

Match Rulesはデフォルトで全部なので、ひとまずそのままで良いです。

通知先に先ほど追加したSlackを指定して作成します。

元々登録されていたdefault-matcherのEnableのチェックは外しておきます。

最後に、TestからSlackに送信されることを確認して完了です。

VMの移行

半分くらいはNASを介してBackup & Restoreしました。語ることが無い。
もう半分くらいは、ついでにOSをクリーンインストールしてAnsibleで再構築しました。これまた語れることが無い。

qm remote-migrateの動作確認

せっかく移行するなら qm remote-migrate というコマンドで、直接別クラスタからVMを移動してみたいと思っていました。
が、結論から言うとCephを使っているとダメらしい、ということが分かりました。

[SOLVED] - remote-migration & cloudinit | Proxmox Support Forum

使い方はこんな感じです。

もう削除済みなのでトークンもベタ張りしますが「むむむ…!」というエラーで終わります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
root@pve01:~# qm remote-migrate 3011 3011 'apitoken=PVEAPIToken=root@pam!api=4775bef6-1ce1-4b75-99ba-85a60d8c7ff5,host=192.168.122.21,
fingerprint=24:7F:99:CB:92:9A:C8:B8:17:4A:95:CD:A2:77:F4:CF:95:8E:8A:21:72:38:89:2A:69:74:CD:94:07:B2:10:EF,port=443' --target-bridge 
vmbr0 --target-storage datastore --online
Establishing API connection with remote at '192.168.122.21'
2025-05-04 17:11:13 remote: started tunnel worker 'UPID:pve-a01:0011BF0A:0171CD78:68172121:qmtunnel:3011:root@pam!api:'
tunnel: -> sending command "version" to remote
tunnel: <- got reply
2025-05-04 17:11:13 local WS tunnel version: 2
2025-05-04 17:11:13 remote WS tunnel version: 2
2025-05-04 17:11:13 minimum required WS tunnel version: 2
websocket tunnel started
2025-05-04 17:11:13 starting migration of VM 3011 to node 'pve-a01' (192.168.122.21)
tunnel: -> sending command "bwlimit" to remote
tunnel: <- got reply
tunnel: -> sending command "bwlimit" to remote
tunnel: <- got reply
tunnel: -> sending command "bwlimit" to remote
tunnel: <- got reply
2025-05-04 17:11:14 found generated disk 'rdb_vm:vm-3011-cloudinit' (in current VM config)
2025-05-04 17:11:14 found local disk 'rdb_vm:vm-3011-disk-0' (attached)
2025-05-04 17:11:14 found local disk 'rdb_vm:vm-3011-disk-1' (unused)
2025-05-04 17:11:14 copying local disk images
2025-05-04 17:11:14 ERROR: no export formats for 'rdb_vm:vm-3011-cloudinit' - check storage plugin support!
2025-05-04 17:11:14 aborting phase 1 - cleanup resources
tunnel: -> sending command "quit" to remote
tunnel: <- got reply
2025-05-04 17:11:15 ERROR: migration aborted (duration 00:00:02): no export formats for 'rdb_vm:vm-3011-cloudinit' - check storage plugin support!
migration aborted

使ってないstoppedなVMがいたのでcloud-initディスクを外して再度試してみましたが、やっぱり駄目でした。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
root@pve01:~# qm remote-migrate 2231 2231 'apitoken=PVEAPIToken=root@pam!api=4775bef6-1ce1-4b75-99ba-85a60d8c7ff5,host=192.168.122.21,fingerprint=24:7F:99:CB:92:9A:C8:B8:17:4A:95:CD:A2:77:F4:CF:95:8E:8A:21:72:38:89:2A:69:74:CD:94:07:B2:10:EF,port=443' --target-bridge vmbr0 --target-storage datastore 
Establishing API connection with remote at '192.168.122.21'
2025-05-04 17:19:01 remote: started tunnel worker 'UPID:pve-a01:0011C791:01728453:681722F5:qmtunnel:2231:root@pam!api:'
tunnel: -> sending command "version" to remote
tunnel: <- got reply
2025-05-04 17:19:01 local WS tunnel version: 2
2025-05-04 17:19:01 remote WS tunnel version: 2
2025-05-04 17:19:01 minimum required WS tunnel version: 2
websocket tunnel started
2025-05-04 17:19:01 starting migration of VM 2231 to node 'pve-a01' (192.168.122.21)
tunnel: -> sending command "bwlimit" to remote
tunnel: <- got reply
2025-05-04 17:19:01 found local disk 'rdb_vm:vm-2231-disk-0' (attached)
2025-05-04 17:19:01 copying local disk images
2025-05-04 17:19:02 ERROR: no export formats for 'rdb_vm:vm-2231-disk-0' - check storage plugin support!
2025-05-04 17:19:02 aborting phase 1 - cleanup resources
tunnel: -> sending command "quit" to remote
tunnel: <- got reply
2025-05-04 17:19:03 ERROR: migration aborted (duration 00:00:02): no export formats for 'rdb_vm:vm-2231-disk-0' - check storage plugin support!
migration aborted

処分

売るのも面倒なのでTX1320 M2は リネットジャパン さんに回収してもらいました。
ThinkCentreの箱をそのまま流用できたし、ついでに家電も回収してもらえるので丁度良いですね。

一部パーツは剥がして 買取案内|じゃんぱら さんに持ち込み。
買う時は高いECCメモリは下取り価格ほとんどつかないんですよね…
ThinkCentreから剥がしたDDR5-5600 8GBメモリの方が良い値段になる寂しさ。

終わり

構築自体は2025年4月頃にポチポチやっていましたが、そのあとCephのベンチマークを取ったりして、なんやかんやで移行が終わったのは2025年7月くらいでしょうか。
更改先のハードウェア選定を2023年頃からせっせと進めていて、何とか旧クラスタが致命的に壊れる前に移行できました。

今度は載ってるVMのEoL対応とかソフトウェアスタックの見直しとか、NASのハードウェア更改も進めたいのですが頭も手も足りないですね。
Cephのベンチマーク結果も整理しておきたいので、これまた後程…

Hugo で構築されています。
テーマ StackJimmy によって設計されています。