Raspberry Piで始めるCeph入門

全国1億3千万人のCephファンのみなさんこんばんは

FUJITSU アドベントカレンダー 8日目の記事です

逸般的誤家庭から一般的ご家庭にCephを普及すべく、k8sを始めようと思って机の隅っこでホコリを被っているであろうRaspberry Piを活用して、RasPi Cephクラスタを始めようというのが、今回のテーマです

RasPiやCephについては、周知でしょうからここでは技術的な紹介は省いて、構築をささっといきたいと思います。

# 前置き
今回構築するのは、
Cephクラスタ（3ノード）とRados Gateway(S3/Swift互換）（以下RGW）の構築です。
先に言っておくと、RGWをRasPiで動かそうとするとエラー吐いて落ちるので、こいつだけx86の上で動いています。
また、Cephクラスタには、ノードに１OSD/DISKが必要となりますが、これをUSBメモリで代用します。

## 今回の機材
Cephクラスタ：RasPi3 3台
OSD用DISK代わりのUSBメモリ：３本
RGW：LIVAの小型PC
　　　過去に[この記事](https://qiita.com/tnaoto/items/3eb92ed07d9e71d84f53)で使ったやつ

## ソフトウェア
### OS
RasPi: Raspbian(201909)
RGW  : debian10 
       RaspbianのベースであるDebian１０を使います。
### Ceph
Raspbian/debianに付属する Ceph(Luminous)

# 構成図

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28157/e2788d6c-39fd-79e2-0d89-0664d52bae44.jpeg)

cephで定番のPublicネットワーク構成を取らずにフラット構成としています
RasPiに限らず、すべてVMで作る場合もフラット構成は有用です。

参考（Publicネットワークを使う場合）
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28157/28d7a4bd-6233-a65d-4812-c3ace3b8a061.jpeg)


## Cephクラスタのセットアップ
Raspbian/Debianは特に気にせずセットアップして起動します。
Cephのセットアップは、本家公式のLuminousを参照します

[Cephのセットアップマニュアル](https://docs.ceph.com/docs/luminous/start/)

### 公式との差異

はじめにCephのリポジトリをセットする部分は省略します。
また台数の都合で、admin-nodeが用意できなかったので、node1で代用します。

[セットアップマニュアル](https://docs.ceph.com/docs/luminous/start/quick-start-preflight/#debian-ubuntu)のここから始める
3. Update your repository and install ceph-deploy:

追加

```
apt-get install lvm2
```

あとは、マニュアル通りにセットアップを進めていきます。

[CREATE A CLUSTER](https://docs.ceph.com/docs/luminous/start/quick-ceph-deplo)の
2.If you have more than one network interface, add the public network setting under the [global] section of your Ceph configuration file. See the Network Configuration Reference for details.　の部分では、フラットであれば、そのネットワークアドレスを書いておけば問題ありません。
他の機材が同じサブネットにいても、Cephクラスタには影響ありません。

RGWノードのセットアップもここで合わせて行っておきます。
具体的には、node1,2,3と同様にノード名:rgwにもsshのキーを配り、名前解決できるようにしておきます。


## RGWの構築
[マニュアル](https://docs.ceph.com/docs/luminous/start/quick-ceph-deploy/#add-an-rgw-instance)の指定だと、node1に同居していることになっているため、
事前に、admin-node(今回だとnode1)で、RGWの名前が解決できるようになっていれば問題ありません

例

```
ceph-deploy rgw create rgw
```

### OSDの用意
https://docs.ceph.com/docs/luminous/rados/deployment/ceph-deploy-osd/

OSDを作成追加します

例

```sh
ceph-deploy osd create --data /dev/sda1 node1
```
これだけで作成できます
OSDは、LVM上にBluestoreタイプで作成されます。

ただし、lvm関係でRaspiだと死ぬっぽく、失敗したら、pvremove/lvremoveなどを駆使して失敗して綺麗にして、再度実行すれば成功します。（初回は必ず死ぬかもしれない）

### s3ユーザを作る

rgwのadminガイドの[このあたり](https://docs.ceph.com/docs/luminous/radosgw/admin/)を見ながら、ユーザを作成する。
実行は、node1の上で問題ない

例

```sh
sudo radosgw-admin user create --uid="testuser" --display-name="First User"
```

実行例

```console
pi@node1:~ $ sudo radosgw-admin user info --uid=testuser
{
    "user_id": "testuser",
    "display_name": "First User",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "auid": 0,
    "subusers": [],
    "keys": [
        {
            "user": "testuser",
            "access_key": "xxx",
            "secret_key": "xxx"
        }
    ],
    "swift_keys": [],
    "caps": [],
    "op_mask": "read, write, delete",
    "default_placement": "",
    "placement_tags": [],
    "bucket_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "user_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "temp_url_keys": [],
    "type": "rgw"
}
```

access_key/secret_keyを使って、あとは遊びましょう
USBメモリのアクセスランプが綺麗に光ってアクセスはよく見えます。

##終わりに

できあがったクラスタの状態

```console
pi@node1:~ $ sudo ceph -s
  cluster:
    id:     1ae87c09-6e16-483b-9c5c-5d173df32e79
    health: HEALTH_WARN
            41/1135 objects unfound (3.612%)

  services:
    mon: 3 daemons, quorum node1,node2,node3
    mgr: node1(active), standbys: node2, node3
    osd: 3 osds: 3 up, 3 in

  data:
    pools:   8 pools, 184 pgs
    objects: 1.14k objects, 3.00GiB
    usage:   12.0GiB used, 32.2GiB / 44.3GiB avail
    pgs:     123/3405 objects degraded (3.612%)
             41/1135 objects unfound (3.612%)
             183 active+clean
             1   active+recovery_wait

```

```console
pi@node1:~ $ sudo ceph osd tree
ID CLASS WEIGHT  TYPE NAME      STATUS REWEIGHT PRI-AFF
-1       3.00000 root default
-3       1.00000     host node1
 0   hdd 1.00000         osd.0      up  1.00000 1.00000
-5       1.00000     host node2
 1   hdd 1.00000         osd.1      up  1.00000 1.00000
-7       1.00000     host node3
 2   hdd 1.00000         osd.2      up  1.00000 1.00000
```

ceph ダッシュボード
<img width="1439" alt="3.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28157/79d53519-28b6-e39d-874a-77109636b3cc.jpeg">


あとは、 cephを使い倒して、upstreamコントリビューションすれば完璧です。

おわり