Proxmox VE 6.4 Ceph upgrade Nautilus to Octopus

Proxmox VE 6.4でCephのバージョンをNautilusからOctopusにインプレースアップグレードします。

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_mds1 なので、以下のように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_datapg_num は32に手動で変更する
    • CephFSの主な利用目的が、仮想マシンのISO(またはクラウドイメージ)とcloudinit用のsnippets置き場であることを考えると、仮想マシンのディスク置き場よりも容量を食わないという想定
    • 仮想ディスクを格納している rdbpg_num: 64 で推奨値から大きく外れていないことを踏まえると、おそらく恒久的に pg_num: 32 としても特段困らなさそう
  • pg_autoscale_modewarn のままとし、今後 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時代に構築したものですが、今のところ順調にアップグレード出来ているので、このまま機材のリプレースまで頑張ってもらいたいものです。

Built with Hugo
テーマ StackJimmy によって設計されています。