背景

中規模以上の 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-cephrook-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 には ClusterRoleClusterRoleBinding も含まれています。Helm でデプロイされるものと同じなのでそのまま apply しても無害ですが、気になる方は該当部分を削除してください。

apply

kubectl apply -f common.yaml

リソースが作られていきます。

CephCluster CR のデプロイ

今回はデプロイできることの検証ができれば十分ですので、mgrmon のみデプロイを試みます。

# 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 プロフェッショナルサポートサービスが担当しました。サービスの内容にご興味のあるかたは、紹介ページをご参照いただければと存じます。