KubernetesでCephクラスタ用のストレージをどう管理するか 分割と配置の最適化への取り組み

KubernetesでCephクラスタ用のストレージをどう管理するか 分割と配置の最適化への取り組み

CloudNative Days Tokyo 2020発表資料。
k8sの各ノードのストレージでCephクラスタを組むにあたり、TopoLVMにより動的にボリュームを切り出した点と、PodTopologySpreadConstraintsによりボリュームを最適に分散配置した点を解説する。

6dab07ff3b780f9f974e335e2a94881b?s=128

morimoto-cybozu

September 08, 2020
Tweet

Transcript

  1. KubernetesでCephクラスタ用のストレージをどう管理するか 分割と配置の最適化への取り組み サイボウズ株式会社 森本健司 1

  2. 自己紹介 ▌森本健司 ⚫github.com: morimoto-cybozu ▌cybozu.comのインフラ開発・運用を8年間担当 ▌インフラ刷新プロジェクトでKubernetesと出会う ⚫手作業のない世界を目指す 2

  3. 今日紹介する内容 ▌LVMで動的にボリュームを作成するTopoLVM ⚫サイボウズ製のOSS ▌ボリュームを最適に分散配置する各種の工夫 ⚫PodTopologySpreadConstraints ⚫kube-schedulerのチューニング 3

  4. Cephの紹介 ▌OSSの分散ストレージシステム ⚫スケーラブルで耐障害性をほぼ自動で確保 ▌意識して分散させるべき構成要素 ⚫Monitor (Paxosで分散合意) ⚫Object Storage Device (OSD)

    4
  5. 5 ラック1 サーバ ラック2 ラック3 Mon Mon Mon Monitorの配置は anti-affinityでOK!

  6. Rookの紹介 ▌Kubernetes上でCephを自動運用 ▌機能例 ⚫Cephクラスタを宣言どおりに構築 ⚫CephクラスタからS3互換のバケットを作成 6

  7. 解決したい課題 ▌LVMで柔軟にボリュームを作成したい ⚫Ceph以外に、MySQL等でも使いたいため ▌OSDボリュームを分散配置したい ⚫攪乱要因がいろいろあるが、負けずに! ⚫例:HDD数台の故障、LVM VGの容量差、ラック間 の機材台数の差、... 7

  8. 8 SSD LV SSD LV SSD LV LV MySQLに利用 LVMで柔軟にボリュームを作成したい

  9. デバイスをLVMで切り出す ▌k8sのストレージドライバTopoLVMを開発 ⚫PersistentVolumeClaimに対して、各ノードの空き 容量を考慮しつつLVを切り出してPVとして渡す ▌Rookの「OSD on PVC」方式でストレージを指定 ⚫OSD Pod作成時にPVCでOSDを要求 ▌この組み合わせで、宣言的にSSDを分割・統合

    9
  10. 10 CephCluster YAML SSD

  11. OSD 11 CephCluster YAML SSD 「このノードのこのデバイス」 ではなく 「このStorageClassで デバイスを確保」 という指定

  12. OSD 12 CephCluster YAML TopoLVM SSD LV 宣言に基づき LVを動的に確保

  13. OSD 13 CephCluster YAML TopoLVM SSD LV 宣言に基づき LVを動的に確保

  14. 14 ラック1 zone: rack1 host: r1-s1 ラック2 ラック3 OSD zone:

    rack1 host: r1-s2 zone: rack2 host: r2-s1 zone: rack2 host: r2-s2 zone: rack3 host: r3-s1 zone: rack3 host: r3-s2 OSD OSD OSD OSD OSD OSD OSD OSDボリュームを分散配置したい
  15. PVの配置問題をPodの配置問題に置換 ▌k8sはPVの配置を直接は管理しない ▌PVの配置をPodのスケジューリングに置き換える ⚫Podが使うPVCのStorageClassで volumeBindingMode: WaitForFirstConsumer ⚫まずPodのスケジューリング ⚫Pod/Nodeが決まったらそれに適したPVをbind 15

  16. 16 CephCluster YAML SSD

  17. OSD 17 CephCluster YAML SSD Podがスケジュールされるまでは PVを割り当てなくていいよ

  18. OSD 18 CephCluster YAML SSD affinity, anti-affinityや リソースキャパシティの観点から Podをスケジューリング

  19. OSD 19 CephCluster YAML TopoLVM SSD LV 「どのノードのストレージを使うか」問題を 「どのノードにPodを置くか」問題で解決

  20. OSD 20 CephCluster YAML TopoLVM SSD LV 「どのノードのストレージを使うか」問題を 「どのノードにPodを置くか」問題で解決

  21. OSD Podを分散配置したい ▌anti-affinityでは表現できない ⚫1ホストに複数のOSDを配置するので ▌pod topology spread constraintsを使う ⚫k8s 1.18でbetaとなった新しめの機能

    ⚫ホスト単位/ラック単位/...でpod数の差を maxSkew以下に抑える 21
  22. topologySpreadConstraints ▌whenUnsatisfiable: DoNotSchedule (デフォ) ⚫まったく均等な機材構成が必須になる ⚫例えばあるノードでMySQLのためにVGを使い果たし ていて、maxSkewを満たせない → Pod作成エラー ▌whenUnsatisfiable:

    ScheduleAnyway ⚫skewを最小に抑えつつ配置続行……のはずだが? 22
  23. whenUnsatisfiable: ScheduleAnyway ▌想定: まずskew条件を満たすよう配置を試みる、駄 目なら優先度を下げる ▌→ 実際に配置してみた 23

  24. 24 ラック1 zone: rack1 host: r1-s1 ラック2 ラック3 zone: rack1

    host: r1-s2 zone: rack2 host: r2-s1 zone: rack2 host: r2-s2 zone: rack3 host: r3-s1 zone: rack3 host: r3-s2 skewは満たせるはずなのに…… Pod Pod Pod Pod Pod Pod Pod Pod Pod やや重いPodだが resourceには余裕あり
  25. 25 ラック1 zone: rack1 host: r1-s1 ラック2 ラック3 zone: rack1

    host: r1-s2 zone: rack2 host: r2-s1 zone: rack2 host: r2-s2 zone: rack3 host: r3-s1 zone: rack3 host: r3-s2 OSD OSD OSD OSD OSD OSD OSD skewは満たせるはずなのに…… Pod OSD まるでspreadしていない! Pod Pod Pod Pod Pod Pod Pod Pod
  26. whenUnsatisfiable: ScheduleAnyway ▌想定: まずskew条件を満たすよう配置を試みる、駄 目なら優先度を下げる ▌実際: 満たすかどうか試みず、単にskew条件をスコアリ ングの数ある条件の一つにしてしまう ▌メンテナに確認、「実際の動作が仕様」 ⚫whenUnsatisfiableを文字どおりに受け取ってはい

    けない! 26
  27. kube-schedulerをチューニング ▌skew条件のweightを大きくしてやればいい ⚫1.17: scheduling policy (全体で1つ)を調整 ⚫EvenPodsSpreadPriorityのweightを500に ⚫1.18+: scheduling profile

    (複数可)を調整 ⚫1.18: PodTopologySpreadのweightを500に ⚫1.19: NodeResourcesBalancedAllocation無効化 27
  28. kube-schedulerをチューニング 1.18設定 28 apiVersion: kubescheduler.config.k8s.io/v1alpha2 kind: KubeSchedulerConfiguration leaderElection: leaderElect: true

    clientConnection: kubeconfig: /etc/kubernetes/scheduler.conf profiles: - schedulerName: default-scheduler plugins: score: disabled: - name: PodTopologySpread enabled: - name: PodTopologySpread weight: 500
  29. サイボウズが追加したRookの機能 ▌元々はPodの配置の指示が貧弱だった ▌Monitor PodのpodAntiAffinity対応の修正 ▌OSD PodのtopologySpreadConstraints対応 ▌OSD podのschedulerName指定対応 29

  30. まとめ ▌TopoLVMで動的にストレージを分割した ▌OSDボリュームを最適に分散配置した ⚫Topology spread constraintsを活用 ⚫攪乱要因に対しkube-schedulerをチューニング ⚫→ Cephに限らずPodの分散配置に有効な知見 30