Kubernetes 1.15 の新機能で Preemption を制御せよ #dockertokyo / Docker Meetup Tokyo 31st

Kubernetes 1.15 の新機能で Preemption を制御せよ #dockertokyo / Docker Meetup Tokyo 31st

Docker Meetup Tokyo #31 で使用したスライドです。

Kubernetes の Pod Preemption を利用すると、より重要な Pod にノードの計算リソースを割り当てる優先的に割り当てることができ、コストの最適化につながります。しかし優先度の低い Pod は実行中に強制的に終了されることとなり、長時間かかるバッチ処理が途中で中断されてしまうという弊害もあります。

このような問題に対して本スライドでは、Kubernetes 1.15 から Alpha 機能として導入された NonPreemptingPriority と Scheduling Framework を利用して、中断されたくない Pod に対する Preemption を抑制する手法を提案します。

イベント概要:https://dockerjp.connpass.com/event/135043/
ブログ記事:https://ccvanishing.hateblo.jp/entry/2019/07/06/213029

332f89cc697355902a817506b6995f2b?s=128

y_taka_23

July 05, 2019
Tweet

Transcript

  1. 3.

    Node 1 A Batch B Node 2 Node 3 App

    A B B Scheduling Priority Queue #dockertokyo
  2. 4.

    Node 1 B Batch B Node 2 Node 3 App

    A A B Scheduling Priority Queue #dockertokyo
  3. 5.

    Pod Preemption • Pod に優先度を定義 ◦ PriorityClass リソースを作成 ◦ 数字が大きいほど優先度が高い

    • Node のリソース不足の際に発動 ◦ 低優先度の Pod を追い出して余裕を作る ◦ 追い出しの被害が少ない Node を選択 ◦ Node のスケーリングより高速 #dockertokyo
  4. 10.

    Preemption の問題点 • Preempt されると Pod は終了 ◦ そこまでに費やした計算リソースが無駄に ◦

    処理自体は冪等だとしても辛い • 優先度を高くすれば死なない? ◦ 優先度キュー内での順位も高くなってしまう ◦ バッチ処理系の Pod は、後回しでもいいが 一度動き出したら中断してほしくない #dockertokyo
  5. 14.

    NonPreemptingPriority • PreemptingPolicy の導入 ◦ PriorityClass の属性として設定 ◦ Never /

    PreemptLowerPriority (デフォルト) ◦ 1.15 では FeatureGates で有効化 • Preemption を行わなくなる ◦ Preemption「する」側に設定 ◦ キュー内の順序には影響を与えない #dockertokyo
  6. 17.

    Scheduling Framework の目的 • Scheduler のコア機能を抽出 ◦ 肥大化した現在の実装を整理 • ユーザはプラグインを実装

    ◦ スクラッチから開発する労力を軽減 ◦ 一緒にコンパイルして実行時の速度を保つ • プラグイン間で共有データにアクセス ◦ 他のプラグインの計算結果を再利用可能 #dockertokyo
  7. 19.

    2 1 3 Rank Nodes Filter Nodes Dequeue Preempt Binding

    Cycle (per Pod) Bind to Node Scheduling Cycle (serial) #dockertokyo
  8. 20.

    今回実装された拡張点 (1) • Queue sort ◦ 優先度キュー内の順序関数を変更 • Reserve ◦

    Node のリソースをあらかじめ予約 • Permit ◦ Node が決定した後、Pod を一時待機させる ◦ v1.15 だと待機を解除する機能がない(?) #dockertokyo
  9. 21.

    今回実装された拡張点 (2) • Pre-bind ◦ Kubernetes がサポートしている以外の ネットワークボリュームなどをバインド • Post-bind

    ◦ リソースの後処理 • Unreserve ◦ 他プラグインのエラー時のクリーンアップ #dockertokyo
  10. 25.

    まとめ • Pod Preemption への不満 ◦ バッチ処理系の Pod が中断される ◦

    Priority だけだと充分に制御できない • NonPreemptingPriority ◦ Preemption「する」側に付ける新属性 • Scheduling Framework ◦ Queue sort プラグインで POP 順序が変更可能 #dockertokyo