こんにちは、GMOインターネットグループ株式会社の長谷川です。今回は Kubernetes 環境での Rook Ceph ストレージ に関して語っていこうと思います。
Rook Ceph とは
Rook Cephは、Kubernetes上(k8s上)に分散ストレージのCephをデプロイし、ストレージの運用を自動化するストレージオペレーターで、Cephは分散オブジェクトストレージ機能を提供する、オープンソースのストレージソフトウェアです。https://rook.io/
Kubernetes 環境でデプロイし、ストレージクラスを用意することで、PersistentVolume(PV)を Dynamic Provisioning することが出来ます。
【STEP1】Kubernetes クラスタを用意する。
まず Rook Ceph をデプロイする Kubernetes クラスタを用意しましょう。Ceph のレプリケーションはデフォルトの 3 レプリケーションで行う予定なので今回は以下の構成のクラスタをVMで用意し使用します。
control-plane 3 台
worker node 3 台 + それぞれに 1TB の 追加ストレージ
# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.4 LTS"
# uname -r
5.15.0-100-generic
【STEP2】Kubernetes に Rook Ceph のオペレータをデプロイ
以下のリポジトリからサンプルのマニフェストをダウンロードします。https://github.com/rook/rook
# git clone -b v1.13.6 https://github.com/rook/rook.git
# cd rook/deploy/examples/
ダウンロード完了後は マニフェストのあるディレクトリに移動します。早速、構築に必要になるマニフェストをデプロイしていきます。
# kubectl apply -f crds.yaml -f common.yaml -f operator.yaml
デプロイが完了したら operator の pod が起動するまで待ちます。
# kubectl get pod -n rook-ceph --selector=app=rook-ceph-operator
NAME READY STATUS RESTARTS AGE
rook-ceph-operator-5f9bc6d66d-bz4mx 1/1 Running 0 2d23h
また 2024年3月現在では RBAC に関してもデプロイしないと次のステップの Rook Ceph クラスタのデプロイが出来ないのでデプロイしておきます。
# kubectl apply -f monitoring/rbac.yaml
【STEP3】Kubernetes に Rook Ceph cluster をデプロイ
Rook Ceph クラスタをデプロイします。今回は worker node に 1TB の追加ストレージをアタッチしてあるので、データの保存領域としてはそれを使用します。
追加ストレージは vdb に刺さっていると仮定し進めます。クラスタをデプロイする前に、どのストレージを使用するかを指定するため以下を編集します。
# vim cluster.yaml
#
# 以下をクラスタの構成に応じて修正
#
storage:
useAllNodes: false # false に変更
useAllDevices: false # false に変更
config:
nodes:
- name: "worker-node01" # 追加ストレージを持っているワーカーノードを指定
devices:
- name: "vdb" # 追加ストレージは vdb としてワーカーノードに接続されているので指定する
- name: "worker-node02"
devices:
- name: "vdb"
- name: "worker-node03"
devices:
- name: "vdb"
ここでは ワーカーノードに接続させた 3つの追加ストレージを指定していますが、それ以上の本数で構築することも出来ます。編集を終えたらデプロイをします。
# kubectl apply -f cluster.yaml
OSD の pod が作成完了し、正常にクラスタデプロイが完了するまで時間がかかるので、以下のコマンドでそれぞれのステータスを確認します。
pod のステータス確認
# kubectl get po -o wide -n rook-ceph -w
operator のログの確認
# kubectl logs [rook-ceph-operator-pod-name] -n rook-ceph -f
Rook Ceph cluster の ヘルスの確認
# kubectl -n rook-ceph get cephcluster
しばらく待っていると、以下のように Cluster created successfully & HEALTH_OK と表示され構築完了したことが確認出来ます。
# kubectl -n rook-ceph get cephcluster
NAME DATADIRHOSTPATH MONCOUNT AGE PHASE MESSAGE HEALTH EXTERNAL FSID
rook-ceph /var/lib/rook 3 3d18h Ready Cluster created successfully HEALTH_OK e0e0201a-6419-4190-adf8-5bdc48d3fc8d
【STEP4】Rook Ceph cluster の中を確認
Rook Ceph をの構築完了後に toolbox の pod をデプロイすることにより ceph osd status などの Ceph ストレージのコマンドを利用できるようになります。
toolbox のデプロイをします。
# kubectl apply -f toolbox.yaml
デプロイ完了したら toolbox の pod に入って、コマンドを実行してみます。以下のコマンドで pod に入ります。
# kubectl exec -ti -n rook-ceph $(kubectl get po -n rook-ceph -l app=rook-ceph-tools -o jsonpath={..metadata.name}) -- bash
bash-4.4$ ceph -s
cluster:
id: e0e0201a-6419-4190-adf8-5bdc48d3fc8d
health: HEALTH_OK
services:
mon: 3 daemons, quorum a,b,c (age 3d)
mgr: b(active, since 3d), standbys: a
mds: 1/1 daemons up, 1 hot standby
osd: 3 osds: 3 up (since 3d), 3 in (since 3d)
data:
volumes: 1/1 healthy
pools: 4 pools, 81 pgs
objects: 25 objects, 465 KiB
usage: 148 MiB used, 3.0 TiB / 3.0 TiB avail
pgs: 81 active+clean
io:
client: 852 B/s rd, 1 op/s rd, 0 op/s wr
上記のように pod にはいってceph のコマンドを実行することにより mon, mgr, mds, osd の状態を把握することが出来ました。
実際に様々な ceph コマンドが利用でき、ceph osd purge のようなコマンドも利用することが出来ます。
【STEP5】ストレージクラス等の設定
Kubernetes クラスタで用意した Rook Ceph ストレージを利用するために ストレージクラスの設定が必要になります。Rook Ceph のリポジトリにはストレージクラスを定義するためのマニフェストがあるので適用していきます。
まずは、RADOS Block Device に対応した ストレージクラスを設定します。
以下でストレージクラスの設定をする。
# kubectl apply -f csi/rbd/storageclass.yaml
以下で rook-ceph-block をデフォルトのストレージクラスに指定
# kubectl patch storageclass rook-ceph-block -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
ストレージクラスが出来上がったか確認
# kubectl get sc -A
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
rook-ceph-block (default) rook-ceph.rbd.csi.ceph.com Delete Immediate true 3d19h
rook-ceph-block は Kubernetes では ReadWriteOnce のみで使用できます。またこのままだと ReadWriteMany では使用できないので CephFS のストレージクラスも設定して、ReadWriteMany が使えるようにします。
CephFS をデプロイする。
# kubectl apply -f filesystem.yaml
filesystem.yaml のデプロイ後に、csi/cephfs/storageclass.yaml もデプロイする。
# kubectl apply -f csi/cephfs/storageclass.yaml
ストレージクラスが出来上がったか確認
# kubectl get sc -A
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
rook-ceph-block (default) rook-ceph.rbd.csi.ceph.com Delete Immediate true 3d19h
rook-cephfs rook-ceph.cephfs.csi.ceph.com Delete Immediate true 13m
まとめ
Rook-Ceph は、Kubernetes 上で Ceph ストレージを運用するためのシンプルで効率的な方法を提供します。高いスケーラビリティ、高可用性、コスト効率など、多くの利点がありますので是非チャレンジしてみてください。