Share
Embed
Rook/Ceph OSD on PVC in practice
This slide introduces "OSD on PVC" feature of Rook/Ceph.
Satoru Takeuchi PRO
December 09, 2019
Transcript
37 slides
-
Rook/Ceph OSD on PVCの実践 Japan Rook Meetup #1 Cybozu, Inc.
Neco Project Satoru Takeuchi 1 -
はじめに ▌BlueStore前提 ⚫FileStoreは無視 ▌ceph-csi前提 ⚫FlexVolumeはいずれobsolete 4 ブロックデバイス ブロックデバイス OSD OSD
ファイルシステム BlueStore FileStore -
OSD on PVC ▌Rook 1.1において追加された新機能 ▌ハードウェアの詳細情報を意識せずにk8s nativeな方法でCephにOSDを提供できる ⚫従来のOSD ⚫各ノードのブロックデバイス上に作る ⚫OSD
on PVC ⚫PVC(ブロックボリューム)上に作る 5 -
デバイス 従来のデバイス指定 ユーザが 指定 OSD on PVC PVC (Block Volume)
Rookの クラスタリソース Kubernetes Linux Rookの クラスタリソース OSDの設定 CSIドライバ ユーザはここを 気にしなくていい ユーザが 指定 6 OSD on PVC OSDの設定 -
従来の方法の設定 ▌ノード上のデバイス名を直接使う apiVersion: ceph.rook.io/v1 kind: CephCluster … spec: … storage:
… nodes: - name: “node0” devices: - name: "sdb" - name: “node1“ deviceFilter: "^sd[^a]“ sda sdb sdc 7 node0 node1 sda sdb sdc OSD OSD OSD OSD Pod OSD Pod OSD Pod • ノードとデバイス構成の詳細な知識が クラスタ管理者に必要 • K8sの枠外で自力構成 -
どこのノードにあるのかは不明 OSD on PVC設定 ▌CSIドライバ提供のblock volumeを使う spec: … storageClassDeviceSets: -
name: set0 count: 3 … volumeClaimTemplates: - metadata: name: data spec: resources: requests: storage: 10Gi storageClassName: my-class 8 PVC Set0-0 PVC set0-1 OSD OSD OSD Pod OSD Pod PVC set0-2 OSD OSD Pod PVCの提供方法は不明 -
Necoのブロックストレージの要件 ▌ローカルNVMe SSDを使って二種類を提供 ⚫生のNVMe SSD: I/O性能重視。用途はMySQLなど ⚫Ceph RBD: スケーラビリティ、ポータビリティ重視 ▌運用を楽にしたい
⚫K8sの枠外で細かい設定をしたくない ▌ラック障害耐性が欲しい ⚫各データのレプリカはすべて別ラックに分散配置 11 -
Necoのブロックストレージの要件 ▌ローカルNVMe SSDを使って二種類を提供 ⚫生のNVMe SSD: I/O性能重視。用途はMySQLなど ⚫Ceph RBD: スケーラビリティ、ポータビリティ重視 ▌運用を楽にしたい
⚫K8sの枠外で細かい設定をしたくない ▌ラック障害耐性が欲しい ⚫各データのレプリカはすべて別ラックに分散配置 12 -
ノードの構成: 理想 13 NVMe SSD NVMe SSD PVC PVC PVC
OSD OSD アプリAのPod OSD Pod OSD Pod CSIドライバが管理 Dynamic provisioning -
解決方法: 要件を満たすCSIドライバを自作 15 NVMe SSD NVMe SSD Volume Group Logical
Volume Logical Volume Logical Volume PVC PVC PVC OSD OSD アプリAのPod OSD Pod OSD Pod TopoLVMという 自作CSIドライバが管理 Dynamic provisioning -
デバイス 従来のデバイス指定 ユーザが 指定 OSD on PVC PVC (Block Volume)
Rookの クラスタリソース Kubernetes Linux Rookの クラスタリソース OSDの設定 OSD on PVC(TopoLVM) 物理デバイス 物理デバイス 物理デバイス Volume Group Logical Volume Logical Volume Logical Volume PVC (Block Volume) Rookの クラスタリソース TopoLVM CSIドライバ ユーザはここを 気にしなくていい ユーザが 指定 ユーザが 指定 16 OSD on PVC(TopoLVM) OSDの設定 OSDの設定 -
どこのノードにあるのかは不明 OSD on PVC(TopoLVM)設定 ▌TopoLVM提供のblock volumeを使う storageClassDeviceSets: - name: set0
count: 3 … volumeClaimTemplates: - metadata: name: data spec: resources: requests: storage: 10Gi storageClassName: topolvm-provisioner 17 PVC Set0-0 PVC set0-1 OSD OSD OSD Pod OSD Pod PVC set0-2 OSD OSD Pod PVCはLogical Volume -
どこのノードにあるのかは不明 運用イメージ ▌TopoLVM提供のblock volumeを使う storageClassDeviceSets: - name: set0 count: 3
… volumeClaimTemplates: - metadata: name: data spec: resources: requests: storage: 10Gi storageClassName: topolvm-provisioner 18 PVC Set0-0 PVC set0-1 OSD OSD OSD Pod OSD Pod PVC set0-2 OSD OSD Pod PVCはLogical Volume • 設定例 • ノード数 * NVMe SSDの枚数 * NVMe SSD一枚あたりのOSD数 • 高速ストレージ用の容量は除く • 設定例 • NVMe SSD一枚の容量/一枚あたりのOSD数 -
Necoのブロックストレージの要件 ▌☑ローカルNVMe SSDを使って二種類を提供 ⚫生のNVMe SSD: I/O性能重視。用途はMySQLなど ⚫Ceph RBD: スケーラビリティ、ポータビリティ重視 ▌☑運用を楽にしたい
⚫K8sの枠外で細かい設定をしたくない ▌ラック障害耐性が欲しい ⚫各データのレプリカはすべて別ラックに分散配置 21 -
Necoのブロックストレージの要件 ▌☑ローカルNVMe SSDを使って二種類を提供 ⚫生のNVMe SSD: I/O性能重視。用途はMySQLなど ⚫Ceph RBD: スケーラビリティ、ポータビリティ重視 ▌☑運用を楽にしたい
⚫K8sの枠外で細かい設定をしたくない ▌ラック障害耐性が欲しい ⚫各データのレプリカはすべて別ラックに分散配置 22 -
おさらい ▌KubernetesではPodは通常どのノードで動くか不明 ⚫OSD Podも同様 ▌OSDを2つにすると以下のようになるかもしれない 24 rack1 rack0 node0 node1
node2 node3 OSD Pod OSD Pod -
PodAntiAffinity ▌StorageClassDeviceSetsにはPodAntiAffinityを設定可能 ▌これを使えばOSD Podを均等分散配置できるのでは? 26 spec: … storageClassDeviceSets: - name:
set0 … placement: - PodAntiAffinity … -
PodAntiAffinityの問題 ▌“required…”: all or nothing。1ノードに1OSD Podしか置けない ⚫ 複数OSD per NVMe
SSDによる性能向上ができない ▌“preferred”: ノード数より多いOSD Podがあるときに均等分散配置され る保証が無い ▌→現状のOSD on PVCはほぼ実用不可能 27 rack1 rack0 node0 node1 node2 node3 OSD Pod OSD Pod OSD Pod OSD Pod Preferred -
PodTopologySpreadConstraintsの使用方法 29 Metadata: name: osd topologySpreadConstraints: - topologyKey: rack labelSelector:
matchLabels: name: osd Nodeのマニフェスト Podのマニフェスト Metadata: labels: - rack: rack0 Metadata: labels: - rack: rack1 rack0 OSD Pod rack1 OSD Pod OSD Pod OSD Pod OSD Pod OSD Pod OSD Podを均等に分散配置 -
Necoにおける設定 ▌PodTopologySpreadConstraintsをrackとnodeに対して使う 30 Metadata: name: osd topologySpreadConstraints: - topologyKey: rack
labelSelector: matchLabels: name: osd - topologyKey: node labelSelector: matchLabels: name: osd Nodeのマニフェスト Podのマニフェスト Metadata: labels: - rack: rack0 - node: node0 Metadata: labels: - rack: rack0 - node: node1 Metadata: labels: - rack: rack1 - node: node2 Metadata: labels: - rack: rack1 - node: node3 -
新規OSD Podスケジューリングの様子 31 rack0 node0 OSD Pod OSD Pod node1
OSD Pod OSD Pod rack1 node2 OSD Pod OSD Pod node3 OSD Pod OSD Pod 1. rack0のOSD Pod数 > rack1のOSD Pod数 →rack1にスケジュール 2. node2のOSD Pod数 > node3のOSD Pod数 →node3にスケジュール -
その他の取り組み ▌RookにOSD on PVC用のIntegration Testを追加 ⚫ODS on LV-backed PVCをTopoLVMによってテス トできないか検討中
⚫Rook 1.3での取り込みを目指す 34 -
まとめ ▌OSD on PVCはハードウェアの詳細情報を意識せずに k8s nativeな方法でCephにOSDを提供できる機能 ▌できたばかりの機能なので色々と機能不足 ▌NecoでRookを使うにあたっての問題と取り組み ⚫Local volumeを使う場合に実質必須のOSD
on LV-backed PVCをupstream Rookに取り込んだ ⚫ローカル/リモート問わず実質必須の topologySpreadConstraints機能も追加予定 ⚫OSD on PVCのIntegration testも追加予定 35 -
参考リンク ▌ストレージオーケストレーターRookへのサイボウズのコミット方針 ⚫ https://blog.cybozu.io/entry/2019/12/03/114746 ⚫ 本記事で述べたものを含めたNecoプロジェクトのRookへの貢献 ▌賢く「散らす」ための Topology Spread Constraints
https://speakerdeck.com/ytaka23/kubernetes-meetup-tokyo-25th PodTopologySpreadConstraintsの解説 ▌Kubernetesでローカルストレージを有効活用しよう ⚫ https://blog.cybozu.io/entry/2019/11/08/090000 ⚫ TopoLVMの解説 36