Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

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

morimoto-cybozu

September 08, 2020
Tweet

Other Decks in How-to & DIY

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  10. 10
    CephCluster
    YAML
    SSD

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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ボリュームを分散配置したい

    View full-size slide

  15. PVの配置問題をPodの配置問題に置換
    ▌k8sはPVの配置を直接は管理しない
    ▌PVの配置をPodのスケジューリングに置き換える
    ⚫Podが使うPVCのStorageClassで
    volumeBindingMode: WaitForFirstConsumer
    ⚫まずPodのスケジューリング
    ⚫Pod/Nodeが決まったらそれに適したPVをbind
    15

    View full-size slide

  16. 16
    CephCluster
    YAML
    SSD

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  22. topologySpreadConstraints
    ▌whenUnsatisfiable: DoNotSchedule (デフォ)
    ⚫まったく均等な機材構成が必須になる
    ⚫例えばあるノードでMySQLのためにVGを使い果たし
    ていて、maxSkewを満たせない → Pod作成エラー
    ▌whenUnsatisfiable: ScheduleAnyway
    ⚫skewを最小に抑えつつ配置続行……のはずだが?
    22

    View full-size slide

  23. whenUnsatisfiable: ScheduleAnyway
    ▌想定: まずskew条件を満たすよう配置を試みる、駄
    目なら優先度を下げる
    ▌→ 実際に配置してみた
    23

    View full-size slide

  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には余裕あり

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  29. サイボウズが追加したRookの機能
    ▌元々はPodの配置の指示が貧弱だった
    ▌Monitor PodのpodAntiAffinity対応の修正
    ▌OSD PodのtopologySpreadConstraints対応
    ▌OSD podのschedulerName指定対応
    29

    View full-size slide

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

    View full-size slide