ざっくり、次の使い方がある、という認識ですが。
- ブロック・ストレージ(RBD)
- ファイルシステム・ストレージ(CephFS)
- オブジェクト・ストレージ(RGW)
- NFS・ストレージ
正直、クラスタ初心者なもので、何もわかっていません。
どう使うか、どう運用するを決めるにあたり。
正しい認識を得るための、公式情報リンクを記録させて頂こうと思います。
目次
Cephクラスタのストレージコンフィグレーションについて調査
ざっくり。NFSサーバとして使用したい場合は、実は簡単にできそうな感じがあります。
またS3・Swift APIによるオブジェクト・ストレージを作る場合も、あと少しで作れそうな感じがします。
それ以外の、ブロック/ファイルシステム・ストレージとして使用したい場合は、Kubernetesの永続ボリュームについて、少し調べておいたほうが良さそうです。
PersistentVolumeのアクセスモードの差異
こちらの情報から。
ストレージを、「ReadWriteOnce」で使いたいか「ReadOnlyMany」「ReadWriteMany」で使いたいか。を考えておいたほうが良さそうです。
- ReadWriteOnce
- ボリュームは単一のNodeで読み取り/書き込みとしてマウントできます
- ReadOnlyMany
- ボリュームは多数のNodeで読み取り専用としてマウントできます
- ReadWriteMany
- ボリュームは多数のNodeで読み取り/書き込みとしてマウントできます
- ReadWriteOncePod
- ボリュームは、単一のPodで読み取り/書き込みとしてマウントできます。クラスター全体で1つのPodのみがそのPVCの読み取りまたは書き込みを行えるようにする場合は、ReadWriteOncePodアクセスモードを使用します。これは、CSIボリュームとKubernetesバージョン1.22以降でのみサポートされます。
ボリュームプラグイン | ReadWriteOnce | ReadOnlyMany | ReadWriteMany |
---|---|---|---|
CephFS | ✓ | ✓ | ✓ |
CSI | ドライバーに依存 | ドライバーに依存 | ドライバーに依存 |
NFS | ✓ | ✓ | ✓ |
RBD | ✓ | ✓ | - |
ふむふむ。
こちらを拝見しますと。
ファイルシステム・ストレージ(CephFS)を作れば、ReadWriteManyに対応できそうです。これはつまり、複数のポッドから、同時に読み書きが可能という意味になります。
NFSサーバを作り、そちらに永続ボリュームを保存した場合も、ReadWriteManyに対応できそうですが。こちらは、クラスタではない外部に用意したNFSサーバと通信するのと同じ扱いになります。
一方、ブロック・ストレージ(RBD)は、ReadOnlyManyに対応しますが、ReadWriteManyには対応していません。つまり、複数のポッドから、同時に書き込みはできない、ということになります。あくまでも、書き込みは1つのポッドから。
またブロック・ストレージは、いちど書き込んだエリアを再利用できないと思います。つまり、使用すれば使用するほどストレージを消費する一方、ファイル削除に相当する操作はできず、一方的に減ってゆくイメージです。
このあたりを踏まえまして。
Cephクラスタを永続ボリュームとして使用したい場合、適切にRBD・CephFS・NFSを選択すれば良いのかと思います。
Cephクラスタの各種設定手順
ブロック・ストレージ(RBD)
まずはブロック・ストレージとして使う場合ですが。
storageclass.yamlを使用して、StorageClassを作成すれば良いという感じでしょうか。
kubectl create -f deploy/examples/csi/rbd/storageclass.yaml
rook.gitのexampleフォルダの上記のYAMLファイルが、ブロック・ストレージとしてCephクラスタを使用する設定になります。
あとはPVCを使用するポッドを作成すれば、StorageClassを介してブロック・ストレージを使用できそうです。
注意点は、アクセスモードはRWOになること、ブロック・ストレージということで、一方的に使用量が増えてゆく、あたりでしょうか。(確証なし
詳細は、上記の公式ドキュメントでご確認ください。
ファイルシステム・ストレージ(CephFS)
公式情報はこちらになります。
ファイルシステム作成
exampleフォルダのfilesystem.yamlにより、ファイルシステムを作成できるようです。
cd rook/deploy/examples
kubectl create -f filesystem.yaml
# mdsポッドができるまで待ちます
kubectl -n rook-ceph get pod -l app=rook-ceph-mds
30秒ほどで、mdsポッドが起動しました。
ステータスを確認してみます。
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash
ceph status
services欄を見ますと、mdsデーモンが起動していることがわかります。
ストレージの支給(プロビジョン)
作成したファイルシステムを永続ボリュームとして使用できるようにするには、csi/cephfsディレクトリにあるstorageclass.yamlファイルを使用するようです。
kubectl create -f csi/cephfs/storageclass.yaml
まだ試していないため、推測で恐縮ですが。CephFSによるファイルシステムにより、こちらのストレージクラスを使用して、ReadWriteMany/ReadOnlyMany/ReadWriteOnceすべてに対応した永続ボリュームを使用することができるのかと思います。
この時点で、永続ボリュームを使用したポッドを運用する準備ができた、のかなと思います。(手探り
デフォルトストレージクラスの変更
※23.7.17追記:
作成したCephfsのストレージクラスですが。どうも既定の状態では、PVCが発生してもPVを割り当ててくれません。
原因は「デフォルト・ストレージクラスではないから」のようです。資料はこちらになります。
下記のコマンドで、作成したrook-cephfsストレージクラスをデフォルトにしたところ、PVCにより自動でストレージが使用されるようになりました。
kubectl get storageclass
kubectl patch storageclass rook-cephfs -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
kubectl get storageclass
ファイルシステムの削除
ファイルシステムを削除する場合の覚書です。
kubectl -n rook-ceph delete cephfilesystem myfs
こちらはファイルシステムが不要になった場合に使用します。
オブジェクト・ストレージ(RGW)
ストレージクラスタを、S3 APIで公開する場合は、こちらの手順になります。
公式ドキュメントはこちらです。
object.yamlを使用するようです。
kubectl create -f object.yaml
その後、ユーザの作成が必要のようです。
S3を利用する方は、流れを追えるのかと思いますが。
私個人は、S3は縁遠いため、ドキュメントが全く入って来なくてすみません。
また動作を検証するには、オブジェクト・ストレージ以外にS3を利用するアプリも必要なのでしょうか。
ここでは「作れそうですよ」とのみ記載させて頂き、詳細は公式ドキュメントをご覧ください。
NFSストレージ
最後がNFSストレージです。公式ドキュメントはこちらです。
こちらは、Toolbox上の操作でNFS機能を有効化できるようです。
ceph mgr module enable rook
ceph mgr module enable nfs
ceph orch set backend rook
# NFSエクスポート作成
ceph nfs export create cephfs my-nfs /test myfs
エクスポートしたNFSは、クラスタ内からマウントが可能のようです。
もしクラスタ外にNFSを公開したい場合は、ロードバランサー・サービスによりエンドポイントを公開できるようです。
そのあたりは、deploy/examples/nfs-load-balancer.yamlファイルに記述があるそうです。
NFSサーバとして公開する場合は、別途ポッドを作成する必要はないのですね。
構成がシンプルなため、分散ファイルシステムを共有ファイルサーバとして利用したい場合は、こちらのNFSがパフォーマンス的にも期待できそうな感じがします。(推測で恐縮ですが
以上のような感じで。
先日作成したCephクラスタの使い道を、ざっとサーベイしてみました。
実際に試したのはCephFSですが、ストレージクラスを作成した段階までのため、使い勝手の評価等は、ポッドを作成して動かす必要があります。
その他に、ブロックデバイス、オブジェクト・ストレージ、NFSストレージの情報リンクを記載させて頂きましたが、身近に使う可能性があるものののみ、ピックアップさせて頂いた感じです。
公式ドキュメントには、それら以外の使用方法、たとえばファイルシステムのミラーリングや、マルチサイトのオブジェクトストア等、多くの情報が記載されています。
使いこなすには、クラスタに関する深い知識が必要と、改めて感じました。
次はクラスタでアプリ用のポッドを起動したいと考えています。(勉強中
それではまた次回!