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.5k
プロダクション向け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
5
2.8k
俺とVSCode Python Debugger Extension
sat
PRO
1
180
コード再利用のしくみ ライブラリ
sat
PRO
3
49
AWKへの愛を語る
sat
PRO
3
520
syncコマンドのデータ同期 完了待ちやエラー検出
sat
PRO
0
64
動作中のLinux環境の全メモリを見る
sat
PRO
1
93
Linuxの時間を10秒止める
sat
PRO
2
210
プロセスへのメモリ割り当て4 - 実際に使うときにメモリを獲得するデマンドページング(実践編)
sat
PRO
1
120
プロセスへのメモリ割り当て(3) 実際に使うときにメモリを獲得するデマンドページング
sat
PRO
1
73
Other Decks in Technology
See All in Technology
リンクアンドモチベーション ソフトウェアエンジニア向け紹介資料 / Introduction to Link and Motivation for Software Engineers
lmi
4
300k
iOSチームとAndroidチームでブランチ運用が違ったので整理してます
sansantech
PRO
0
130
ドメイン名の終活について - JPAAWG 7th -
mikit
33
20k
The Role of Developer Relations in AI Product Success.
giftojabu1
0
120
Amazon Personalizeのレコメンドシステム構築、実際何するの?〜大体10分で具体的なイメージをつかむ〜
kniino
1
100
[FOSS4G 2019 Niigata] AIによる効率的危険斜面抽出システムの開発について
nssv
0
310
100 名超が参加した日経グループ横断の競技型 AWS 学習イベント「Nikkei Group AWS GameDay」の紹介/mediajaws202411
nikkei_engineer_recruiting
1
170
OCI 運用監視サービス 概要
oracle4engineer
PRO
0
4.8k
AWS Lambdaと歩んだ“サーバーレス”と今後 #lambda_10years
yoshidashingo
1
170
【Startup CTO of the Year 2024 / Audience Award】アセンド取締役CTO 丹羽健
niwatakeru
0
950
Python(PYNQ)がテーマのAMD主催のFPGAコンテストに参加してきた
iotengineer22
0
470
Oracle Cloud Infrastructureデータベース・クラウド:各バージョンのサポート期間
oracle4engineer
PRO
28
12k
Featured
See All Featured
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
6.9k
A designer walks into a library…
pauljervisheath
203
24k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
860
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
250
21k
Testing 201, or: Great Expectations
jmmastey
38
7.1k
Music & Morning Musume
bryan
46
6.2k
BBQ
matthewcrist
85
9.3k
What's new in Ruby 2.0
geeforr
343
31k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
131
33k
Faster Mobile Websites
deanohume
305
30k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
27
4.3k
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?