ARMボード色々でおうちDockerSwarmクラスタ Ceph編(失敗)

何百番煎じどころか 何千番煎じか分かりませんが クラスタを作っている所(進行形)なのでそのメモを残していきます。この記事ではおうちARMボードに、Cephを入れていきます。実際には上手く行かなかったのですが、試してみた、というメモとして残します。

### おうちクラスタシリーズ
- 第1弾: [ハードウェア編](https://qiita.com/Domao/items/093c93ff5f3ee6f49cea) 
- 第2弾: Portainer編
- 第3弾: Ceph編(ここ)

## Cephについて
複数のストレージを使って分散型オブジェクトストレージを作れるOSSです。S3的な使い方もできるし、単にファイルを入れてくファイルシステムとしても使えます。ソフトウェアRAID的なやつです。([分散ストレージ ソフトウェア Ceph（セフ）とは](https://miyabikno-jobs.com/summary-pythonista/)等参照)

## GlusterFSってやつもあると聞いたけど?
導入がシンプルで、要求スペックも低いのだけど転送パフォーマンスがCephより悪いらしいです。(ソースは不明)あとS3が使えたほうが後々便利そうなのでCephにします。

## 導入
他の記事ではCeph-deployがよく出てくるのですが、現在非推奨になっているようなので、cephadmを使う最新の方法で導入します。

```shell:lvm2のインストール(Cephクラスタに参加させる全ノードに)
sudo apt-get install lvm2
```

```shell:cephadmのインストール
curl --silent --remote-name --location https://github.com/ceph/ceph/raw/pacific/src/cephadm/cephadm
chmod +x cephadm
sudo ./cephadm add-repo --release pacific
sudo ./cephadm install
```

```shell:モニターデーモンの作成
sudo cephadm bootstrap --mon-ip 192.168.0.X(モニターデーモンとして動作させるアドレス)
```
必要なDockerImageをPullしてきたり、設定したりしてくるのでそこそこ時間かかります
おわったらダッシュボードのアドレスとユーザー名、パスワード等が表示されます。

```shell:CephFSファイルシステムをマウントする場合インストール
sudo cephadm install ceph-common
```

```shell:Cephではホスト名ベースで処理をするようなので変更したい場合はここでやっておく
sudo nano /etc/hostname
sudo nano /etc/hosts
```

```shell:CephではIPアドレスが動的に変わったらダメなようなので固定していない場合は固定しておく
# debian系の場合
sudo nano /etc/network/interfaces

# dietpiの場合
sudo dietpi-config
Network Options: Adapters -> Ethernet -> Change mode -> Copy(現在の接続構成をコピー) -> StaticIP(変更) -> Apply
```

```shell:Cephではノード間の時刻差が0.05秒以下でないといけないのでNTP同期を有効にする
# 本来LAN内にNTP鯖を建てるのが望ましいようだが、今回はインターネットから取得する
# 下記コマンドは時刻同期が有効か確認する / loadedは実行していないことを示す
# dietpiの場合、起動時に一瞬だけ同期してその後は同期されない仕様らしい
sudo systemctl status systemd-timesyncd
# 時刻同期サービスを有効化
sudo systemctl enable systemd-timesyncd
# 時刻同期サービスを起動
sudo systemctl start systemd-timesyncd
```

```shell:クラスタにしたいノードそれぞれのhostsにそれぞれのホスト名とアドレスを登録しておく
sudo nano /etc/hosts
```

```shell:モニターデーモンを作成したノード上でSSH鍵を登録する
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ホスト名
# まだ署名がsshに入っていないが接続していいか訊かれる
yes
# rootのパスワードを求められるので入力する
# dietpiの場合(セットアップによるが)ユーザーパスワードと同じになっているかも
password
# Number of key(s) added: 1
# Now try logging into the machine, with:   "ssh 'root@ホスト名'"
# と言われるので試しに接続する
ssh root@ホスト名
# パスワードを求められるので入力する
password
# 接続できるはず、接続できた場合は即exitで構わない
exit
```

```shell:Cephに新しいノードの存在を教える
sudo ceph orch host add ホスト名 ホストのIPアドレス
# うまく行っていたら以下のようなことを言われる
#  Added host 'ホスト名' with addr 'ホストのIPアドレス'
# 問題があった場合以下のようなことを言われる
#  lvcreate binary does not appear to be installed: lvm2が入っていない
#  No time synchronization is active: 時刻同期が有効でない
```
```shell:CephにOSDとして追加できるデバイス一覧を表示する
sudo ceph orch device ls
```
Cephに追加できる条件は下記のようになっている
- デバイスにはパーティションがあってはなりません。
- デバイスはLVM状態であってはなりません。
- デバイスをマウントしないでください。
- デバイスにファイルシステムが含まれていてはなりません。
- デバイスにCephBlueStoreOSDが含まれていてはなりません。
- デバイスは5GBより大きくする必要があります。

```shell:CephにOSDとして追加する
sudo ceph orch daemon add osd ホスト名:/dev/sda
```

ここで、 デバイスにパーティションが複数あるので追加できないことに気づいてしまった。
どうやらOctopus版になる前のFilestoreではできたようだが、現行のBluestoreという方式ではパーティションを使えないらしい。
[https://github.com/rook/rook/issues/6849](https://github.com/rook/rook/issues/6849)

ならばFilestoreとして作成すればいいのではないかと思い やってみた。

```shell:Cephのボリュームとして作成できるかを確認する(実際にやる場合はprepareをcreateにする)
sudo cephadm shell ceph-volume lvm prepare --data /dev/sda2
#
#  auth: unable to find a keyring on /var/lib/ceph/bootstrap-osd/ceph.keyring: (2) No such file or directory
#  monclient(hunting): handle_auth_bad_method server allowed_methods [2] but i only support [1]
#  [errno 13] RADOS permission denied (error connecting to the cluster)
```

恐らくだが、cephadmを使う場合想定されていない動作の様子。うーん、どうしよう困った...

### なので
とりあえず諦めて、1台のパーティションを全て消して、まるごとボリュームとして扱うことにした。

### そして改めて ceph daemon add osd したところ
`FileNotFoundError: [Errno 2] No such file or directory: '/usr/lib/sysctl.d/90-ceph-165bb7e6-e4c3-11eb-aa5e-00e04c6800f3-osd.conf'` と言われてうまく行かなかった。
`sudo ceph log last cephadm`すると 実行ログが出るというのを見てやってみたところ
`armv7用のceph/cephが見つからない` / `arm64用のceph-grafanaが見つけられない` などのFatalエラーが暴れ回っていった
どうやらこの方法では、ARMのDockerイメージがまだ用意されてないため、うまくいかないのかも...
今回は一旦Cephの導入を諦めることにした。

# Cephの削除
仮想ボリュームなどが結構作られるので、完全に初期化して元に戻そうとすると結構めんどくさい手順が必要でした。この手順だとcephadmは消えませんが容量を取る以外に邪魔にはならないので放置します。

```shell:サービスとファイルの削除
sudo systemctl stop ceph.target
sudo systemctl disable ceph.target
sudo rm /etc/systemd/system/ceph.target
sudo rm -rf /etc/ceph/*
sudo rm -rf /var/log/ceph/*
```
```shell:Ceph用仮想ボリュームの消去
sudo lvs
sudo vgremove 表示されるvg
y
y
sudo pvremove /dev/sda
```

```shell:実行中のCephの削除
# Portainerなどで開いて コンテナを削除
```

## 参考リンク
[Raspberry Piで始めるCeph入門 - qiita @tnaoto](https://qiita.com/tnaoto/items/c5df17e21a694758c21c)
[DEPLOYING A NEW CEPH CLUSTER - Ceph doc](https://docs.ceph.com/en/latest/cephadm/install/#requirements)