CNDT2020シリーズ:サイボウズのSREが語る分散ストレージの配置問題を解決するTopoLVMとは
ゼットラボ株式会社の坂下氏によるKubernetesのストレージ技術に関連して、Kubernetesのストレージ配置問題に関するセッションを紹介する。これはKubernetesのストレージとしてRookとCephを使った分散ストレージの配置問題を解説するもので、プレゼンテーションを行ったのはサイボウズのインフラストラクチャーエンジニア、森本健司氏だ。森本氏はサイボウズのインフラストラクチャーを8年間担当しているというベテランで、セッションの内容も実際に運用を行っているエンジニアとしての知見に満ちたものとなった。
内容はLVM(Logical Volume Manager)を使用してKubernetesのストレージを最適配置する際の問題点と解決策を解説するもので、Kubernetesの他にRook、Cephを活用した事例にサイボウズが開発したオープンソースソフトウェア、TopoLVMを利用している。
TopoLVMはサイボウズの以下のブログに詳細な紹介がされているので参考にされたい。
参考:Kubernetesでローカルストレージを有効活用しよう
TopoLVMは、CSIプラグインとしてKubernetesからストレージへアクセスするために開発されたソフトウェアだ。LVMという名称が示すように複数のサーバーに存在するSSDやHDDを論理的なボリュームとして定義し、それをPodのスケジューラーに対して提供することでダイナミックにストレージをPodにアサインできるようになる。ちなみにTopologyはKubernetes 1.17でGAとなった機能で、ゾーンやリージョンといったラベルごとにストレージをグループ化してアクセスを制御することに利用できる。これはストレージだけではなくサービスにも設定可能で、ルーティングなどにも利用できるようだ。
今回はKubernetesクラスターのストレージとしてCephを使用するということで、分散ストレージとしての概要を解説。ここではクラスター内で分散するために必要な要素として、MonitorとObject Storage Device(以下、OSD)を紹介した。ここで簡単に触れられているPaxosは、複数のノードをマスター/スレーブとして固定せずに「マスター」に相当するノードが故障したような場合にも、他のノードが「マスター」として入れ替わり、稼働し続けるための分散合意のためのアルゴリズムで、分散処理で必須の仕組みである。
次に例としてサーバーラックに格納された複数のサーバーにおいてCephのMonitorを配置する際に負荷や障害対応を考慮して1ラックに1Monitorという構成を取ろうとする場合、KubernetesではAnti-Affinityを利用することでスケジュールすることが可能であることを解説した。
次にRookの概要を紹介。RookはCephをKubernetesから利用するためのソフトウェアで、CNCFのインキュベーションプロジェクトだったが、2020年10月にGraduationステータスに達して、十分に成熟したソフトウェアであるという認証を得たプロジェクトだ。
今回のセッションではサイボウズが解決したい問題として「LVMを使うことでCeph以外にストレージを使えるようにすること」「分散ストレージであるCephを状況に応じて最適に配置すること」の2点を挙げた。
最初の問題は、複数のサーバーに存在するストレージをCephだけではなくMySQLなどの用途にも使えるようにボリュームを切り分けたいという要望だ。そのためにTopoLVMというKubernetesのCSIプラグインを開発したという。
この方式では、ユーザーからのボリュームリクエストであるYAMLファイルの定義に従ってRookがOSDをアタッチするPodとPersistentVolumeClaim(以下、PVC)を作成、それに物理的なボリュームであるPVを割り当てるのではなく、PVCからのリクエストをTopoLVMが受け、動的に論理的なボリュームを割り当て、それをPVとしてPodにアサインするやり方になる。
そして2番目の「CephのストレージであるOSDを最適に配置する問題」に対する解決案として、PersistentVolumeを直接Kubernetesから配置するのではなく、PVがアタッチされるPodを配置する問題として解決するという方法が紹介された。Podと同時にPVを生成するのではなく、Podを生成してから条件に適したPVをアサインする方法となる。
そしてこの配置問題に関連して出てきたのが、OSDをノード内に複数配置して最適化したいというニーズだ。
Kubernetes 1.18でベータとなったこの機能に存在するパラメーターのWhenUnsatisfiableでは、想定した動作をしてくれないため、OSDの分散配置は偏った形になってしまったと解説した。
想定と異なる動作という結果となったが、この機能を実装したメンテナーとの対話では「これが仕様通り」という回答が返ってきたという。
これに対して森本氏は Kube-Schedulerをチューニングして回避したことを解説した。
これらのユースケースを通じて、サイボウズがRookに対して追加した機能を示したのが次のスライドだ。
最後にまとめとして、動的にOSDを配置できるTopoLVM、Kubernetesの新機能を使って分散配置を実装、同時にコミュニティに対しても働きかけて必要と思われる機能を貢献したことなどが挙げられた。
とかく難しいと言われるKubernetesのPV問題だが、CSIプラグインの開発やメンテナーとの対話を通じて機能追加を行うなど、サイボウズのSREチームの積極的な姿勢が良く分かったセッションとなった。またKubernetesを利用する際には、ストレージの運用管理についてもKubernetesの流儀が必要となることをあらためて確認できたセッションでもあった。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- CNDT2020シリーズ:ヤフージャパンのインフラを支えるゼットラボが語るKubernetesストレージの深い話
- CNDT 2022、サイボウズのストレージアーキテクトが企業からOSSへの貢献を継続する仕組みを解説
- Observability Conference 2022から、サイボウズのオブザーバービリティ事例を紹介
- CSIによるKubernetesのストレージ機能
- 分散ストレージ管理のOSS、SODAが開催したミニカンファレンスを紹介
- CNDT 2022、日立のエンジニアによるKubernetesに新機能をマージした経験を語るセッション
- Kubernetes 1.18の新機能を学び、使ってみよう
- StatefulSetとPersistentVolumeを使ってステートフルアプリケーションを動かす
- Oracle Cloud Hangout Cafe Season7 #1「Kubnernetes 超入門」(2023年6月7日開催)
- 詳解KubernetesにおけるPersistentVolume