【2024年7月版】Ubuntu で Cephクラスタの構築、NFSからの利用メモ【分散ストレージ, CephFS, NFS, Ganesha】

# はじめに

3台のUbuntu22.04で、Cephのクラスタを構築して、NFSでクライアントのUbuntu22.04からマウントしてRead/Writeのパフォーマンスを計測してみたいな。。。

基本的なCephクラスタの構築と、NFSでのマウントをしてみたメモ

```plantuml
@startuml

rectangle "Cephクラスタ" as ceph {
node ct1 {
  database "osd" as osd1
}
node ct2 {
  database "osd" as osd2
}
node ct3 {
  database "osd" as osd3
}

database "CephFS" as cephfs
component "NFS Ganesha" as ganesha
}

ct1 -- ct2
ct1 -- ct3
ct2 -- ct3
cephfs -- ganesha

node ct4

ganesha - ct4 : NFS 

@enduml
```

# 前提

- Ubuntu22.04 x 3 でクラスタを構築
	- 192.168.120.141 ct1
	- 192.168.120.142 ct2
	- 192.168.120.143 ct3
- Ubuntu22.04 のクライアントで、NFS経由でマウント
	- 192.168.120.144 ct4
- NFSマウントしたディスクのパフォーマンスを計測

# 手順

## Cephのクラスタ構築

以下の手順はすべてのクラスタノードで行います
### hostsファイルの設定

クラスタのメンバーをhostsファイルに登録します

```
192.168.120.141 ct1
192.168.120.142 ct2
192.168.120.143 ct3
192.168.120.144 ct4
```
### Cephのインストール

```
sudo apt update
sudo apt install -y cephadm
```

### sshdの設定

Ubuntuではデフォルトの設定ではrootによるログインはできないようになっているので許可します。
`PermitRootLogin yes`の記述を、`/etc/ssh/sshd_config`に追記します。
その後、`sudo systemctl restart sshd` で設定を読み込ませます。

```/etc/ssh/sshd_config
#PermitRootLogin prohibit-password
PermitRootLogin yes
```

## クラスタのブートストラップ

以下の手順は、adminノードとなる、ct1 で行います。

```
$ sudo cephadm bootstrap --mon-ip 192.168.120.141
Verifying podman|docker is present...
Verifying lvm2 is present...
Verifying time synchronization is in place...
Unit systemd-timesyncd.service is enabled and running
Repeating the final host check...
docker (/usr/bin/docker) is present
systemctl is present
lvcreate is present
Unit systemd-timesyncd.service is enabled and running
Host looks OK
  :
  :
Ceph Dashboard is now available at:

    URL: https://ct1:8443/
    User: admin
  :
  :
Bootstrap complete.  
```

ブートストラップが完了したので、Cephのステータスを確認します。設定が完了していないので、HEALTH_WARNが表示されますが、続けます。

```
$ sudo cephadm shell -- ceph status
Inferring fsid 27cba866-476b-11ef-8d08-757740329b50
Inferring config /var/lib/ceph/27cba866-476b-11ef-8d08-757740329b50/mon.ct1/config
Using ceph image with id 'ff4519c9e0a2' and tag 'v17' created on 2024-05-21 16:09:44 +0000 UTC
quay.io/ceph/ceph@sha256:d26c11e20773704382946e34f0d3d2c0b8bb0b7b37d9017faa9dc11a0196c7d9
  cluster:
    id:     27cba866-476b-11ef-8d08-757740329b50
    health: HEALTH_WARN
            OSD count 0 < osd_pool_default_size 3

  services:
    mon: 1 daemons, quorum ct1 (age 3m)
    mgr: ct1.kkgdsb(active, since 28s)
    osd: 0 osds: 0 up, 0 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:
```

ブートストラップで表示されていたURLへUser/Passwordでログインできることも確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/f1cd0b83-127d-5a99-ca26-b53c787e3e46.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/bc0b246b-1c2f-fdf3-5c9d-cb1922f7f606.png)

OSDで利用できるデバイスの確認を行います

```
$ sudo cephadm shell -- ceph orch device ls
Inferring fsid 27cba866-476b-11ef-8d08-757740329b50
Inferring config /var/lib/ceph/27cba866-476b-11ef-8d08-757740329b50/mon.ct1/config
Using ceph image with id 'ff4519c9e0a2' and tag 'v17' created on 2024-05-21 16:09:44 +0000 UTC
quay.io/ceph/ceph@sha256:d26c11e20773704382946e34f0d3d2c0b8bb0b7b37d9017faa9dc11a0196c7d9
HOST  PATH      TYPE  DEVICE ID                   SIZE  AVAILABLE  REFRESHED  REJECT REASONS  
ct1   /dev/sdb  hdd   QEMU_HARDDISK_drive-scsi1  10.0G  Yes        64s ago
```

`/dev/sdb` が利用可能なので追加します。

```
$ sudo cephadm shell -- ceph orch daemon add osd ct1:/dev/sdb
Inferring fsid dea53f62-4774-11ef-9306-31f86fedd53e
Inferring config /var/lib/ceph/dea53f62-4774-11ef-9306-31f86fedd53e/mon.ct1/config
Using ceph image with id 'ff4519c9e0a2' and tag 'v17' created on 2024-05-21 16:09:44 +0000 UTC
quay.io/ceph/ceph@sha256:d26c11e20773704382946e34f0d3d2c0b8bb0b7b37d9017faa9dc11a0196c7d9
Created osd(s) 0 on host 'ct1'
```

追加された内容を確認します。

```
$ sudo cephadm shell -- ceph osd tree
Inferring fsid dea53f62-4774-11ef-9306-31f86fedd53e
Inferring config /var/lib/ceph/dea53f62-4774-11ef-9306-31f86fedd53e/mon.ct1/config
Using ceph image with id 'ff4519c9e0a2' and tag 'v17' created on 2024-05-21 16:09:44 +0000 UTC
quay.io/ceph/ceph@sha256:d26c11e20773704382946e34f0d3d2c0b8bb0b7b37d9017faa9dc11a0196c7d9
ID  CLASS  WEIGHT   TYPE NAME      STATUS  REWEIGHT  PRI-AFF
-1         0.00980  root default                            
-3         0.00980      host ct1                            
 0    hdd  0.00980          osd.0      up   1.00000  1.00000
```

## クラスタへのホストの追加

`/etc/ceph/ceph.pub` の内容を、各ホストのrootユーザ の `.ssh/authorized_keys` に追加します。
`ct1` でブートストラップを行ったので、すでにrootユーザの `.ssh/authorized_keys` には追加されています。`ct2`, `ct3` で追加を行います。

その後、以下の手順を`ct1`で行います。

`ct2` をクラスタへ追加します。
```
$ sudo cephadm shell -- ceph orch host add ct2 192.168.120.142
Inferring fsid dea53f62-4774-11ef-9306-31f86fedd53e
Inferring config /var/lib/ceph/dea53f62-4774-11ef-9306-31f86fedd53e/mon.ct1/config
Using ceph image with id 'ff4519c9e0a2' and tag 'v17' created on 2024-05-21 16:09:44 +0000 UTC
quay.io/ceph/ceph@sha256:d26c11e20773704382946e34f0d3d2c0b8bb0b7b37d9017faa9dc11a0196c7d9
Added host 'ct2' with addr '192.168.120.142'
```

`ct3` をクラスタへ追加します。
```
$ sudo cephadm shell -- ceph orch host add ct3 192.168.120.143
Inferring fsid dea53f62-4774-11ef-9306-31f86fedd53e
Inferring config /var/lib/ceph/dea53f62-4774-11ef-9306-31f86fedd53e/mon.ct1/config
Using ceph image with id 'ff4519c9e0a2' and tag 'v17' created on 2024-05-21 16:09:44 +0000 UTC
quay.io/ceph/ceph@sha256:d26c11e20773704382946e34f0d3d2c0b8bb0b7b37d9017faa9dc11a0196c7d9
Added host 'ct3' with addr '192.168.120.143'
```

追加されたホストを確認します。

```
$ sudo cephadm shell -- ceph orch host ls
Inferring fsid dea53f62-4774-11ef-9306-31f86fedd53e
Inferring config /var/lib/ceph/dea53f62-4774-11ef-9306-31f86fedd53e/mon.ct1/config
Using ceph image with id 'ff4519c9e0a2' and tag 'v17' created on 2024-05-21 16:09:44 +0000 UTC
quay.io/ceph/ceph@sha256:d26c11e20773704382946e34f0d3d2c0b8bb0b7b37d9017faa9dc11a0196c7d9
HOST  ADDR             LABELS  STATUS  
ct1   192.168.120.141  _admin          
ct2   192.168.120.142                  
ct3   192.168.120.143                  
3 hosts in cluster
```

`ct1` と同様に、`ct2`と`ct3`で、OSDの追加を行います。クラスタの設定が完了しているので、`ct2`と`ct3`のOSDは`ct1`から追加可能です。

```
$ sudo cephadm shell -- ceph orch device ls
Inferring fsid dea53f62-4774-11ef-9306-31f86fedd53e
Inferring config /var/lib/ceph/dea53f62-4774-11ef-9306-31f86fedd53e/mon.ct1/config
Using ceph image with id 'ff4519c9e0a2' and tag 'v17' created on 2024-05-21 16:09:44 +0000 UTC
quay.io/ceph/ceph@sha256:d26c11e20773704382946e34f0d3d2c0b8bb0b7b37d9017faa9dc11a0196c7d9
HOST  PATH      TYPE  DEVICE ID                   SIZE  AVAILABLE  REFRESHED  REJECT REASONS                                                           
ct1   /dev/sdb  hdd   QEMU_HARDDISK_drive-scsi1  10.0G  No         2m ago     Has a FileSystem, Insufficient space (<10 extents) on vgs, LVM detected  
ct3   /dev/sdb  hdd   QEMU_HARDDISK_drive-scsi1  10.0G  Yes        22s ago
$ sudo cephadm shell -- ceph orch daemon add osd ct3:/dev/sdb
Inferring fsid dea53f62-4774-11ef-9306-31f86fedd53e
Inferring config /var/lib/ceph/dea53f62-4774-11ef-9306-31f86fedd53e/mon.ct1/config
Using ceph image with id 'ff4519c9e0a2' and tag 'v17' created on 2024-05-21 16:09:44 +0000 UTC
quay.io/ceph/ceph@sha256:d26c11e20773704382946e34f0d3d2c0b8bb0b7b37d9017faa9dc11a0196c7d9
Created osd(s) 1 on host 'ct3'
  :
  :
$ sudo cephadm shell -- ceph orch daemon add osd ct3:/dev/sdb
  :
  :
$ sudo cephadm shell -- ceph orch device ls
Inferring fsid dea53f62-4774-11ef-9306-31f86fedd53e
Inferring config /var/lib/ceph/dea53f62-4774-11ef-9306-31f86fedd53e/mon.ct1/config
Using ceph image with id 'ff4519c9e0a2' and tag 'v17' created on 2024-05-21 16:09:44 +0000 UTC
quay.io/ceph/ceph@sha256:d26c11e20773704382946e34f0d3d2c0b8bb0b7b37d9017faa9dc11a0196c7d9
HOST  PATH      TYPE  DEVICE ID                   SIZE  AVAILABLE  REFRESHED  REJECT REASONS                                                           
ct1   /dev/sdb  hdd   QEMU_HARDDISK_drive-scsi1  10.0G  No         9m ago     Has a FileSystem, Insufficient space (<10 extents) on vgs, LVM detected  
ct2   /dev/sdb  hdd   QEMU_HARDDISK_drive-scsi1  10.0G  No         13s ago    Has a FileSystem, Insufficient space (<10 extents) on vgs, LVM detected  
ct3   /dev/sdb  hdd   QEMU_HARDDISK_drive-scsi1  10.0G  No         6m ago     Has a FileSystem, Insufficient space (<10 extents) on vgs, LVM detected
$ sudo cephadm shell -- ceph osd tree
Inferring fsid dea53f62-4774-11ef-9306-31f86fedd53e
Inferring config /var/lib/ceph/dea53f62-4774-11ef-9306-31f86fedd53e/mon.ct1/config
Using ceph image with id 'ff4519c9e0a2' and tag 'v17' created on 2024-05-21 16:09:44 +0000 UTC
quay.io/ceph/ceph@sha256:d26c11e20773704382946e34f0d3d2c0b8bb0b7b37d9017faa9dc11a0196c7d9
ID  CLASS  WEIGHT   TYPE NAME      STATUS  REWEIGHT  PRI-AFF
-1         0.02939  root default                            
-3         0.00980      host ct1                            
 0    hdd  0.00980          osd.0      up   1.00000  1.00000
-7         0.00980      host ct2                            
 2    hdd  0.00980          osd.2      up   1.00000  1.00000
-5         0.00980      host ct3                            
 1    hdd  0.00980          osd.1      up   1.00000  1.00000
```

ステータスで、問題がないことを確認します。

```
$ sudo cephadm shell -- ceph status
Inferring fsid dea53f62-4774-11ef-9306-31f86fedd53e
Inferring config /var/lib/ceph/dea53f62-4774-11ef-9306-31f86fedd53e/mon.ct1/config
Using ceph image with id 'ff4519c9e0a2' and tag 'v17' created on 2024-05-21 16:09:44 +0000 UTC

quay.io/ceph/ceph@sha256:d26c11e20773704382946e34f0d3d2c0b8bb0b7b37d9017faa9dc11a0196c7d9
  cluster:
    id:     dea53f62-4774-11ef-9306-31f86fedd53e
    health: HEALTH_OK
  services:
    mon: 3 daemons, quorum ct1,ct2,ct3 (age 2m)
    mgr: ct1.xnsnuz(active, since 59m), standbys: ct2.edmzbz
    osd: 3 osds: 3 up (since 94s), 3 in (since 116s)
  data:
    pools:   1 pools, 1 pgs
    objects: 2 objects, 577 KiB
    usage:   873 MiB used, 29 GiB / 30 GiB avail
    pgs:     1 active+clean
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/dd4adc6f-a3fa-4fe9-8a7c-e470f0f13aae.png)

## CephFSの作成

CephFSを作成して、ステータスを確認します。

```
$ sudo cephadm shell -- ceph fs volume create ctcephfs
Inferring fsid dea53f62-4774-11ef-9306-31f86fedd53e
Inferring config /var/lib/ceph/dea53f62-4774-11ef-9306-31f86fedd53e/mon.ct1/config
Using ceph image with id 'ff4519c9e0a2' and tag 'v17' created on 2024-05-21 16:09:44 +0000 UTC
quay.io/ceph/ceph@sha256:d26c11e20773704382946e34f0d3d2c0b8bb0b7b37d9017faa9dc11a0196c7d9
$ sudo cephadm shell -- ceph fs status
Inferring fsid dea53f62-4774-11ef-9306-31f86fedd53e
Inferring config /var/lib/ceph/dea53f62-4774-11ef-9306-31f86fedd53e/mon.ct1/config
Using ceph image with id 'ff4519c9e0a2' and tag 'v17' created on 2024-05-21 16:09:44 +0000 UTC
quay.io/ceph/ceph@sha256:d26c11e20773704382946e34f0d3d2c0b8bb0b7b37d9017faa9dc11a0196c7d9
ctcephfs - 0 clients
========
RANK  STATE           MDS             ACTIVITY     DNS    INOS   DIRS   CAPS  
 0    active  ctcephfs.ct3.imtgwz  Reqs:    0 /s    10     13     12      0   
        POOL            TYPE     USED  AVAIL  
cephfs.ctcephfs.meta  metadata  96.0k  9432M  
cephfs.ctcephfs.data    data       0   9432M  
    STANDBY MDS      
ctcephfs.ct2.jxafvw  
MDS version: ceph version 17.2.7 (b12291d110049b2f35e32e0de30d70e9a4c060d2) quincy (stable)
```

## NFS-Ganeshaの設定

CephにNFS経由でアクセスする場合、`nfs-ganesha`を利用します。以下の手順は `ct1` で行います。

### NFS-Ganeshaのインストール

```
$ sudo apt install nfs-ganesha nfs-ganesha-ceph
```

### シークレットキーの取得

```
$ sudo cephadm shell -- ceph auth get-key client.admin
Inferring fsid dea53f62-4774-11ef-9306-31f86fedd53e
Inferring config /var/lib/ceph/dea53f62-4774-11ef-9306-31f86fedd53e/mon.ct1/config
Using ceph image with id 'ff4519c9e0a2' and tag 'v17' created on 2024-05-21 16:09:44 +0000 UTC
quay.io/ceph/ceph@sha256:d26c11e20773704382946e34f0d3d2c0b8bb0b7b37d9017faa9dc11a0196c7d9
*************** secret ****************
```
### NFS-Ganeshaの設定ファイルを編集

```/etc/ganesha/ganesha.conf
EXPORT
{
    Export_ID=1;  # 識別子。必要に応じて変更
    Path = "/";  # エクスポートするCephFSのパス。通常は"/"
    Pseudo = "/cephfs";  # NFSクライアントがマウントするパス。この例では"/cephfs"
    Access_Type = RW;  # 読み書き可能な設定
    Squash = No_Root_Squash;  # Root権限のSquash設定。必要に応じて変更
    Attr_Expiration_Time = 0;  # 属性のキャッシュ時間。0はキャッシュしない設定
    FSAL {
        Name = CEPH;  # CephFSを使用するためのFSALモジュール
        User_Id = "admin";  # CephクラスターにアクセスするユーザーID。管理者のユーザー名に変更
        Secret_Access_Key = "*************** secret ****************";  # Cephユーザーのシークレットキー。対応するシークレットキーに変更。ceph auth get-keyで取得。
        Ceph_Cluster = "ceph";  # Cephクラスター名。通常は"ceph"
    }
    CLIENT {
        Clients = *;  # クライアントのIPアドレスまたはネットワーク。例: "192.168.1.0/24"。すべてのクライアントにアクセスを許可する場合は"*"
        Access_Type = RW;  # クライアントのアクセス権。読み書き可能な設定
    }
}
```

### NFS-Ganeshaの再起動

設定を反映させるため、サービスを再起動します。

```
sudo systemctl restart nfs-ganesha
```

### マウントリストの確認

NFSが公開されているか確認します。

```
$ showmount -e localhost
Export list for localhost:
/ *
```

## クライアントからのNFSマウント

以下の手順は クライアントである、`ct4` 上で行います。

### NFSクライアントのインストール

```
$ sudo apt update
$ sudo apt install nfs-common
```

### NFS共有のマウント

NFS-Ganeshaが動作しているサーバーのIPアドレスを使用して、NFS共有をマウントします。

#### マウントディレクトリの作成

```
sudo mkdir -p /mnt/cephfs
```

#### マウント

```
$ sudo mount -t nfs 192.168.120.141:/cephfs /mnt/cephfs
```

#### 確認

```
$ df -h
Filesystem                         Size  Used Avail Use% Mounted on
tmpfs                               96M  1.1M   95M   2% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   38G  4.9G   32G  14% /
  :
  :
192.168.120.141:/cephfs            9.3G     0  9.3G   0% /mnt
```

## CephFSをNFSマウントしたパフォーマンス

### 作業ディレクトリを作成

```
$ sudo mkdir -p /mnt/cephfs/ptest
$ cd /mnt/cephfs/ptest
```

### パフォーマンスの計測

`dd` で、1GBを書き込みしてみます。この環境では45.8MB/sぐらいでているようです。

```
$ sudo dd if=/dev/zero of=/mnt/cephfs/ptest/test.dat bs=10M count=100 status=progress
1048576000 bytes (1.0 GB, 1000 MiB) copied, 22 s, 48.5 MB/s
100+0 records in
100+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 22.8911 s, 45.8 MB/s
```

`f3` で、3GBを書き込みして、読込してみます。この環境では、Write 36.14MB/s、Read 104.51MB/s ぐらいでているようです。

```
$ sudo f3write . --end-at=3
F3 write 8.0
Copyright (C) 2010 Digirati Internet LTDA.
This is free software; see the source for copying conditions.

Free space: 9.20 GB
Creating file 1.h2w ... OK!                         
Creating file 2.h2w ... OK!                         
Creating file 3.h2w ... OK!                        
Free space: 6.37 GB
Average writing speed: 36.14 MB/s
dev@ubuntu04:/mnt/cephfs/ptest$ sudo f3read .
F3 read 8.0
Copyright (C) 2010 Digirati Internet LTDA.
This is free software; see the source for copying conditions.

                  SECTORS      ok/corrupted/changed/overwritten
Validating file 1.h2w ... 2097152/        0/      0/      0
Validating file 2.h2w ... 2097152/        0/      0/      0
Validating file 3.h2w ... 2097152/        0/      0/      0

  Data OK: 3.00 GB (6291456 sectors)
Data LOST: 0.00 Byte (0 sectors)
           Corrupted: 0.00 Byte (0 sectors)
    Slightly changed: 0.00 Byte (0 sectors)
         Overwritten: 0.00 Byte (0 sectors)
Average reading speed: 104.51 MB/s
```

# さいごに

かんたんでしたね

# 参考リンク

- [ceph | cephadm | DEPLOYING A NEW CEPH CLUSTER](https://docs.ceph.com/en/latest/cephadm/install/#cephadm-deploying-new-cluster)
- [ceph | ceph filesystem | NFS](https://docs.ceph.com/en/latest/cephfs/nfs/?highlight=nfs)