Rook で複数の Ceph クラスタをデプロイする方法
背景
中規模以上の Kubernetes 向け分散ストレージソリューションとして、Rook/Ceph の地位は確かなものになりつつあるようです。
一方で「Rook/Ceph を採用してみたものの、学習曲線が急峻で手に余る」という意見も筆者のもとに届いています。
また、Rook/Ceph を採用する Kubernetes クラスタが「中規模以上」であることの裏返しとして、「“適当に作って壊してみる"が難しい状態にある」という声も耳にします。
実運用投入済みの TiB 級のデータベースやソースコードリポジトリがあるストレージで「全損しました (テヘペロ」は許されないのは、容易に想像は付きます。
「それでは別の K8s クラスタを用意すれば良いのでは?」とはいえ、K8s クラスタを建てる維持するにもコストがかかります。
rook-ceph-operator
をデプロイ済みの既存 Kubernetes クラスタで、複数の Ceph クラスタを組めたら良いのに…。
その望み、叶います。
実は rook-ceph-operator
は、同一 Kubernetes クラスタ内に、複数の Ceph を共存させられます。ただし、コツが要ります。本稿では、手順を簡潔にまとめていきます。
なお、動作確認を行った Rook/Ceph の Helm チャートは v1.12.0 です。
前提
環境となる Kubernetes クラスタが、下記前提を満たしているものとして話を進めます。
- 公式 Helm チャートを用いて、名前空間
rook-ceph
にrook-ceph-operator
がデプロイされている。 - RBAC は有効になっている。
また、新しい Ceph クラスタは名前空間 rook-ceph-multiple
にデプロイするものとします。
手順
RBAC の生成
common.yaml ファイルの取得
作成先となる名前空間 rook-ceph-multiple
に RBAC 関連リソース (ServiceAccount
, Role
, RoleBinding
) が必要です。
これらを一気に作成するファイルが、Rook の公式 GitHub リポジトリに存在します。
今回 Helm チャートは v1.12.0 を使いましたから、下記 URL にあるものを使います。
https://github.com/rook/rook/blob/v1.12.0/deploy/examples/common.yaml
v1.12.0
の部分は、お使いの環境に合わせて変更してください。
ファイルの編集
common.yaml
は apply 前に編集する必要があります。
name: rook-ceph # namespace:cluster
とある部分を name: rook-ceph-multiple
と置換します。数か所あるので、エディタの一括置換機能を使うほうが確実でしょう。
上記と似た namespace: rook-ceph # namespace:operator
とある部分については書き換えないでください。これは rook-ceph-operator
が存在する名前空間の指定です。
common.yaml
には ClusterRole
や ClusterRoleBinding
も含まれています。Helm でデプロイされるものと同じなのでそのまま apply しても無害ですが、気になる方は該当部分を削除してください。
apply
kubectl apply -f common.yaml
リソースが作られていきます。
CephCluster CR のデプロイ
今回はデプロイできることの検証ができれば十分ですので、mgr
と mon
のみデプロイを試みます。
# cephcluster.yaml
---
apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
name: my-cluster
namespace: rook-ceph-multiple
spec:
cephVersion:
image: quay.io/ceph/ceph:v17.2.6-20230501
allowUnsupported: false
dataDirHostPath: /var/lib/rook
mon:
count: 1
mgr:
count: 1
これを apply します。
kubectl apply -f cephcluster.yaml
しばらくすると Pod が立ち上がっているのが確認できます。
$ kubectl get po -n rook-ceph-multiple
NAME READY STATUS RESTARTS AGE
rook-ceph-crashcollector-aks-sys3d8asv4-05891579-vmss00000p2lnl 1/1 Running 0 55m
rook-ceph-mgr-a-6ff55b7d98-dttpd 1/1 Running 0 55m
rook-ceph-mon-a-778764cf5-2wvlj 1/1 Running 0 57m
おめでとうございます。名前空間 rook-ceph-multiple
にある、この Ceph クラスタは壊し放題です。名前空間 rook-ceph
にあるクラスタとは完全に分離されています。
消し方
$ kubectl delete cephcluster -n rook-ceph-multiple my-cluster
cephcluster.ceph.rook.io "my-cluster" deleted
簡単ですね。
rook-ceph-operator が reconcile を行う間、数分間程度の待ちが発生する場合があります。その場合は Ctrl-C で抜けてしまっても問題はありません。 念のため、消えていることを確認したほうがよいでしょう。
$ kubectl get cephcluster -n rook-ceph-multiple
No resources found in rook-ceph-multiple namespace.
ここから再度 CephCluster をデプロイすれば、新規に Ceph クラスタが立ち上がります。 十分に建てて壊して満足したら、名前空間ごと消してしまえば、後片付けは終了です。
$ kubectl delete ns rook-ceph-multiple
注意点
Rook/Ceph 関連のカスタムリソースを apply する際に名前空間を間違えると、破滅的な結果を招く可能性があります。
今回の例で言うならば、 rook-ceph-multiple
を指定すべき箇所で rook-ceph
を指定すると、最悪ケースで rook-ceph の Ceph クラスタが回復不能になります。
また、namespaced のリソースではない StorageClass の設定でも名前空間が絡みます。うっかりミスに気をつけてください。
宣伝
本稿は、合同会社もなみ屋 FLOSS プロフェッショナルサポートサービスが担当しました。サービスの内容にご興味のあるかたは、紹介ページをご参照いただければと存じます。