Slide 1

Slide 1 text

Rook/Ceph OSD on PVCの実践 Japan Rook Meetup #1 Cybozu, Inc. Neco Project Satoru Takeuchi 1

Slide 2

Slide 2 text

目次 1. OSD on PVCとは何か 2. サイボウズ Necoプロジェクトにおける実践 2

Slide 3

Slide 3 text

目次 1. OSD on PVCとは何か 2. サイボウズ Necoプロジェクトにおける実践 3

Slide 4

Slide 4 text

はじめに ▌BlueStore前提 ⚫FileStoreは無視 ▌ceph-csi前提 ⚫FlexVolumeはいずれobsolete 4 ブロックデバイス ブロックデバイス OSD OSD ファイルシステム BlueStore FileStore

Slide 5

Slide 5 text

OSD on PVC ▌Rook 1.1において追加された新機能 ▌ハードウェアの詳細情報を意識せずにk8s nativeな方法でCephにOSDを提供できる ⚫従来のOSD ⚫各ノードのブロックデバイス上に作る ⚫OSD on PVC ⚫PVC(ブロックボリューム)上に作る 5

Slide 6

Slide 6 text

デバイス 従来のデバイス指定 ユーザが 指定 OSD on PVC PVC (Block Volume) Rookの クラスタリソース Kubernetes Linux Rookの クラスタリソース OSDの設定 CSIドライバ ユーザはここを 気にしなくていい ユーザが 指定 6 OSD on PVC OSDの設定

Slide 7

Slide 7 text

従来の方法の設定 ▌ノード上のデバイス名を直接使う 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の枠外で自力構成

Slide 8

Slide 8 text

どこのノードにあるのかは不明 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の提供方法は不明

Slide 9

Slide 9 text

目次 1. OSD on PVCとは何か 2. サイボウズ Necoプロジェクトにおける実践 9

Slide 10

Slide 10 text

サイボウズNecoプロジェクト ▌サイボウズの国内向けクラウドサービスの インフラ基盤 ▌オンプレミスK8sクラスタ+Cephクラスタ ▌アプリに提供するストレージ ⚫ブロックストレージ(今日の主題) ⚫オブジェクトストレージ 10

Slide 11

Slide 11 text

Necoのブロックストレージの要件 ▌ローカルNVMe SSDを使って二種類を提供 ⚫生のNVMe SSD: I/O性能重視。用途はMySQLなど ⚫Ceph RBD: スケーラビリティ、ポータビリティ重視 ▌運用を楽にしたい ⚫K8sの枠外で細かい設定をしたくない ▌ラック障害耐性が欲しい ⚫各データのレプリカはすべて別ラックに分散配置 11

Slide 12

Slide 12 text

Necoのブロックストレージの要件 ▌ローカルNVMe SSDを使って二種類を提供 ⚫生のNVMe SSD: I/O性能重視。用途はMySQLなど ⚫Ceph RBD: スケーラビリティ、ポータビリティ重視 ▌運用を楽にしたい ⚫K8sの枠外で細かい設定をしたくない ▌ラック障害耐性が欲しい ⚫各データのレプリカはすべて別ラックに分散配置 12

Slide 13

Slide 13 text

ノードの構成: 理想 13 NVMe SSD NVMe SSD PVC PVC PVC OSD OSD アプリAのPod OSD Pod OSD Pod CSIドライバが管理 Dynamic provisioning

Slide 14

Slide 14 text

問題 14 ▌以下条件を満たすCSIドライバが無い(*1) ⚫Local volume向け ⚫dynamic provisioningをサポート ⚫POCレベルではなく実用的 ▌→OSD増加時に逐次PVの準備が必要 *1) Remote volume向けにはEBSなどが使える

Slide 15

Slide 15 text

解決方法: 要件を満たす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

Slide 16

Slide 16 text

デバイス 従来のデバイス指定 ユーザが 指定 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の設定

Slide 17

Slide 17 text

どこのノードにあるのかは不明 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

Slide 18

Slide 18 text

どこのノードにあるのかは不明 運用イメージ ▌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数

Slide 19

Slide 19 text

問題 ▌OSD on PVCはLVMをサポートしない 19

Slide 20

Slide 20 text

解決方法 ▌Upstream RookにLVMサポートを追加 ⚫Master branchにマージ済み ⚫Rook V1.2からサポート見込み 20

Slide 21

Slide 21 text

Necoのブロックストレージの要件 ▌☑ローカルNVMe SSDを使って二種類を提供 ⚫生のNVMe SSD: I/O性能重視。用途はMySQLなど ⚫Ceph RBD: スケーラビリティ、ポータビリティ重視 ▌☑運用を楽にしたい ⚫K8sの枠外で細かい設定をしたくない ▌ラック障害耐性が欲しい ⚫各データのレプリカはすべて別ラックに分散配置 21

Slide 22

Slide 22 text

Necoのブロックストレージの要件 ▌☑ローカルNVMe SSDを使って二種類を提供 ⚫生のNVMe SSD: I/O性能重視。用途はMySQLなど ⚫Ceph RBD: スケーラビリティ、ポータビリティ重視 ▌☑運用を楽にしたい ⚫K8sの枠外で細かい設定をしたくない ▌ラック障害耐性が欲しい ⚫各データのレプリカはすべて別ラックに分散配置 22

Slide 23

Slide 23 text

説明のための要件の単純化 ▌システムは2ラック構成 ▌1ラック2ノード ▌データのレプリカは2つ 23 * 本物はもっと複雑です rack1 rack0 node0 node1 node2 node3

Slide 24

Slide 24 text

おさらい ▌KubernetesではPodは通常どのノードで動くか不明 ⚫OSD Podも同様 ▌OSDを2つにすると以下のようになるかもしれない 24 rack1 rack0 node0 node1 node2 node3 OSD Pod OSD Pod

Slide 25

Slide 25 text

問題 ▌ここでrack0が故障するとデータにアクセス不能 ▌→ラック障害耐性無し 25 rack1 rack0 node0 node1 node2 node3 OSD Pod OSD Pod

Slide 26

Slide 26 text

PodAntiAffinity ▌StorageClassDeviceSetsにはPodAntiAffinityを設定可能 ▌これを使えばOSD Podを均等分散配置できるのでは? 26 spec: … storageClassDeviceSets: - name: set0 … placement: - PodAntiAffinity …

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

解決方法 ▌PodTopologySpreadConstraints ⚫ Kubernetes1.16でalphaになった新機能 ⚫ 複数のPodをノードやラックなどの領域ごとに均等に分散配置可能 ⚫ 入れ子構造も可 ▌チェシャ猫さんの資料に詳しい 28

Slide 29

Slide 29 text

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を均等に分散配置

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

新規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にスケジュール

Slide 32

Slide 32 text

問題 ▌RookはPodTopologySpreadConstraintsをサポートしない ⚫Alpha機能なので当たり前ではあるが… 32

Slide 33

Slide 33 text

解決方法 ▌PodTopologySpreadConstraintsサポート 機能追加用issueをupstream Rookに発行 ⚫現在メンテナと実装方針を相談中 ⚫Rook v1.3での取り込みが目標 33

Slide 34

Slide 34 text

その他の取り組み ▌RookにOSD on PVC用のIntegration Testを追加 ⚫ODS on LV-backed PVCをTopoLVMによってテス トできないか検討中 ⚫Rook 1.3での取り込みを目指す 34

Slide 35

Slide 35 text

まとめ ▌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

Slide 36

Slide 36 text

参考リンク ▌ストレージオーケストレーター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

Slide 37

Slide 37 text

37 Enjoy Rook and OSD on PVC!