kube-batch による Gang Scheduling #k8sjp / Kubernetes Invitational Meetup Tokyo 4th

332f89cc697355902a817506b6995f2b?s=47 y_taka_23
December 18, 2019

kube-batch による Gang Scheduling #k8sjp / Kubernetes Invitational Meetup Tokyo 4th

Kubernetes Invitational Meetup Tokyo #4 で使用したスライドです。

複数の Pod が通信し合って実行を進めるような Job をデプロイする場合、一部の Pod だけが先に配置された状態で Node のリソースを使い切ってしまうと、後続の Pod が配置できずにデッドロックに陥ることがあります。

これを防ぐため、特定のグループに属する Pod を一度に全て配置するか、あるいは全て Pending のまま留めるかという All of Nothing の配置戦略を Gand Scheduling あるいは CoScheduling と呼びます。

今回紹介した kube-batch は Gang Scheduling を実現する特殊スケジューラの一種です。Gang Scheduling 以外にも、複数のキューを定義してクラスタのリソースをキュー間で均等に配分するなどの機能が提供されています。

イベント概要:https://k8sjp.connpass.com/event/155241/

332f89cc697355902a817506b6995f2b?s=128

y_taka_23

December 18, 2019
Tweet

Transcript

  1. kube-batch による Gang Scheduling チェシャ猫 (@y_taka_23) Kubernetes Invitational Meetup Tokyo

    #4 (2019/12/18) #k8sjp
  2. Scheduling 完全に理解した人? #k8sjp

  3. Queue Scheduling Cycle Binding Threads #k8sjp

  4. Queue Scheduling Cycle Binding Threads 1 Pod 毎に判定 #k8sjp

  5. ダメな例:学習タスクのブロック #k8sjp

  6. 例:機械学習用の Job • 処理に依存性がある複数の Pod ◦ 例えば 5 個の Pod

    に Training を分散させる ◦ 各々の Pod の処理には他 Pod の結果が必要 • デッドロックの可能性 ◦ クラスタのキャパシティが充分でない場合 ◦ 各タスクの一部分だけ Pod が Running になる ◦ お互いの終了を待ち続けて動けない #k8sjp
  7. Node Node Node Task A A A A A A

    Task B B B B B B #k8sjp
  8. Node A A Node B A Node B Task A

    A A Task B B B B 待ち 待ち #k8sjp
  9. Gang Scheduling • 一度にまとめて Pod を配置したい ◦ お互いに相手をブロックする状況を防ぐ ◦ 通常の

    kube-scheduler では実現が困難 • Gang (= 徒党) 単位での配置 ◦ 全 Pod が配置できない限り残りも Pending ◦ 最近の資料だと Co-Scheduling とも呼ばれる ◦ 貨物積載の専門職も「ギャング」と呼ばれる #k8sjp
  10. kube-batch https://github.com/kubernetes-sigs/kube-batch #k8sjp

  11. kube-batch の特徴 • バッチ処理用の特殊スケジューラ ◦ Scheduling SIG による PoC のような扱い

    ◦ Kubeflow のスケジューラ Volcano のベース • kube-batch が提供する機能 ◦ Pod Priority / Preemption(v1.8 で k/k に導入) ◦ Pod Group による Gang Scheduling ◦ 複数の Queue に CPU / Memory を按分 #k8sjp
  12. Queue の定義 apiVersion: scheduling.sig.dev/v1alpha2 kind: Queue metadata: name: myqueue spec:

    weight: 1 #k8sjp
  13. Queue の定義 apiVersion: scheduling.sig.dev/v1alpha2 kind: Queue metadata: name: myqueue spec:

    weight: 1 クラスタ全体のリソース(CPU / Memory)を 複数 Queue に配分する際の時の重み #k8sjp
  14. PodGroup の定義 apiVersion: scheduling.sig.dev/v1alpha2 kind: PodGroup metadata: name: mygroup spec:

    minMember: 3 queue: myqueue priorityClassName: mypriority #k8sjp
  15. PodGroup の定義 apiVersion: scheduling.sig.dev/v1alpha2 kind: PodGroup metadata: name: mygroup spec:

    minMember: 3 queue: myqueue priorityClassName: mypriority 配置時に最低限必要な Pod の個数 #k8sjp
  16. Job に対する PodGroup の指定 apiVersion: batch/v1 kind: Job metadata: name:

    myjob spec: template: metadata: annotation: scheduling.k8s.io/group-name: mygroup spec: containers: ... #k8sjp
  17. Job に対する PodGroup の指定 apiVersion: batch/v1 kind: Job metadata: name:

    myjob spec: template: metadata: annotation: scheduling.k8s.io/group-name: mygroup spec: containers: ... 先ほど作成した PodGroup 名を指定 #k8sjp
  18. (DEMO) #k8sjp

  19. まとめ • 依存性のある複数の Pod の配置 ◦ お互いに相手をブロックしてしまう ◦ All or

    Nothing でまとめて配置したい ◦ 通常の kube-scheduler では対応が困難 • kube-batch の利用 ◦ PodGroup による必要個数の指定 ◦ 複数の Queue によるリソースの按分 #k8sjp
  20. Let’s Be Gangstas Together! Presented by チェシャ猫 (@y_taka_23) #k8sjp