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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
}
}
|
クラスタの状態も問題なさそうです。
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
# 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のパッケージに入れ替えます。
1
2
3
4
5
6
7
8
9
|
# 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
全てのノードでモニターデーモンを再起動します。
1
|
# systemctl restart ceph-mon.target
|
全てのノードのモニターデーモン再起動後、モニターのdumpに min_mon_release 15 (octopus)
が表示されることを確認して、モニターデーモンの作業は完了です。
1
2
3
|
# ceph mon dump | grep min_mon_release
dumped monmap epoch 8
min_mon_release 15 (octopus)
|
Restart the manager daemon
全てのノードでマネージャーデーモンを再起動します。
1
|
# systemctl restart ceph-mgr.target
|
全てのノードのマネージャーデーモン再起動後に ceph -s
で各マネージャーが起動していることを確認して、マネージャーデーモンの作業は完了です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# 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台ずつ実行と完了を確認しながら進めます。
1
|
# systemctl restart ceph-osd.target
|
OSDデーモン再起動直後:
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
|
# 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
が消えるまでは待ちます。
ある程度待った後:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
# 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](https://pve.proxmox.com/wiki/Ceph_Nautilus_to_Octopus#Placement_Group_.28PG.29_count_warning_for_pools) という項目でアップグレード後のフォローコメントが書かれています
* 同様だと思われる話が [# CEPH pools have too many placement groups](https://forum.proxmox.com/threads/ceph-pools-have-too-many-placement-groups.81047/) に上がっています
* その他参考
* [Ceph Documentation » Ceph Storage Cluster » Cluster Operations » # PLACEMENT GROUPS](https://docs.ceph.com/en/octopus/rados/operations/placement-groups/#autoscaling-placement-groups)
* [Red Hat Ceph Storage > 4 > インストールガイド > 5.11. 配置グループ autoscaler](https://access.redhat.com/documentation/ja-jp/red_hat_ceph_storage/4/html/installation_guide/the-placement-group-autoscaler_install)
基本的には、PGのチューニングに関する話なので、データ保全の観点では問題なしとみなし、このステップでは各ノードのOSDデーモン再起動を優先します。
全てのOSDデーモン再起動が完了して、OSDのページ同期が完了したら、古いOSDが接続されないように、全てのノードで設定をアップデートします。
1
|
# ceph osd require-osd-release octopus
|
Upgrade all CephFS MDS daemons
MDSデーモンを再起動していきますが、他に比べると手順が数ステップあります。
まず、ActiveなMDSデーモンを1つに絞る必要があります。
Proxmox VEのGUIを使用して作成した場合、デフォルトでは最初から max_mds
は 1
なので、以下のようにactiveなMDSが1つであることが確認できていれば良いでしょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# 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デーモンを停止します。
1
|
# systemctl stop ceph-mds.target
|
この時、以下のように1台だけActiveになっていることを確認します。
1
2
3
4
5
6
7
8
9
10
11
|
# 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になることが確認できます。
1
2
3
4
5
6
7
8
9
10
11
12
|
# 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デーモンを起動します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 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
フラグを解除します。
1
2
|
# ceph osd unset noout
noout is unset
|
アップグレード作業完了後の状態確認
作業後は、以下のようになります。
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
29
30
31
32
33
34
35
36
37
38
39
|
# 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を実行し続けていた結果(サマリーのみ)は以下のようになりました。
1
2
3
4
5
|
$ 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
がいくつなのかを確認します。
1
2
3
4
5
6
|
# 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
を設定します。
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
29
30
|
# 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時代に構築したものですが、今のところ順調にアップグレード出来ているので、このまま機材のリプレースまで頑張ってもらいたいものです。