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

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

Avatar for Cybozu Cybozu
February 27, 2020

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

Avatar for Cybozu

Cybozu

February 27, 2020
Tweet

More Decks by Cybozu

Other Decks in Technology

Transcript

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

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

    Storage server • HDD ⾼速 ローカル ストレージ ⼤容量 分散オブジェクト ストレージ ⾼可⽤ ネットワーク ストレージ(Ceph) Elasticsearch, MySQLなど ⾼IOPSなマネージド サービスに利⽤ ⽂書、画像、 動画ファイルの保存 ステートフルな アプリケーションの 永続化ボリューム Necoの基本ラック構成 LVM割り当て、 PV作成の⾃動化
  3. 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を作成
  4. もっと知りたい ▌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
  5. 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の設定
  6. コンポーネントの全体像 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
  7. 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のストレージの空き容量
  8. 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を取得 ストレージの空き容量を設定
  9. 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
  10. ノードの空き容量に応じたスケ ジューリング 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経由で渡される