Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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
    サイボウズ株式会社
    伊藤 祐司

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  9. TopoLVMの
    機能

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  13. TopoLVMの
    実装

    View Slide

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

    View Slide

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

    View Slide

  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を作成

    View Slide

  17. TopoLVMの
    公開情報

    View Slide

  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

    View Slide

  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!!

    View Slide

  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の設定

    View Slide

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

    View Slide

  22. TopoLVMの
    今後

    View Slide

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

    View Slide

  24. 補⾜スライド

    View Slide

  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

    View Slide

  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のストレージの空き容量

    View Slide

  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を取得
    ストレージの空き容量を設定

    View Slide

  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

    View Slide

  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経由で渡される

    View Slide