#Rook.ioを試してみた~導入編
前置き
- Rook.ioとはKubernetes上でCephを取り扱うソリューション。
- Container上からDeviceの管理をしてしまう驚きの挙動。
KubernetesやUbuntuやCephがどんどん新しくなってきているのでまとめて検証してやろうとの思いから試してみました。
Kernelを抽象化してしまってCephなんて動くんだろうか?と思う今日この頃。まぁ、書いているからには動いたんですが。。。
rook.io documents
ドキュメントにデプロイしたらそれでできた。すげぇ。
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構成などのパフォーマンス検証をやっていく予定。