Kubernetesでお手軽ストレージ構築!Rook Ceph導入の5ステップ

こんにちは、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 ストレージを運用するためのシンプルで効率的な方法を提供します。高いスケーラビリティ、高可用性、コスト効率など、多くの利点がありますので是非チャレンジしてみてください。

ブログの著者欄

長谷川 泰斗

GMOインターネットグループ株式会社

2020年 GMOインターネットグループ株式会社 新卒入社
クラウド基盤エンジニア
お名前.com KVM, ConoHa VPS等の開発運用に従事

採用情報

関連記事

KEYWORD

採用情報

SNS FOLLOW

GMOインターネットグループのSNSをフォローして最新情報をチェック