Storageこんにちは、Necoプロジェクトの池添(@zoetro)です。プラグインを開発したので紹介したいと思います。TopoLVMは以下のような特徴を持っており、Kubernetesでローカルストレージを有効に利用することができます。よるボリューム管理トポロジーを考慮したダイナミックプロビジョニングノードの空き容量に応じたスケジューリングgithub.com本記事では、CSIプラグインを自作するに至った経緯とTopoLVMの特徴の紹介、Elasticsearchのストレージとして利用する例を紹介します。ストレージへの取り組みKubernetesでストレージを扱うことは難しいとよく言われています。言われるように、どのようなプラットフォームであってもストレージを扱うことは難しいのです。幸いなことに、最近のKubernetesではストレージに関する機能追加が活発におこなわれています。Availability)となったことが大きいですね。CSIとは、Kubernetesなどのコンテナオーケストレーションシステムにおいて、コンテナから任意のストレージを利用するための標準化された仕組みです。CSIを利用することで、Kubernetesのソースコードを変更することなく、Kubernetesに任意のストレージシステムを組み込むことが簡単にできるようになりました。ストレージと一口に言っても、様々なタイプのストレージが存在します。我々は現在のところ、Kubernetes上で以下のようなストレージを扱えるようにしようとしています。分散オブジェクトストレージ」については、Ceph/Rookを利用する予定です。高速なローカルストレージ」を実現するために開発したソフトウェアです。Kubernetesのローカルストレージ事情Kubernetesでローカルストレージを扱うための仕組みはいくつか用意されています。PersistentVolumeは、ローカルストレージのパスを指定してPodからマウントすることができる仕組みです。hostPathはマルチノードクラスタに対応しておらず、主にシングルノードクラスタでテスト用途として使うためのものです。PersistentVolumeもhostPathと同じようにローカルストレージのパスを指定してPodからマウントすることができます。nodeAffinityによりボリュームを配置するノードを指定することができます。対応していないため、手動でPersistentVolumeリソースを作成し、ローカルストレージの準備をしておく必要があります。ホスト上のディレクトリをマウントして利用する単純なものです。そのため、複数のハードディスクやSSDを扱ったり、ストレージのサイズやアクセス権を制限するためには何らかの仕組みが必要になります。ひとつの解決策となるでしょう。Kubernetes向けのLVMを利用したCSIプラグインを探してみるといくつかの実装が見つかります。対応CSIのバージョンが古かったり、我々が必要とする機能が実装されていなかったりしました。TopoLVMの特徴ないのなら作ってしまおう。いうことで、以下のような特徴を持つTopoLVMというCSIプラグインを開発しました。よるボリューム管理トポロジーを考慮したダイナミックプロビジョニングノードの空き容量に応じたスケジューリングこれらの特徴を以下に解説していきます。よるボリューム管理TopoLVMでは、LVMを利用してローカルストレージの管理をおこないます。Group)として扱うことにより管理が楽になります。Volume)を切り出して利用します。このとき、LVごとにボリュームのサイズやアクセス権限、rawブロックとして利用するのか、ファイルシステム経由で利用するのかなどを指定することができます。トポロジーを考慮したダイナミックプロビジョニングKubernetesではボリュームを扱うために、PersistentVolumeClaim(PVC)とPersistentVolume(PV)という2種類のリソースを用意しています。PVは具体的なボリュームを管理するためのリソースで、ストレージのタイプや場所、サイズ、アクセスモードなどの情報を管理しています。一方のPVCは、利用したいボリュームの要求をおこなうためのリソースです。サイズやアクセスモードなど利用したいボリュームの条件を指定できます。PodからはPVCを指定して利用したいボリュームの要求を出します。するとKubernetesが条件にマッチした適切なPVをPVCに結びつけ、Podからボリュームを利用できるようにしてくれます。このようにPodを具体的なボリューム(PV)に依存させないことで、Podの可搬性を高めることができます。ダイナミックプロビジョニングとは、PVCを宣言すると、PVを事前に用意しておかなくても動的にPVをプロビジョニングしてくれる仕組みです。TopoLVMではPVCが宣言されると、PVCに指定されたサイズのLV(LogicalVolume)を切り出し、PVとして扱えるようにします。このとき、切り出したLVはどのノード上からでもアクセスできるわけではありません。スケジュールされたPodと同じノード上にLVを切り出す必要があります。対応しており、Podのスケジュールされたノード上にボリュームが作成されます。Provisioningにより、Podのスケジュールされたノード上にボリュームが作成されると説明しました。このとき、Podはどのノードに配置するのがよいでしょうか?Kubernetesのデフォルトのスケジューラに任せると、CPUやメモリ量、SelectorやAffinityなどの情報に基づいてPodのデプロイ先が決定されます。そのため、ストレージの空きがないノードにスケジューリングされてしまう可能性があります。空き容量がギリギリのノードにスケジューリングされてしまうと、その後にボリュームのリサイズをおこなうことが難しくなってしまいます。extenderという仕組みがあり、Podのスケジューリングアルゴリズムを拡張することができます。Extenderにより、スケジューラを以下のように拡張しています。ディスク容量不足しているノードはスケジューリング対象から外す空き容量が多いノードほどスケジューリングスコアが高くなるこれにより、TopoLVMのボリュームを利用するPodは、適切なノードにスケジューリングされるようになります。ElasticsearchのストレージにTopoLVMをつかってみるTopoLVMの利用例として、Elasticsearchのストレージとして利用する方法を紹介します。Kubernetes)を利用することができます。github.comECKではダイナミックプロビジョニングが可能なストレージプラグインを提供しており、このプラグインを利用することでローカルストレージをElasticsearchのストレージとして利用することができます。このlocal-volumeプラグインではノードの空き容量に応じたスケジューリングは実現できません*1。そこで、local-volumeプラグインの代わりにTopoLVMを利用してみましょう。ここでは下記のバージョンを利用することとします。v0.2.0まず、kindのKubernetesクラスタ上にTopoLVMのデモ環境を構築します。18.04環境を用意し、下記のコマンドを実行してください*2。run次に、ECKをKuberntesクラスタ上にデプロイします*3。https://download.elastic.co/downloads/eck/1.0.0-beta1/all-in-one.yamlログを表示してECKが立ち上がるまで少し待ちます。statefulset.apps/elastic-operator次に、Elasticsearchをデプロイするためのマニフェストファイル(elastcisearch.yaml)を用意します。指定することで、Elasticsearchが利用するストレージを変更することができます。storageClassNameフィールドにtopolvm-provisionerを指定すると、TopoLVMのストレージが利用されることになります。topolvm-provisionerでは、このマニフェストを適用してElasticsearchをデプロイしてみましょう。elastcisearch.yamlしばらくするとElasticsearchが立ち上がり、利用可能な状態になります。Volume)が割り当てられていることを確認することができます。inheritまとめ今回はLVMを利用したKubernetes向けのローカルストレージ用CSIプラグインについて紹介しました。現在のところ、ストレージの空き容量だけをみてスケジューリングをおこなっていますが、将来的にはIOPSを考慮したスケジューリングもおこないたいと考えています。1.16ではCSIのリサイズ機能が導入されました。TopoLVMではこれに対応して、オートリサイズ機能を実現したいと考えています。こんにちは、Necoプロジェクトのsatと申します。こんにちは、Necoプロジェクトのsatです。Softwareに認定されましたこんにちは、Necoプロジェクトの池添(@zoetro)です。3日目こんにちは、Necoプロジェクトのmitzです。LINKサイボウズ・ラボサイボウズ株式会社プライバシーポリシースターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。