Proxmox VE 6.4 Ceph upgrade Nautilus to Octopus
Posted on 2021/08/11(Wed) 23:50 in technical
Proxmox VE 6.4 Ceph upgrade Nautilus to Octopus
Proxmox VE 7.0では、CephのバージョンがOctopusまたはPacificである必要があります。
そこで、Proxmox VE 6.4 to 7.0のアップグレード作業の前に、Proxmox VE 6.4でCephのバージョンをNautilusからOctopusにアップグレードします。
手順は公式wikiの Ceph Nautilus to Octopus に沿って行います。
作業開始前確認
今回の構成:
- 3 nodes Proxmox VE 6.4 cluster
- 3 nodes Ceph cluster (1TB SSDのOSDが1つずつ)
事前に apt-get update && apt-get dist-upgrade
を済ませてあるので、以下のバージョンとなります。
- Proxmox VE: 6.4-13
- Ceph: Nautilus(14.2.22)
# date
Wed Aug 11 18:41:23 JST 2021
# pveversion
pve-manager/6.4-13/9f411e79 (running kernel: 5.4.128-1-pve)
# ceph versions
{
"mon": {
"ceph version 14.2.22 (877fa256043e4743620f4677e72dee5e738d1226) nautilus (stable)": 3
},
"mgr": {
"ceph version 14.2.22 (877fa256043e4743620f4677e72dee5e738d1226) nautilus (stable)": 3
},
"osd": {
"ceph version 14.2.22 (877fa256043e4743620f4677e72dee5e738d1226) nautilus (stable)": 3
},
"mds": {
"ceph version 14.2.22 (877fa256043e4743620f4677e72dee5e738d1226) nautilus (stable)": 1
},
"overall": {
"ceph version 14.2.22 (877fa256043e4743620f4677e72dee5e738d1226) nautilus (stable)": 10
}
}
クラスタの状態も問題なさそうです。
# pvecm status
Cluster information
-------------------
Name: pve-cluster
Config Version: 5
Transport: knet
Secure auth: on
Quorum information
------------------
Date: Wed Aug 11 18:42:27 2021
Quorum provider: corosync_votequorum
Nodes: 3
Node ID: 0x00000001
Ring ID: 1.791d
Quorate: Yes
Votequorum information
----------------------
Expected votes: 3
Highest expected: 3
Total votes: 3
Quorum: 2
Flags: Quorate
Membership information
----------------------
Nodeid Votes Name
0x00000001 1 192.168.122.26 (local)
0x00000002 1 192.168.122.27
0x00000003 1 192.168.122.28
# pveceph status
cluster:
id: 379c9ad8-dd15-4bf1-b9fc-f5206a75fe3f
health: HEALTH_OK
services:
mon: 3 daemons, quorum pve01,pve02,pve03 (age 2h)
mgr: pve02(active, since 2h), standbys: pve03, pve01
mds: cephfs:1 {0=pve02=up:active} 2 up:standby
osd: 3 osds: 3 up (since 2h), 3 in (since 3M)
data:
pools: 3 pools, 224 pgs
objects: 158.01k objects, 614 GiB
usage: 1.8 TiB used, 1.0 TiB / 2.8 TiB avail
pgs: 224 active+clean
io:
client: 43 KiB/s rd, 545 KiB/s wr, 0 op/s rd, 30 op/s wr
ここからスタート。
VMは起動したままで作業します。
一応、何かが止まったらすぐわかるように、適当な仮想マシンで ping 8.8.8.8
を打ちっぱなしにしています。
Upgrade Ceph packages
全てのノードで以下を実行して、Octopusのパッケージに入れ替えます。
# cat /etc/apt/sources.list.d/ceph.list
deb http://download.proxmox.com/debian/ceph-nautilus buster main
# sed -i 's/nautilus/octopus/' /etc/apt/sources.list.d/ceph.list
# cat /etc/apt/sources.list.d/ceph.list
deb http://download.proxmox.com/debian/ceph-octopus buster main
# ceph osd set noout
noout is set
# apt update
# apt full-upgrade
Restart the monitor daemon
全てのノードでモニターデーモンを再起動します。
# systemctl restart ceph-mon.target
全てのノードのモニターデーモン再起動後、モニターのdumpに min_mon_release 15 (octopus)
が表示されることを確認して、モニターデーモンの作業は完了です。
# ceph mon dump | grep min_mon_release
dumped monmap epoch 8
min_mon_release 15 (octopus)
Restart the manager daemon
全てのノードでマネージャーデーモンを再起動します。
# systemctl restart ceph-mgr.target
全てのノードのマネージャーデーモン再起動後に ceph -s
で各マネージャーが起動していることを確認して、マネージャーデーモンの作業は完了です。
# ceph -s
cluster:
id: 379c9ad8-dd15-4bf1-b9fc-f5206a75fe3f
health: HEALTH_WARN
noout flag(s) set
services:
mon: 3 daemons, quorum pve01,pve02,pve03 (age 114s)
mgr: pve02(active, since 4s), standbys: pve01, pve03
mds: cephfs:1 {0=pve02=up:active} 2 up:standby
osd: 3 osds: 3 up (since 2h), 3 in (since 3M)
flags noout
data:
pools: 4 pools, 225 pgs
objects: 158.02k objects, 614 GiB
usage: 1.8 TiB used, 1.0 TiB / 2.8 TiB avail
pgs: 225 active+clean
mgr: pve02(active, since 4s), standbys: pve01, pve03
のようになっているので、問題ないでしょう。
Restart the OSD daemon
全てのノードでOSDデーモンを再起動します。
ここでは、公式ドキュメントの忠告通り、1台ずつ実行と完了を確認しながら進めます。
# systemctl restart ceph-osd.target
OSDデーモン再起動直後:
# ceph status
cluster:
id: 379c9ad8-dd15-4bf1-b9fc-f5206a75fe3f
health: HEALTH_WARN
noout flag(s) set
1 osds down
1 host (1 osds) down
Degraded data redundancy: 158017/474051 objects degraded (33.333%), 204 pgs degraded
1 pools have too many placement groups
services:
mon: 3 daemons, quorum pve01,pve02,pve03 (age 6m)
mgr: pve02(active, since 4m), standbys: pve01, pve03
mds: cephfs:1 {0=pve02=up:active} 2 up:standby
osd: 3 osds: 2 up (since 6s), 3 in (since 3M)
flags noout
data:
pools: 4 pools, 225 pgs
objects: 158.02k objects, 614 GiB
usage: 1.8 TiB used, 1.0 TiB / 2.8 TiB avail
pgs: 158017/474051 objects degraded (33.333%)
204 active+undersized+degraded
21 active+undersized
io:
client: 670 KiB/s wr, 0 op/s rd, 30 op/s wr
少なくとも Degraded data redundancy
が消えるまでは待ちます。
ある程度待った後:
# ceph status
cluster:
id: 379c9ad8-dd15-4bf1-b9fc-f5206a75fe3f
health: HEALTH_WARN
noout flag(s) set
1 pools have too many placement groups
services:
mon: 3 daemons, quorum pve01,pve02,pve03 (age 9m)
mgr: pve02(active, since 8m), standbys: pve01, pve03
mds: cephfs:1 {0=pve02=up:active} 2 up:standby
osd: 3 osds: 3 up (since 3m), 3 in (since 3M)
flags noout
data:
pools: 4 pools, 225 pgs
objects: 158.02k objects, 614 GiB
usage: 1.8 TiB used, 1.0 TiB / 2.8 TiB avail
pgs: 225 active+clean
io:
client: 43 KiB/s rd, 712 KiB/s wr, 0 op/s rd, 24 op/s wr
Hint
公式ドキュメントには HEALTH_OK
もしくは HEALTH_WARN noout flag(s) set
なら次の手順に進んでいいと書かれています。
上記を見ると、追加で 1 pools have too many placement groups
と書かれていますが、このHEALTH_WARNについては、最後に解消します。
- 公式ドキュメントには Placement Group (PG) count warning for pools という項目でアップグレード後のフォローコメントが書かれています
- 同様だと思われる話が # CEPH pools have too many placement groups に上がっています
- その他参考
基本的には、PGのチューニングに関する話なので、データ保全の観点では問題なしとみなし、このステップでは各ノードのOSDデーモン再起動を優先します。
全てのOSDデーモン再起動が完了して、OSDのページ同期が完了したら、古いOSDが接続されないように、全てのノードで設定をアップデートします。
# ceph osd require-osd-release octopus
Upgrade all CephFS MDS daemons
MDSデーモンを再起動していきますが、他に比べると手順が数ステップあります。
まず、ActiveなMDSデーモンを1つに絞る必要があります。
Proxmox VEのGUIを使用して作成した場合、デフォルトでは最初から max_mds
は 1
なので、以下のようにactiveなMDSが1つであることが確認できていれば良いでしょう。
# ceph -s | grep mds:
mds: cephfs:1 {0=pve02=up:active} 2 up:standby
# ceph fs status
cephfs - 0 clients
======
RANK STATE MDS ACTIVITY DNS INOS
0 active pve02 Reqs: 0 /s 0 0
POOL TYPE USED AVAIL
cephfs_metadata metadata 1687k 282G
cephfs_data data 4703M 282G
STANDBY MDS
pve03
pve01
VERSION DAEMONS
None pve02, pve03
ceph version 14.2.22 (877fa256043e4743620f4677e72dee5e738d1226) nautilus (stable) pve01
次に、Standby状態のMDSのノードで、MDSデーモンを停止します。
上記の出力例でいえば、pve01/pve03でMDSデーモンを停止します。
# systemctl stop ceph-mds.target
この時、以下のように1台だけActiveになっていることを確認します。
# ceph status | grep mds:
mds: cephfs:1 {0=pve02=up:active}
# ceph fs status
cephfs - 0 clients
======
RANK STATE MDS ACTIVITY DNS INOS
0 active pve02 Reqs: 0 /s 0 0
POOL TYPE USED AVAIL
cephfs_metadata metadata 1695k 282G
cephfs_data data 4703M 282G
MDS version: None
残ったActive状態のノード(今回で言うとpve02)で、MDSデーモンを再起動します。
これにより MDS version:
が15になることが確認できます。
# systemctl restart ceph-mds.target
# ceph status | grep mds:
mds: cephfs:1 {0=pve02=up:active}
# ceph fs status
cephfs - 3 clients
======
RANK STATE MDS ACTIVITY DNS INOS
0 active pve02 Reqs: 0 /s 47 21
POOL TYPE USED AVAIL
cephfs_metadata metadata 1695k 282G
cephfs_data data 4703M 282G
MDS version: ceph version 15.2.13 (1f5c7871ec0e36ade641773b9b05b6211c308b9d) octopus (stable)
そして、MDSデーモンが停止中のノード(今回で言うとpve01/pve03)で、MDSデーモンを起動します。
# systemctl start ceph-mds.target
# ceph status | grep mds:
mds: cephfs:1 {0=pve02=up:active} 2 up:standby
# ceph fs status
cephfs - 3 clients
======
RANK STATE MDS ACTIVITY DNS INOS
0 active pve02 Reqs: 0 /s 47 21
POOL TYPE USED AVAIL
cephfs_metadata metadata 1707k 282G
cephfs_data data 4703M 282G
STANDBY MDS
pve01
pve03
MDS version: ceph version 15.2.13 (1f5c7871ec0e36ade641773b9b05b6211c308b9d) octopus (stable)
max_mds
は特に変更していないので、これにてMDSデーモンの作業は完了です。
Unset the 'noout' flag
最後に noout
フラグを解除します。
# ceph osd unset noout
noout is unset
アップグレード作業完了後の状態確認
作業後は、以下のようになります。
# ceph status
cluster:
id: 379c9ad8-dd15-4bf1-b9fc-f5206a75fe3f
health: HEALTH_WARN
1 pools have too many placement groups
services:
mon: 3 daemons, quorum pve01,pve02,pve03 (age 32m)
mgr: pve02(active, since 31m), standbys: pve01, pve03
mds: cephfs:1 {0=pve02=up:active} 2 up:standby
osd: 3 osds: 3 up (since 13m), 3 in (since 3M)
data:
pools: 4 pools, 225 pgs
objects: 158.02k objects, 614 GiB
usage: 1.8 TiB used, 1.0 TiB / 2.8 TiB avail
pgs: 225 active+clean
io:
client: 43 KiB/s rd, 810 KiB/s wr, 0 op/s rd, 29 op/s wr
# ceph versions
{
"mon": {
"ceph version 15.2.13 (1f5c7871ec0e36ade641773b9b05b6211c308b9d) octopus (stable)": 3
},
"mgr": {
"ceph version 15.2.13 (1f5c7871ec0e36ade641773b9b05b6211c308b9d) octopus (stable)": 3
},
"osd": {
"ceph version 15.2.13 (1f5c7871ec0e36ade641773b9b05b6211c308b9d) octopus (stable)": 3
},
"mds": {
"ceph version 15.2.13 (1f5c7871ec0e36ade641773b9b05b6211c308b9d) octopus (stable)": 3
},
"overall": {
"ceph version 15.2.13 (1f5c7871ec0e36ade641773b9b05b6211c308b9d) octopus (stable)": 12
}
}
ちなみに、ここまでの手順実行中に、起動中のVM上でpingを実行し続けていた結果(サマリーのみ)は以下のようになりました。
$ ping 8.8.8.8
^C
--- 8.8.8.8 ping statistics ---
2054 packets transmitted, 1986 received, 3.31061% packet loss, time 2056917ms
rtt min/avg/max/mdev = 8.145/40.569/66.377/8.650 ms
オンラインでのマイグレーションは出来ましたが、68パケット落ちました。
多いとみるか少ないとみるかは難しいところですが。
1発たりともパケットを落とせない状況では難しいかもしれません。
(そんな環境があるかどうかはさておき)
HEALTH_WARN: 1 pools have too many placement groups の修復
ここまでの手順で、Octopusまでアップグレードは完了しているのですが、 HEALTH_WARN
のままにするのは心理的に気持ち悪いです。
途中で出てきた 1 pools have too many placement groups
も解消しておきましょう。
Proxmox VEの公式ドキュメントには Placement Group (PG) count warning for pools という項目で書かれています。
まず Ceph Documentation » Ceph Storage Cluster » Cluster Operations » # PLACEMENT GROUPS に書かれてコマンドを使用して、推奨とされている pg_num
がいくつなのかを確認します。
# ceph osd pool autoscale-status
POOL SIZE TARGET SIZE RATE RAW CAPACITY RATIO TARGET RATIO EFFECTIVE RATIO BIAS PG_NUM NEW PG_NUM AUTOSCALE
rdb 608.4G 3.0 2887G 0.6322 1.0 64 warn
cephfs_data 1567M 3.0 2887G 0.0016 1.0 128 32 warn
cephfs_metadata 561.0k 3.0 2887G 0.0000 4.0 32 warn
device_health_metrics 2375k 3.0 2887G 0.0000 1.0 1 on
ここで NEW PG_NUM
が指定されている場合、Cephの推奨する pg_num
から3倍以上の乖離があるということが分かります。
対象になっているのは、最近iso/snippets置き場として作ったCephFSなので、まだ中身は1.5GB程度しかありません。
Proxmox VEではCeph FSを作成するときのデフォルトpg_numは128です。
Ceph Documentation の [CHOOSING THE NUMBER OF PLACEMENT GROUPS](https://docs.ceph.com/en/octopus/rados/operations/placement-groups/#choosing-the-number-of-placement-groups を見ると、以下のように書かれています。
If you have more than 50 OSDs, we recommend approximately 50-100 placement groups per OSD to balance out resource usage, data durability and distribution. If you have less than 50 OSDs, choosing among the preselection above is best.
今回の環境のようにOSDが3個程度(今後増えたとしても50未満)であることを考えると、pg_numを動的に変更することにメリットは無さそうです。
そこで、今回は以下のような対応を取ります。
cephfs_data
のpg_num
は32に手動で変更する- CephFSの主な利用目的が、仮想マシンのISO(またはクラウドイメージ)とcloudinit用のsnippets置き場であることを考えると、仮想マシンのディスク置き場よりも容量を食わないという想定
- 仮想ディスクを格納している
rdb
がpg_num: 64
で推奨値から大きく外れていないことを踏まえると、おそらく恒久的にpg_num: 32
としても特段困らなさそう
pg_autoscale_mode
はwarn
のままとし、今後HEALTH_WARN
が発生した場合に、適切なpg_numを検討するpg_autoscale_mode: warn
は、Cephの推奨するpg_num
から3倍以上の乖離がある場合にHEALTH_WARN
を出力するモードですpg_autoscale_mode: warn
は、自動的なpg_num
の調整は行わないため、小規模かつストレージ容量と使用量の急な増減が無い環境ではこのままで良さそう
そこで、以下のように手動で pg_num
を設定します。
# ceph osd pool set cephfs_data pg_num 32
set pool 2 pg_num to 32
# ceph osd pool autoscale-status
POOL SIZE TARGET SIZE RATE RAW CAPACITY RATIO TARGET RATIO EFFECTIVE RATIO BIAS PG_NUM NEW PG_NUM AUTOSCALE
rdb 608.4G 3.0 2887G 0.6322 1.0 64 warn
cephfs_data 1567M 3.0 2887G 0.0016 1.0 32 warn
cephfs_metadata 436.1k 3.0 2887G 0.0000 4.0 32 warn
device_health_metrics 2696k 3.0 2887G 0.0000 1.0 1 on
# ceph status
cluster:
id: 379c9ad8-dd15-4bf1-b9fc-f5206a75fe3f
health: HEALTH_OK
services:
mon: 3 daemons, quorum pve01,pve02,pve03 (age 3h)
mgr: pve02(active, since 3h), standbys: pve01, pve03
mds: cephfs:1 {0=pve02=up:active} 2 up:standby
osd: 3 osds: 3 up (since 3h), 3 in (since 3M)
data:
pools: 4 pools, 216 pgs
objects: 158.01k objects, 614 GiB
usage: 1.8 TiB used, 1.0 TiB / 2.8 TiB avail
pgs: 0.463% pgs not active
215 active+clean
1 clean+premerge+peered
io:
client: 128 KiB/s rd, 0 B/s wr, 0 op/s rd, 13 op/s wr
無事に HEALTH_OK
となりました。
これにて作業完了です。
終わり
さて、次はProxmox VE 7.0へのアップグレード作業です。
今使っているクラスタはProxmox VE 5.x時代に構築したものですが、今のところ順調にアップグレード出来ているので、このまま機材のリプレースまで頑張ってもらいたいものです。