Slide 1

Slide 1 text

Necoのストレージ TopoLVMで何を実現するのか 2020-02-18 サイボウズ株式会社 伊藤 祐司

Slide 2

Slide 2 text

今⽇の内容 ▌実現することと背景 ▌機能 ▌実装 ▌公開情報 ▌今後

Slide 3

Slide 3 text

⽤語についての注意点 ▌PV lPersistent Volume : Kubernetesのobjectの 1種で、Podに紐づく永続ストレージの宣⾔

Slide 4

Slide 4 text

TopoLVMで 実現することと背景

Slide 5

Slide 5 text

Necoのストレージで実現すること スイッチ Boot server Compute server • 業務関連Pod • NVMe Storage server • HDD ⾼速 ローカル ストレージ ⼤容量 分散オブジェクト ストレージ ⾼可⽤ ネットワーク ストレージ Elasticsearch, MySQLなど ⾼IOPSなマネージド サービスに利⽤ ⽂書、画像、 動画ファイルの保存 ステートフルな アプリケーションの 永続化ボリューム Necoの基本ラック構成

Slide 6

Slide 6 text

なぜTopoLVMが必要になったか ▌NecoではNodeに⾼速なNVMeを積み、そ れらをMySQL, Elasticsearch, Cephなどで 使う ▌アプリケーションやミドルウェアが必要と するサイズを事前に計画するのは困難

Slide 7

Slide 7 text

TopoLVMで実現すること ▌NodeのローカルストレージをLVMで管理 し、Podに必要な領域を動的・柔軟に切り出 して提供する。

Slide 8

Slide 8 text

TopoLVMで実現すること スイッチ Boot server Compute server • 業務関連Pod • NVMe Storage server • HDD ⾼速 ローカル ストレージ ⼤容量 分散オブジェクト ストレージ ⾼可⽤ ネットワーク ストレージ(Ceph) Elasticsearch, MySQLなど ⾼IOPSなマネージド サービスに利⽤ ⽂書、画像、 動画ファイルの保存 ステートフルな アプリケーションの 永続化ボリューム Necoの基本ラック構成 LVM割り当て、 PV作成の⾃動化

Slide 9

Slide 9 text

TopoLVMの 機能

Slide 10

Slide 10 text

Dynamic provisioning & Topology ▌LVMによるボリューム管理 ▌Persistent Volume Claim(PVC)をトリガ とし、動的に領域を確保 ▌可能な限り、空き容量の多いNodeからの ディスク領域の確保

Slide 11

Slide 11 text

Scheduler extender ▌KubernetesのスケジューラはCPUとメモリに のみ基づいている ▌TopoLVMからスケジューラに対しストレージ の状態に基づいた情報を渡している lストレージの空き容量に応じた優先度 lストレージの空きが無いNodeへのPod割り当ての 回避

Slide 12

Slide 12 text

その他、多様な機能 ▌Raw Block Volume ▌Ephemeral inline volume lPodが直接利⽤してPodの終了とともに削除さ れる短期的なストレージの利⽤ ▌Volume metrics lPrometheusで監視可能なメトリクスを出⼒

Slide 13

Slide 13 text

TopoLVMの 実装

Slide 14

Slide 14 text

実装に関連するKubernetesの機能 ▌Container Storage Interface(CSI) lストレージ実装の抽象化を⾏うための機能 lTopoLVMの機能の多くは、CSIを通して利⽤ される ▌Kubernetes schedulerの拡張 (Scheduler extender)

Slide 15

Slide 15 text

TopoLVMのコンポーネント ▌topolvm-scheduler (DaemonSet, Deployment) kube-schedulerと連携してスケジューラを拡張 ▌topolvm-controller (Deployment) CSIと連携してクラスタ全体のvolumeを管理 ▌topolvm-node (DaemonSet) 各Nodeに関する処理をハンドリングする ▌lvmd (Systemdサービス) 実際にLVMを操作する

Slide 16

Slide 16 text

Dynamic Provisioningの概要 Deployment external-provisioner topolvm-controller API server Persistent Volume Claim Node topolvm-node (DaemonSet) Storage Persistent Volume lvmd (Daemon) 1.PVCを検出 2. CreateVolume APIを呼び出し 3.LVを作成 4.LVを検出 5.論理ボリュームを作成 Local Volume (CR) 6. volumeIDを伝える 7. PVを作成

Slide 17

Slide 17 text

TopoLVMの 公開情報

Slide 18

Slide 18 text

もっと知りたい ▌Github lhttps://github.com/cybozu-go/topolvm/ ▌Kubernetesでローカルストレージを有効活⽤しよう lCybozu Inside Out (blog) lhttps://blog.cybozu.io/entry/2019/11/08/090000 ▌Introducing a New Local Storage for Kubernetes: TopoLVM lKintone Engineering Blog lElasticsearchからの利⽤⽅法について lhttps://blog.kintone.io/entry/topolvm

Slide 19

Slide 19 text

試してみたい ▌汎⽤環境向け lhttps://github.com/cybozu- go/topolvm/blob/master/deploy/README.md ▌Rancher Meetup #11 in Osakaの資料 lTopoLVMをRancherで動かしてみた話 https://speakerdeck.com/masa213f/topolvm-rancher New!!

Slide 20

Slide 20 text

Deployの⼤まかな流れ 1. lvmdのインストール Kubernetesのhostとなる環境のsystemd, lvmを設定する 2. cert-managerの準備 3. topolvm-schedulerをDaemonSetにするかDeploymentにするか 決める 4. TopoLVMを適⽤しないnamespaceへのラベルつけ 5. TopoLVMのデプロイ 6. topolvm-schedulerの設定 kube-schedulerと同じnodeに 7. StorageClassの設定

Slide 21

Slide 21 text

コミュニケーションツール ▌Github issue ▌Slack New!!

Slide 22

Slide 22 text

TopoLVMの 今後

Slide 23

Slide 23 text

TopoLVMの今後 ▌OSS活動 lKubeCon EUでの発表(@sat, @kazmaz11) lRook/Cephとの連携 ▌機能開発 lVolume Expansion

Slide 24

Slide 24 text

補⾜スライド

Slide 25

Slide 25 text

コンポーネントの全体像 Deployment Deployment (or DaemonSet) external-provisioner external-attacher topolvm-controller topolvm-scheduler Scheduler Extender Control Plane scheduler API server Persistent Volume Claim Pod Node Local Volume (CRD) Node DaemonSet node-driver-register topolvm-node lvmd Storage TopoLVM Kubernetes CSI Other object/resource

Slide 26

Slide 26 text

PVCからLV,PVを作成する(1) Deplyment external-provisioner external-attacher topolvm-controller Controle Plane API server Persistent Volume Claim Pod Node metadata.annotations ["topolvm.cybozu.com/capacity"] 0. PVCが作成される 1. PVCの作成を検知 2. CreateVolume APIを呼び出し Local Volume (CRD) 3. lvを作る先のnodeを決め、LV(CRD)を作成 ・空き容量が最も⼤きいnode ・csiから渡された候補の中からTopoLVMで管理 しているnodeを選択 Nodeのストレージの空き容量

Slide 27

Slide 27 text

PVCからLV,PVを作成する (2) Node Daemonset node-driver-register topolvm-node lvmd Storage Controle Plane API server Persistent Volume Claim Pod Node metadata.annotations ["topolvm.cybozu.com/capacity"] Local Volume (CRD) status.volumeID 1. LV(CRD)をwatch 3. status.volumeIDを更新 2. LV(CRD)で指定されたパラメタをもとに vg内にlvを作成, volumeIDを取得 ストレージの空き容量を設定

Slide 28

Slide 28 text

PVCからLV,PVを作成する (3) Deplyment external-provisioner external-attacher topolvm-controller Controle Plane API server Persistent Volume Claim Pod spec.containers[0].resources .limits["topolvm.cybozu.com/capacity"] .requests["topolvm.cybozu.com/capacity"] Node metadata.annotations ["topolvm.cybozu.com/capacity"] 2. CreateVolume APIに対し、 volumeIDなどの情報を戻す 1. volumeIDが設定されるのを 待っている PVはCSIが作成する Schedulingのため、Podが使う ストレージの合計を設定 Local Volume(CRD) status.volumeID

Slide 29

Slide 29 text

ノードの空き容量に応じたスケ ジューリング Deplyment (or Daemonset) topolvm-scheduler Scheduler Extender Controle Plane scheduler API server Pod spec.containers[0].resources .limits["topolvm.cybozu.com/capacity"] .requests["topolvm.cybozu.com/capacity"] Node metadata.annotations ["topolvm.cybozu.com/capacity"] predicate prioritize Podを配置可能なNodeを教える 0〜10の範囲で配置におけるNodeの 優先度を教える min(10, max(0, log2(capacity >> 30 / divisor))) あらかじめ設定していた情報 がscheduler経由で渡される