$30 off During Our Annual Pro Sale. View Details »

Necoのストレージ TopoLVMで何を実現するのか

Cybozu
PRO
February 27, 2020

Necoのストレージ TopoLVMで何を実現するのか

Cybozu
PRO

February 27, 2020
Tweet

More Decks by Cybozu

Other Decks in Technology

Transcript

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

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

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

  4. TopoLVMで 実現することと背景

  5. Necoのストレージで実現すること スイッチ Boot server Compute server • 業務関連Pod • NVMe

    Storage server • HDD ⾼速 ローカル ストレージ ⼤容量 分散オブジェクト ストレージ ⾼可⽤ ネットワーク ストレージ Elasticsearch, MySQLなど ⾼IOPSなマネージド サービスに利⽤ ⽂書、画像、 動画ファイルの保存 ステートフルな アプリケーションの 永続化ボリューム Necoの基本ラック構成
  6. なぜTopoLVMが必要になったか ▌NecoではNodeに⾼速なNVMeを積み、そ れらをMySQL, Elasticsearch, Cephなどで 使う ▌アプリケーションやミドルウェアが必要と するサイズを事前に計画するのは困難

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

  8. TopoLVMで実現すること スイッチ Boot server Compute server • 業務関連Pod • NVMe

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

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

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

  12. その他、多様な機能 ▌Raw Block Volume ▌Ephemeral inline volume lPodが直接利⽤してPodの終了とともに削除さ れる短期的なストレージの利⽤ ▌Volume

    metrics lPrometheusで監視可能なメトリクスを出⼒
  13. TopoLVMの 実装

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

    extender)
  15. TopoLVMのコンポーネント ▌topolvm-scheduler (DaemonSet, Deployment) kube-schedulerと連携してスケジューラを拡張 ▌topolvm-controller (Deployment) CSIと連携してクラスタ全体のvolumeを管理 ▌topolvm-node (DaemonSet)

    各Nodeに関する処理をハンドリングする ▌lvmd (Systemdサービス) 実際にLVMを操作する
  16. 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を作成
  17. TopoLVMの 公開情報

  18. もっと知りたい ▌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
  19. 試してみたい ▌汎⽤環境向け 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!!
  20. 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の設定
  21. コミュニケーションツール ▌Github issue ▌Slack New!!

  22. TopoLVMの 今後

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

  24. 補⾜スライド

  25. コンポーネントの全体像 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
  26. 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のストレージの空き容量
  27. 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を取得 ストレージの空き容量を設定
  28. 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
  29. ノードの空き容量に応じたスケ ジューリング 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経由で渡される