website/content/ja/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md

8.0 KiB
Raw Blame History

title content_type weight
スケジューラーのパフォーマンスチューニング concept 80

{{< feature-state for_k8s_version="1.14" state="beta" >}}

kube-schedulerはKubernetesのデフォルトのスケジューラーです。クラスター内のード上にPodを割り当てる責務があります。

クラスター内に存在するードで、Podのスケジューリング要求を満たすものはPodに対して割り当て可能ードと呼ばれます。スケジューラーはPodに対する割り当て可能なードをみつけ、それらの割り当て可能なードにスコアをつけます。その中から最も高いスコアのードを選択し、Podに割り当てるためのいくつかの関数を実行します。スケジューラーはBindingと呼ばれる処理中において、APIサーバーに対して割り当てが決まったードの情報を通知します。

このページでは、大規模のKubernetesクラスターにおけるパフォーマンス最適化のためのチューニングについて説明します。

大規模クラスターでは、レイテンシー(新規Podをすばやく配置)と精度(スケジューラーが不適切な配置を行うことはめったにありません)の間でスケジューリング結果を調整するスケジューラーの動作をチューニングできます。

このチューニング設定は、kube-scheduler設定のpercentageOfNodesToScoreで設定できます。KubeSchedulerConfiguration設定は、クラスター内のードにスケジュールするための閾値を決定します。

閾値の設定

percentageOfNodesToScoreオプションは、0から100までの数値を受け入れます。0は、kube-schedulerがコンパイル済みのデフォルトを使用することを示す特別な値です。 percentageOfNodesToScoreに100より大きな値を設定した場合、kube-schedulerの挙動は100を設定した場合と同様となります。

この値を変更するためには、kube-schedulerの設定ファイル(これは/etc/kubernetes/config/kube-scheduler.yamlの可能性が高い)を編集し、スケジューラーを再起動します。

この変更をした後、

kubectl get pods -n kube-system | grep kube-scheduler

を実行して、kube-schedulerコンポーネントが正常であることを確認できます。

ノードへのスコア付けの閾値

スケジューリング性能を改善するため、kube-schedulerは割り当て可能なードが十分に見つかるとードの検索を停止できます。大規模クラスターでは、すべてのードを考慮する単純なアプローチと比較して時間を節約できます。

クラスター内のすべてのードに対する十分なード数を整数パーセンテージで指定します。kube-schedulerは、これをード数に変換します。スケジューリング中に、kube-schedulerが設定されたパーセンテージを超える十分な割り当て可能なードを見つけた場合、kube-schedulerはこれ以上割り当て可能なードを探すのを止め、スコアリングフェーズに進みます。

スケジューラーはどのようにノードを探索するかで処理を詳しく説明しています。

デフォルトの閾値

閾値を指定しない場合、Kubernetesは100ードのクラスタでは50%、5000ードのクラスタでは10%になる線形方程式を使用して数値を計算します。自動計算の下限は5%です。

つまり、明示的にpercentageOfNodesToScoreを5未満の値を設定しない限り、クラスターの規模に関係なく、kube-schedulerは常に少なくともクラスターの5%のノードに対してスコア付けをします。

スケジューラーにクラスター内のすべてのノードに対してスコア付けをさせる場合は、percentageOfNodesToScoreの値に100を設定します。

percentageOfNodesToScoreの値を50%に設定する例は下記のとおりです。

apiVersion: kubescheduler.config.k8s.io/v1alpha1
kind: KubeSchedulerConfiguration
algorithmSource:
  provider: DefaultProvider

...

percentageOfNodesToScore: 50

percentageOfNodesToScoreのチューニング

percentageOfNodesToScoreは1から100の間の範囲である必要があり、デフォルト値はクラスターのサイズに基づいて計算されます。また、クラスターのサイズの最小値は50ードとハードコードされています。

{{< note >}} 割り当て可能なードが50以下のクラスタでは、スケジューラの検索を早期に停止するのに十分な割り当て可能なードがないため、スケジューラはすべてのードをチェックします。

小規模クラスタでは、percentageOfNodesToScoreに低い値を設定したとしても、同様の理由で変更による影響は全くないか、ほとんどありません。

クラスターのノード数が数百以下の場合は、この設定オプションをデフォルト値のままにします。変更してもスケジューラの性能を大幅に改善する可能性はほとんどありません。 {{< /note >}}

この値を設定する際に考慮するべき重要な注意事項として、割り当て可能ードのチェック対象のードが少ないと、一部のードはPodの割り当てのためにスコアリングされなくなります。結果として、高いスコアをつけられる可能性のあるードがスコアリングフェーズに渡されることがありません。これにより、Podの配置が理想的なものでなくなります。

kube-schedulerが頻繁に不適切なPodの配置を行わないよう、percentageOfNodesToScoreをかなり低い値を設定することは避けるべきです。スケジューラのスループットがアプリケーションにとって致命的で、ードのスコアリングが重要でない場合を除いて、10%未満に設定することは避けてください。言いかえると、割り当て可能な限り、Podは任意のード上で稼働させるのが好ましいです。

スケジューラーはどのようにノードを探索するか

このセクションでは、この機能の内部の詳細を理解したい人向けになります。

クラスター内の全てのードに対して平等にPodの割り当ての可能性を持たせるため、スケジューラーはラウンドロビン方式でードを探索します。複数のードの配列になっているイメージです。スケジューラーはその配列の先頭から探索を開始し、percentageOfNodesToScoreによって指定された数のードを検出するまで、割り当て可能かどうかをチェックしていきます。次のPodでは、スケジューラーは前のPodの割り当て処理でチェックしたところから探索を再開します。

ードが複数のゾーンに存在するとき、スケジューラーは様々なゾーンのードを探索して、異なるゾーンのードが割り当て可能かどうかのチェック対象になるようにします。例えば2つのゾーンに6つのードがある場合を考えます。

Zone 1: Node 1, Node 2, Node 3, Node 4
Zone 2: Node 5, Node 6

スケジューラーは、下記の順番でノードの割り当て可能性を評価します。

Node 1, Node 5, Node 2, Node 6, Node 3, Node 4

全てのードのチェックを終えたら、1番目のードに戻ってチェックをします。