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. 6.

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

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

    Node Node Node Task A A A A A A

    Task B B B B B B #k8sjp
  3. 8.

    Node A A Node B A Node B Task A

    A A Task B B B B 待ち 待ち #k8sjp
  4. 9.

    Gang Scheduling • 一度にまとめて Pod を配置したい ◦ お互いに相手をブロックする状況を防ぐ ◦ 通常の

    kube-scheduler では実現が困難 • Gang (= 徒党) 単位での配置 ◦ 全 Pod が配置できない限り残りも Pending ◦ 最近の資料だと Co-Scheduling とも呼ばれる ◦ 貨物積載の専門職も「ギャング」と呼ばれる #k8sjp
  5. 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
  6. 13.

    Queue の定義 apiVersion: scheduling.sig.dev/v1alpha2 kind: Queue metadata: name: myqueue spec:

    weight: 1 クラスタ全体のリソース(CPU / Memory)を 複数 Queue に配分する際の時の重み #k8sjp
  7. 14.
  8. 15.

    PodGroup の定義 apiVersion: scheduling.sig.dev/v1alpha2 kind: PodGroup metadata: name: mygroup spec:

    minMember: 3 queue: myqueue priorityClassName: mypriority 配置時に最低限必要な Pod の個数 #k8sjp
  9. 16.

    Job に対する PodGroup の指定 apiVersion: batch/v1 kind: Job metadata: name:

    myjob spec: template: metadata: annotation: scheduling.k8s.io/group-name: mygroup spec: containers: ... #k8sjp
  10. 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
  11. 19.

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

    Nothing でまとめて配置したい ◦ 通常の kube-scheduler では対応が困難 • kube-batch の利用 ◦ PodGroup による必要個数の指定 ◦ 複数の Queue によるリソースの按分 #k8sjp