Ceph QuincyからReefへのアップグレード＠ProxmoxVE

Proxmox VE 8.1と一緒にリリースされたCeph Reefにアップグレードを実施しました。
その時の手順メモになります。

[ProxmoxVEでのCephについて](https://proxmox.classact.co.jp/proxmox_ve/features/#features08)

# 環境
- バージョンアップ前：Ceph Quincy 17.2.7
- バージョンアップ後：Ceph Reef 18.2.0

[公式手順](https://pve.proxmox.com/wiki/Ceph_Quincy_to_Reef)
[Proxmox VE 8.1-1 のダウンロード](https://proxmox.classact.co.jp/trial/)


# 手順
## msgrv2 が有効になっていることを確認
```bash
ceph mon dump
～省略～
0: [v2:192.168.0.7:3300/0,v1:192.168.0.7:6789/0] mon.pve7
1: [v2:192.168.0.5:3300/0,v1:192.168.0.5:6789/0] mon.pve5
2: [v2:192.168.0.6:3300/0,v1:192.168.0.6:6789/0] mon.pve6
3: [v2:192.168.0.8:3300/0,v1:192.168.0.8:6789/0] mon.pve8
4: [v2:192.168.0.9:3300/0,v1:192.168.0.9:6789/0] mon.pve9
```
上記のようにv1とv2の両方が、各モニターにリストされていることを確認します。
もし有効になっていなければ下記のコマンドで有効にします。
```bash
ceph mon enable-msgr2
```
## Cephリポジトリの修正
**各ノード**で以下のコマンドを実行し、リポジトリをQuincyからReefに変更します。
```bash
sed -i 's/quincy/reef/' /etc/apt/sources.list.d/ceph.list
```
## `noout`フラグをセット
アップグレード中にリバランスなどが発生して負荷がかからないように`noout`フラグを有効化します。
必須ではないですが推奨されています。
GUIのOSDタブのGlobal Flags設定からできます。
または、以下のコマンドでも可能です。
```bash
ceph osd set noout
```
## パッケージアップグレード
**各ノード**で以下のコマンドを実行し、Cephのパッケージをアップグレードします。
```bash
apt update
apt full-upgrade
```
途中の画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985470/4e1d5194-bd11-ad85-93d0-7424aa1d3329.png)

## モニターデーモンの再起動
全てのノードでアップグレードした後に、
モニターが実行されている各ノードでモニターを再起動します。
```bash
systemctl restart ceph-mon.target
```
一度に 1 ノードずつ実行します。
再起動するたびに待機し、クラスターのステータスを下記のコマンドで定期的に確認します。
```bash
ceph -s
```
`HEALTH_OK `のステータスか、以下のステータスになるまで待ちます。
```
HEALTH_WARN
noout flag(s) set
```
すべてのモニターが起動したら、モニターのアップグレードが完了したことを確認します。 
以下のコマンドで`min_mon_release 18 (reef)`と出力されることを確認します。
```bsah
ceph mon dump | grep min_mon_release
```
## マネージャーデーモンの再起動
マネージャーがモニターとともに自動的に再起動しなかった場合は、すべてのノードでマネージャーを再起動します。
今回は自動的に再起動しましたので省略しますが、再起動する場合は以下のコマンドを各ノードで実行します。
```bash
systemctl restart ceph-mgr.target
```
実施するときはモニターデーモンの時と同様に1ノードずつステータスを確認しながら行います。
## OSDデーモンの再起動
すべての OSD を以下のコマンドで再起動します。
データの冗長性の損失を避けるため、OSD は一度に 1 つのノードでのみ再起動します。
```bash
systemctl restart ceph-osd.target
```
再起動するたびに待機し、クラスターのステータスを下記のコマンドで定期的に確認します。
```bash
ceph status
```
`HEALTH_OK `のステータスか、以下のステータスになるまで待ちます。
```
HEALTH_WARN
noout flag(s) set
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985470/5727cd21-6256-162f-92df-65ed47c133c6.png)

## Reef 以前の OSD を禁止し、すべての新しい Reef 専用機能を有効にする
以下のコマンドを実行します。
```bash
ceph osd require-osd-release reef
```
## CephFS MDS デーモンのアップグレード
CephFS ファイル システムごとに、次の手順を実施します。
ファイルシステムはWebUIまたは`ceph fs ls`で確認できます。
今回ファイルシステムの名前は`cephfs`です。環境に合わせて読み替えてください。
- `standby_replay`を無効化します。
```bash
ceph fs set cephfs allow_standby_replay false
```
- `max_mds`を1よりも増やしている場合は1に設定する必要があります。
以下のコマンドで`max_mds`の設定値を確認します。
```bash
ceph status
    mds: 1/1 daemons up, 4 standby
ceph fs get cephfs | grep max_mds
max_mds 1
```
今回は1なのでこのまま進みます。
1に設定する必要がある場合は以下のコマンドを実行します。
```bash
ceph fs set <fs_name> max_mds 1
```
- すべてのスタンバイMDS デーモンを停止します。
WebUI の CephFS パネルから行うか、次の CLI コマンドを使用して行うことができます。
```bash
systemctl stop ceph-mds@ID.service
```
これはWebUIの方がどれがスタンバイか分かりやすいのでそちらで実施しました。
- 1 つの MDS だけがオンラインであり、FS のランク 0 にあることを確認します。
```bash
ceph status
    mds: 1/1 daemons up
```
- 下記のコマンドで最初にアクティブなMDSを再起動します。（瞬停します）
その後残っている全てのスタンバイのMDSを再起動します。
```bash
systemctl restart ceph-mds.target
```
- `max_mds`を1よりも大きく設定していた場合は、設定を元に戻します。
今回は1でしたので省略します。
実施する場合は以下のコマンドで行います。
```bash
ceph fs set <fs_name> max_mds <original_max_mds>
```
## `noout`フラグを元に戻す
GUIのOSDタブのGlobal Flags設定からフラグ設定を解除するか、
以下のコマンドを実行します。
```bash
ceph osd unset noout
```

## 正常性確認して完了
オールグリーンを確認してアップグレード完了です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985470/c6e43755-f812-6ad5-e8b7-2922d021ee80.png)


本家もQuincy と Reef のパフォーマンス比較をするようなことを言っていますが、性能がUPしているようなので余裕があれば実際に測定してみたいです。