Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
プロダクション向けRook/Cephクラスタ構築への道
Search
Satoru Takeuchi
PRO
April 02, 2021
Technology
3
5.6k
プロダクション向けRook/Cephクラスタ構築への道
以下イベントの発表資料です。
https://rook.connpass.com/event/202147/
Satoru Takeuchi
PRO
April 02, 2021
Tweet
Share
More Decks by Satoru Takeuchi
See All by Satoru Takeuchi
ハイテク休憩
sat
PRO
2
130
利きプロセススケジューラ
sat
PRO
5
3.1k
俺とVSCode Python Debugger Extension
sat
PRO
1
190
コード再利用のしくみ ライブラリ
sat
PRO
3
60
AWKへの愛を語る
sat
PRO
3
540
syncコマンドのデータ同期 完了待ちやエラー検出
sat
PRO
0
99
動作中のLinux環境の全メモリを見る
sat
PRO
1
120
Linuxの時間を10秒止める
sat
PRO
2
220
プロセスへのメモリ割り当て4 - 実際に使うときにメモリを獲得するデマンドページング(実践編)
sat
PRO
1
150
Other Decks in Technology
See All in Technology
組織に自動テストを書く文化を根付かせる戦略(2024冬版) / Building Automated Test Culture 2024 Winter Edition
twada
PRO
12
3.4k
ゼロから創る横断SREチーム 挑戦と進化の軌跡
rvirus0817
2
260
20241220_S3 tablesの使い方を検証してみた
handy
3
240
LINEスキマニにおけるフロントエンド開発
lycorptech_jp
PRO
0
330
CustomCopを使ってMongoidのコーディングルールを整えてみた
jinoketani
0
220
2024年にチャレンジしたことを振り返るぞ
mitchan
0
130
第3回Snowflake女子会_LT登壇資料(合成データ)_Taro_CCCMK
tarotaro0129
0
180
ガバメントクラウドのセキュリティ対策事例について
fujisawaryohei
0
530
Postman と API セキュリティ / Postman and API Security
yokawasa
0
200
1等無人航空機操縦士一発試験 合格までの道のり ドローンミートアップ@大阪 2024/12/18
excdinc
0
150
サービスでLLMを採用したばっかりに振り回され続けたこの一年のあれやこれや
segavvy
2
370
開発生産性向上! 育成を「改善」と捉えるエンジニア育成戦略
shoota
1
230
Featured
See All Featured
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
17
2.2k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.3k
How GitHub (no longer) Works
holman
311
140k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
5
440
Testing 201, or: Great Expectations
jmmastey
40
7.1k
Documentation Writing (for coders)
carmenintech
66
4.5k
Optimising Largest Contentful Paint
csswizardry
33
3k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.9k
GitHub's CSS Performance
jonrohan
1030
460k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
29
2k
Transcript
プロダクション向け Rook/Cephクラスタ構築への道 Japan Rook Meetup #5 Cybozu, Inc. Neco Project
Satoru Takeuchi Twitter: satoru_takeuchi 1
目次 1. CephとRookの基礎 2. サイボウズのインフラ基盤とストレージ基盤 3. プロダクション向けRook/Cephクラスタの構成 4. 現状と今後 2
Rook/Cephの基礎 3
Cephとは ▌オープンソースの分散ストレージ ▌提供するストレージ ⚫RBD: ブロックデバイス ⚫RGW: S3互換オブジェクトストレージ ⚫CephFS: ファイルシステム ▌ユーザ
⚫大きなところだとNASA, CERNなど 4
アーキテクチャ 5 アプリ RADOS(Ceph独自のオブジェクトストレージ) Ceph node node node … RBD
RGW ブロックデバイス オブジェクト ブロックデバイス ブロックデバイス オブジェクト S3互換オブジェクト アプリ アプリ pool pool
Cephを構成するデーモン ▌Monitor(MON) ⚫Cephクラスタに対する全処理の整合性を保つ ⚫通常システムに奇数個、通常3つ以上存在 ▌Manager(MGR) ⚫機能拡張のためのモジュールの管理 ⚫通常システムに1つ存在 ▌Object Storage Daemon(OSD)
⚫データストアを管理 ⚫OSDへのI/O、OSDの相互生存監視を担当 6
Object Storage Daemon(OSD) ▌Cephがストレージデバイスを管理する単位 ⚫ OSDをあらわすデータ構造もOSDを管理するデーモン(後述)も両方OSDと呼ぶ ▌1つのデバイスに1つ以上のOSDを作れる ⚫ HDDは通常1つ、NVMe SSDは通常2以上
7 RADOS node HDD node NVMe SSD OSD OSD OSD
データの均等分散配置(例えばラック間分散) 8 rack1 rack0 rack1 rack0 node0 node1 node2 node3
OSD OSD OSD OSD OSD OSD OSD OSD Cephクライアント(RBD, RGW) データ CRUSHによるデータの均等分散配置 Ceph 管理者によるOSDの均等分散配置
用語説明 ▌CRUSHアルゴリズム ⚫データのOSDへの分散配置方法を決める ⚫各オブジェクトのレプリカを全OSDになるべくランダムに配置 ▌CRUSH map ⚫クラスタを構成するハードウェアの物理的な構成を記述 ⚫ラックやノード、OSDの関係を示すツリー構造 ⚫Failure domainを設定可能
9
CRUSH mapの例 ▌2rack,2node per 1rack,2osd per 1nodeの例 10 node OSD
OSD rack node OSD OSD node OSD OSD rack node OSD OSD root
Rookとは ▌K8sで動くCephのオーケストレータ ⚫CassandraやNFSなども管理できる ▌CephClusterというCRでクラスタを管理 ▌MON,MGR,OSDごとにPodが1つ存在(以下はOSD pod) 11 ブロックデバイス OSD Pod
OSD
• Host-basedクラスタ • ハード構成を直接CRに書く • 大規模になると管理が困難 • PVC-basedクラスタ(サイボウズはこちら) • CRに書くのはOSDを作るPVのVolumeClaimTemplates
• ボリュームの作成/配置はK8sとCSIドライバの責任 • countフィールドを増やすとOSD(Pod)が増える • 規模にかかわらず構築後の拡張は楽 storage: nodes: - name: foo devices: - sdb - sdc - name: bar … 12 2種類のRook/Cephクラスタ storage: … count: 3 volumeClaimTemplates: - spec: resources: requests: storage: 10Gi storageClassName: my-class
RBDの使い方(1/2) 13 apiVersion: ceph.rook.io/v1 kind: CephBlockPool metadata: name: ceph-block-pool namespace:
rook-ceph spec: replicated: size: 3 apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: ceph-block provisioner: ceph-ssd.rbd.csi.ceph.com parameters: clusterID: ceph-ssd pool: ceph-ssd-block-pool 2. 管理者がストレージクラスを定義 1. 管理者がPoolを定義
RBDの使い方(2/2) 14 3. ユーザがPVCを作る apiVersion: v1 kind: PersistentVolume metadata: name:
myclaim spec: storageClassName: ceph-block 4. PodからPVCを使う apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: foo image: foo volumeMounts: - mountPath: "/mnt" name: myvolume volumes: - name: myvolume persistentVolumeClaim: claimName: myclaim
RGWの使い方(1/2) 15 1. 管理者がオブジェクトストレージを作る apiVersion: ceph.rook.io/v1 kind: CephObjectStore metadata: name:
ceph-object-store namespace: rook-ceph spec: dataPool: replicated: size: 3 apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: ceph-bucket provisioner: ceph-hdd.ceph.rook.io/bucket parameters: objectStoreName: ceph-object-store objectStoreNamespace: rook-ceph 2. 管理者がストレージクラスを作る
RGWの使い方(2/2) 16 3. ユーザがbucketを作る kind: ObjectBucketClaim metadata: name: test-object-bucket namespace:
default spec: generateBucketName: test-object-bucket storageClassName: ceph-bucket kind: Pod metadata: name: app-pod spec: containers: - name: foo image: bar envFrom: - configMapRef: name: test-object-bucket - secretRef: name: test-object-bucket 4. ユーザが使う bucketへのアクセス方法が 下記ConfigMapとSecretsに入っている
サイボウズのインフラ基盤と ストレージ基盤 17
インフラ基盤のハードウェア構成 ▌2種のサーバを詰めたラックを並べる 18 rack CS SS SS SS rack CS
CS CS SS rack CS CS SS SS … CS SS • Computing Server • 全サービスが使う • ストレージはNVMe SSD • Storage Server • Ceph専用 • ストレージはHDD
特徴 ▌ソフトウェアマルチテナンシー ⚫Cephもアプリも同じK8sクラスタ上で動く ▌ラック障害耐性 ⚫運用継続 ⚫データロスト無し 19
必要なストレージ ▌高速ローカルブロックストレージ ⚫ 顧客データを扱うMySQLなど ▌中速&スケーラブルなブロックストレージ ⚫ ファイルシステムを前提としたアプリのデータなど ▌大容量&スケーラブルなブロックストレージ ⚫ メトリクスやログ
▌大容量&スケーラブルなオブジェクトストレージ ⚫ 添付ファイルなど 20
ストレージ基盤の構成 21 K8sクラスタ Rook/CephクラスタA Rook/CephクラスタB RGW RBD RBD HDD SS
CS SSD HDD HDD SSD SSD LogicalVolume LogicalVolume LogicalVolume LogicalVolume LogicalVolume LogicalVolume TopoLVMが管理 ローカル ストレージ
全体構成のイメージ 22 K8sクラスタ リモート K8sクラスタ * 左図と 同様の構成 レプリケーション Victoria
Metrics & Loki Rook/CephクラスタA Rook/CephクラスタB Pod Pod Pod RGW RBD RBD メトリクス & ログ HDD SS CS SSD HDD HDD SSD SSD LogicalVolume LogicalVolume LogicalVolume LogicalVolume LogicalVolume LogicalVolume Pod
プロダクション向け Rook/Cephクラスタの構成 23
NVMe SSD Cephクラスタの設定 ▌OSD用のブロックデバイスは自社製CSIドライバTopoLVMから切り出す ⚫ TopoLVMはDynamic provisioningをサポート ⚫ OSDの数を増やすときに対応するPVが自動的に作られる 24
storage: … count: 20 volumeClaimTemplates: - spec: resources: requests: storage: 1Ti storageClassName: topolvm-provisioner CephCluster CRより抜粋
HDD Cephクラスタの設定 ▌OSD用のブロックデバイスは自社製ツールで自動生成 ⚫ KubernetesクラスタにSSを組み込むと自動的にHDD用のPVを作成 ▌管理者はPVのprovisioningを気にしなくてよい 25 storage: … count:
20 volumeClaimTemplates: - spec: resources: requests: storage: 1Ti storageClassName: local-storage CephCluster CRより抜粋
Cephコマンド実行ツールのdeploy ▌Rookが提供するtoolbox Pod ⚫ソースのcluster/example/Kubernetes/ceph/toolbox.yamlにある ⚫両方のクラスタにdeploy ▌使い方 ⚫kubectl apply –f toolbox.yaml
⚫kubectl –n rook-ceph exec rook-ceph-tool-XXX –- ceph status ▌使いどころ ⚫CRの記述では実現できない一部オペレーション ⚫デバッグ 26
ラック間のデータの均等分散配置 27 rack1 rack0 rack1 rack0 node0 node1 node2 node3
OSD OSD OSD OSD OSD OSD OSD OSD Cephクライアント(RBD, RGW) データ CRUSHによるデータの均等分散配置 Rook RookによるOSD Podの均等分散配置
CRUSHによるデータの均等分散配置 ▌プールのfailureDomainフィールドを設定 ⚫CRUSH ruleはRookが自動生成 28 apiVersion: ceph.rook.io/v1 kind: CephBlockPool metadata:
name: ceph-ssd-block-pool namespace: ceph-ssd spec: failureDomain: zone replicated: size: 3 apiVersion: ceph.rook.io/v1 kind: CephObjectStore metadata: name: ceph-hdd-object-store namespace: ceph-hdd spec: dataPool: failureDomain: zone replicated: size: 3 apiVersion: ceph.rook.io/v1 kind: CephBlockPool metadata: name: ceph-hdd-block-pool namespace: ceph-hdd spec: failureDomain: zone replicated: size: 3 SSD CephのRBDのpool HDD CephのRBDのpool HDD Cephのオブジェクトストア
OSDの均等分散配置 ▌課題 ⚫KubernetesのPodはどのノードにスケジュールされるかわからない ⚫ OSD Podも例外ではない ⚫特定ノードにOSDの配置が偏ると困る ▌解決方法 ⚫K8sのTopologySpreadConstraints(TSC)機能 ⚫K8sのScheduling
profile機能 29
OSD Podのスケジューリング with TSC 30 rack0 node0 OSD OSD node1
OSD OSD rack1 node2 OSD OSD node3 OSD 新規OSD Pod 1. rack0のOSD数 > rack1のOSD数 →rack1上のノードにスケジュール 2. node2のOSD数 > node3のOSD数 →node3にスケジュール
TSCの設定例 31 apiVersion: v1 kind: Pod metadata: name: mypod spec:
topologySpreadConstraints: - maxSkew: 1 topologyKey: topology.Kubernetes.io/zone labelSelector: … ドメイン間で許容されるPod数の差 Pod数の均衡をすべきドメイン 対象となるPodを選択
課題: TSCとStatefulアプリの相性が悪い ▌システムの運用中にハード構成は大きく変わりうる ⚫ ラック/ノード/デバイスの追加/削除/故障 ▌ローカルストレージを使うPodは別ノードに移動できない ▌デフォルトではmaxSkewより大きな差があるとOSD Podが増やせない 32
問題になるケースの例 33 node0 node1 disk0 disk1 disk2 disk0 disk1 disk2
node0 node1 disk0 disk1 disk2 disk0 disk1 disk2 OSD OSD OSD OSD OSD OSD OSD 時間経過 node0 node1 disk0 disk1 disk2 disk0 disk1 disk2 node2 disk0 disk1 disk2 OSD Node2を追加 node0 node1 disk0 disk1 disk2 disk0 disk1 disk2 node2 disk0 disk1 disk2 OSD このディスク用のOSDは デフォルトではTSCの 制約により作れない 追加ディスク用 OSDの作成 OSD OSD
対策: TSCの制約の緩和 ▌TSCのwhenUnsatisfiableフィールドの変更 ⚫dontSchedule(デフォルト): 制約を満たせる時のみスケジュール ⚫scheduleAnyway: 制約を満たせなくてもスケジュール ⚫ Podの分散具合についてはスケジューラのスコアに影響 ▌参考:
maxSkewの値を2以上にする対策は困難 ⚫小さすぎる: 場合によっては結局OSD Podが作れない ⚫大きすぎる: 設定する意味がない 34
さらなる課題 ▌TSCのwhenUnsatisfiableフィールドの変更 ⚫dontSchedule(デフォルト): 制約を満たせる時のみスケジュール ⚫scheduleAnyway: 制約を満たせなくてもスケジュール ⚫ Podの分散具合についてはスケジューラのスコアに影響 35 ノードのスコアリングにおける
Podの分散具合のweightがほとんどゼロなので、 事実上無視される
解決方法: スケジューラの設定変更 ▌scheduling profile機能を使用(k8s v1.18~) ⚫アプリごとにスケジューラの設定をprofileとして作れる ▌Profileごとにpodの分散具合のweightを高められる ▌サイボウズではデフォルトスケジューラの設定を変更 ⚫他のアプリでもTSCは有用 36
Default scheduling profileの変更 37 profiles: - schedulerName: default-scheduler plugins: score:
… enabled: - name: PodTopologySpread weight: 500 pluginConfig: - name: PodTopologySpread args: defaultConstraints: - maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: ScheduleAnyway weightを大きくする デフォルトTSC ラック間でPod分散配置 * サイボウズのK8sクラスタでは zoneがrackに対応
CephClusterのCRにOSD Pod用TSC設定 ▌rack間でOSDを均等分散+host間でも均等分散 38 storage: … placement: topologySpreadConstraints: - maxSkew:
1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: ScheduleAnyway labelSelector: matchExpressions: - key: app operator: In values: - rook-ceph-osd - rook-ceph-osd-prepare … … - maxSkew: 1 topologyKey: kubernetes.io/hostname whenUnsatisfiable: ScheduleAnyway labelSelector: matchExpressions: - key: app operator: In values: - rook-ceph-osd - rook-ceph-osd-prepare
現状と今後 39
最終的な全体構成のイメージ(再載) 40 K8sクラスタ リモート K8sクラスタ * 左図と 同様の構成 レプリケーション Victoria
Metrics & Loki Rook/CephクラスタA Rook/CephクラスタB Pod Pod Pod RGW RBD RBD メトリクス & ログ HDD SS CS SSD HDD HDD SSD SSD LogicalVolume LogicalVolume LogicalVolume LogicalVolume LogicalVolume LogicalVolume Pod
進捗 ▌基本的な機能検証は完了 ⚫既に説明した諸機能 ⚫OSD破壊からの復旧 ⚫MON quorumの回復 ▌インフラ基盤の監視、ログのストレージとして使用中 ▌ユーザデータは性能を気にしないものなら置いていい 41
現状の構成 42 K8sクラスタ リモート レプリケーション Victoria Metrics & Loki Rook/CephクラスタA
Rook/CephクラスタB Pod Pod Pod RGW RBD RBD メトリクス & ログ HDD SS CS SSD LogicalVolume LogicalVolume LogicalVolume LogicalVolume LogicalVolume LogicalVolume Pod 現行インフラ リモート K8sクラスタ * 左図と 同様の構成
基本的な運用はとにかく楽 ▌クラスタの作成: CephCluster CRをapplyするだけ ▌クラスタの拡張: 前述のcountフィールドの値を増やすだけ 1. countフィールド値の変化をRookが検知、OSD用のPVCを作る 2. 上記ボリューム上にOSDを作成してクラスタに組み込む
▌故障したOSDの退役: ほぼ自動化するジョブあり ▌ユーザはインフラがCephかどうかは気にしなくていい ⚫ 単に通常通りストレージクラスを指定してPVCを作るだけ 43
今後 1. 性能検証&可用性を高める 2. 追加構成 ⚫リモートレプリケーション ⚫スナップショット、バックアップ/リストア ⚫RGWの使用方法をKubernetes公式のCOSIに移行 ⚫ 現在は事実上Rook独自のインタフェース
3. 全データを(徐々に)移行 44
参考 ▌サイボウズのRook関連のマニフェスト ⚫ https://github.com/cybozu-go/neco-apps/tree/main/rook ▌Production-grade Deployment of PVC-based Rook/Ceph Cluster
⚫ https://blog.kintone.io/entry/2020/09/18/175030 ▌賢く「散らす」ためのTopology Spread Constraints ⚫ https://speakerdeck.com/ytaka23/kubernetes-meetup-tokyo-25th ▌Scheduling Profileが実現するPod配置戦略の最前線 ⚫ https://speakerdeck.com/ytaka23/infra-study-meetup-2nd ▌Capacity-aware Dynamic Volume Provisioning For LVM Local Storage ⚫ https://static.sched.com/hosted_files/kccnceu20/a4/kubecon-eu2020_topolvm.pdf 45
46 Thank you! Any question?