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については、最後に解消します。

基本的には、PGのチューニングに関する話なので、データ保全の観点では問題なしとみなし、このステップでは各ノードのOSDデーモン再起動を優先します。

全てのOSDデーモン再起動が完了して、OSDのページ同期が完了したら、古いOSDが接続されないように、全てのノードで設定をアップデートします。

# ceph osd require-osd-release octopus

Upgrade all CephFS MDS daemons

MDSデーモンを再起動していきますが、他に比べると手順が数ステップあります。

まず、ActiveなMDSデーモンを1つに絞る必要があります。
Proxmox VEのGUIを使用して作成した場合、デフォルトでは最初から max_mds1 なので、以下のように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_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 を設定します。

# 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時代に構築したものですが、今のところ順調にアップグレード出来ているので、このまま機材のリプレースまで頑張ってもらいたいものです。