Rook.io

#Rook.ioを試してみた～導入編
## 前置き
- Rook.ioとはKubernetes上でCephを取り扱うソリューション。
- Container上からDeviceの管理をしてしまう驚きの挙動。

KubernetesやUbuntuやCephがどんどん新しくなってきているのでまとめて検証してやろうとの思いから試してみました。
Kernelを抽象化してしまってCephなんて動くんだろうか？と思う今日この頃。まぁ、書いているからには動いたんですが。。。
[rook.io documents](https://rook.io/docs/rook/master/)
ドキュメントにデプロイしたらそれでできた。すげぇ。
Statefulな環境を作るときには必ずPersistent Volumeが必要になってくるが、高可用性のあるStorageをお持ちでいない方にはお手軽に導入できるソリューションとしてお勧めです。
Cloud上でKubernetesを動かしている方はCloud NativeなVolumeを使っているかと思われますが、Cloud Look-inされないデータストアソリューションを探していきつきました。クラウド間の移行検証などもそのうちやりたいと思っています。
今回は性能検証については触れないです。仮想上で動かしているのでたぶんかなり遅い。そのうち物理やLocal SSDを使った環境で性能検証はしてみる予定です。

## 環境
- Kubernetes 1.10.1
- Ceph 12.2.5
- docker 17.12.1-ce
- Ubuntu 18.04 LTS
- vSphere 6.5
- 4 vCPU, 16 GB Memory
- Flannel
- Master Node 1, Woker Node 5
- rook

## Setup 1
Kubernetes知っていて、Rook.ioのみ知りたい方はSetup 2から参照。
仮想環境上にVMを作成して、そこにkubeadmで環境を作成。NWはFlannelを使用。
前置きはこれくらいにして、以下に実際に打ったコマンドや作成された環境の説明を記載。

###1.OSの準備

- 必要者のみ参照。まずはUbuntu 18.04の準備。MinimalなUbuntu Serverの環境を準備する。

コンテナ環境なのであまりOSを意識する必要はないはずだが、18.04を試してみたいという思いもありこれを選定。検証した時点ではまたUbuntuとCephのバージョンによる互換性は当然ない。作り方は特に記載しないがISOから何も考えずに作成した。
[Installing kubeadm] https://kubernetes.io/docs/tasks/tools/install-kubeadm/#before-you-begin
上記に従い環境を整える。

- hostnameの一意性。（18.04のHostnameのつけ方が独特なので「くそっ」と思うかも。Cloud-initやhostnamectlとか詳しくは語らない。）
- IP固定。（これも18.04から独特。netplanとかまたしても「くそっ」と思うかも。）
- ssh key登録

Qiita書いていて気づいたんだけど。Rook.ioやCephも当然System Requiementsが存在するので記載しておく。
[Rook io] (https://rook.io/docs/rook/master/quickstart.html)
Kubernets 1.7以上なら動くらしい。ホンマかいな。
[Ceph Hardware Recommendations] (http://docs.ceph.com/docs/jewel/start/hardware-recommendations/)
動かすだけならそんなに気にしなくても大丈夫なはず。それがコンテナのいいところ。動いてビビったけど。

###2.Kubernetes環境の作成
Master Nodeから以下を実行

```
kubeadm init --pod-network-cidr=10.244.0.0/16
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
```

各Worker Nodeから以下を実施

```
kubeadm join "Master IP Address":6443 --token "Token ID" --discovery-token-ca-cert-hash "Hash Value"
```

Kubernetesの基本作成なので詳しくは説明しない。

##Setup 2
ここからが本題のrook.ioのDeploy。といってもyamlからcreateを数回たたくだけなんだけど。何も考えることなく以下を実施

###3.rook.io Setup

```
git clone https://github.com/rook/rook.git
cd rook/cluster/examples/kubernetes
```

サンプルから環境の作成。yamlの中は詳しく見ていないがとりあえず作ってみてからどんなふうに出来上がるかを考えてみるのがよいかと思います。

```
kubectl create -f rook-operator.yaml
kubectl create -f rook-cluster.yaml
```

これでひとまずはCeph環境の作成完了。
次にKubernetes上にStorageClassを定義してCephを追加する。

```
kubectl create -f rook-storageclass.yaml
```

ついでにサンプルアプリケーションが動くかどうかもチェック。

```
kubectl create -f mysql.yaml
kubectl create -f wordpress.yaml
```

これだけで動くことに感動する。

###4.rgw, mdsをDeployしてObjectとCeph-FSを作成
Ceph環境ができたのでその上で動くRGWとCeph-FSを作ってみる。これもYamlの中身を見ていないが作成された環境を元に考えるのがよいかと思われます。

```
kubectl create -f rook-object.yaml
kubectl -n rook get pod -l app=rook-ceph-rgw
kubectl create -f rook-filesystem.yaml
kubectl -n rook get pod -l app=rook-ceph-mds
```

###5.Rook Toolbox
環境が出来たらCeph Commandを叩くために、Rook toolboxをDeployする。
[toolbox] (https://rook.io/docs/rook/master/toolbox.html)

```
kubectl create -f rook-tools.yaml
kubectl -n rook get pod rook-tools
kubectl -n rook exec -it rook-tools bash

ceph status
ceph osd status
ceph df
rados df
```
出力結果が以下の様になる。

```
  cluster:
    id:     bb1c6597-da38-467f-8b0a-97af0a92e4d6
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum rook-ceph-mon0,rook-ceph-mon2,rook-ceph-mon1
    mgr: rook-ceph-mgr0(active)
    mds: myfs-1/1/1 up  {0=m2kf85=up:active}, 1 up:standby-replay
    osd: 5 osds: 5 up, 5 in
    rgw: 1 daemon active

  data:
    pools:   9 pools, 900 pgs
    objects: 263 objects, 6365 bytes
    usage:   64114 MB used, 251 GB / 313 GB avail
    pgs:     900 active+clean

  io:
    client:   852 B/s rd, 1 op/s rd, 0 op/s wr
```

#感想
あまりにも簡単にCephの導入が出来てしまっていることに驚きを隠せない。もちろんHW構成に合わせた環境を作るためにはCephの理解やYamlの中身を知らなければならないのだが、学習→検証→環境作成の流れで作ってきたものとは真逆の流れで、環境を作ってから理解出来るのがうれしい。次回以降でHWを用いてTier構成などのパフォーマンス検証をやっていく予定。