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

75 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: スケジューラーのパフォーマンスチューニング
content_type: concept
weight: 70
---
<!-- overview -->
{{< feature-state for_k8s_version="1.14" state="beta" >}}
[kube-scheduler](/docs/concepts/scheduling/kube-scheduler/#kube-scheduler)はKubernetesのデフォルトのスケジューラーです。クラスター内のード上にPodを割り当てる責務があります。
クラスター内に存在するードで、Podのスケジューリング要求を満たすものはPodに対して _割り当て可能_ードと呼ばれます。スケジューラーはPodに対する割り当て可能なードをみつけ、それらの割り当て可能なードにスコアをつけます。その中から最も高いスコアのードを選択し、Podに割り当てるためのいくつかの関数を実行します。スケジューラーは _Binding_ と呼ばれる処理中において、APIサーバーに対して割り当てが決まったードの情報を通知します。
このページでは、大規模のKubernetesクラスターにおけるパフォーマンス最適化のためのチューニングについて説明します。
<!-- body -->
## スコア付けするノードの割合
Kubernetes 1.12以前では、Kube-schedulerがクラスター内の全てのードに対して割り当て可能かをチェックし、実際に割り当て可能なードのスコア付けをしていました。Kubernetes 1.12では新機能を追加し、ある数の割り当て可能なノードが見つかった時点で、割り当て可能なノードの探索を止めれるようになりました。これにより大規模なクラスターにおけるスケジューラーのパフォーマンスが向上しました。その数はクラスターのサイズの割合(%)として指定されます。この割合は`percentageOfNodesToScore`というオプションの設定項目によって指定可能です。この値の範囲は1から100までです。100より大きい値は100%として扱われます。0を指定したときは、この設定オプションを指定しないものとして扱われます。Kubernetes 1.14では、この値が指定されていないときは、スコア付けするードの割合をクラスターのサイズに基づいて決定するためのメカニズムがあります。このメカニズムでは100ードのクラスターに対しては50%の割合とするような線形な式を使用します。5000ードのクラスターに対しては10%となります。自動で算出される割合の最低値は5%となります。言い換えると、クラスターの規模がどれだけ大きくても、ユーザーがこの値を5未満に設定しない限りスケジューラーは少なくても5%のクラスター内のノードをスコア付けすることになります。
`percentageOfNodesToScore`の値を50%に設定する例は下記のとおりです。
```yaml
apiVersion: kubescheduler.config.k8s.io/v1alpha1
kind: KubeSchedulerConfiguration
algorithmSource:
provider: DefaultProvider
...
percentageOfNodesToScore: 50
```
{{< note >}}
割り当て可能なードが50未満のクラスターにおいては、割り当て可能なードの探索を止めるほどードが多くないため、スケジューラーは全てのードをチェックします。
{{< /note >}}
**この機能を無効にするためには**、`percentageOfNodesToScore`を100に設定してください。
### percentageOfNodesToScoreのチューニング
`percentageOfNodesToScore`は1から100の間の範囲である必要があり、デフォルト値はクラスターのサイズに基づいて計算されます。また、クラスターのサイズの最小値は50ードとハードコードされています。これは数百のードを持つようなクラスターにおいてこの値を50より低い値に変更しても、スケジューラーが検出する割り当て可能なードの数に大きな影響を与えないことを意味します。このオプションは意図的なものです。その理由としては、小規模のクラスターにおいてパフォーマンスを著しく改善する可能性が低いためです。1000ードを超える大規模なクラスターでこの値を低く設定すると、パフォーマンスが著しく改善される可能性があります。
この値を設定する際に考慮するべき重要な注意事項として、割り当て可能ードのチェック対象のードが少ないと、一部のードはPodの割り当てのためにスコアリングされなくなります。結果として、高いスコアをつけられる可能性のあるードがスコアリングフェーズに渡されることがありません。これにより、Podの配置が理想的なものでなくなります。したがって、この値をかなり低い割合に設定すべきではありません。一般的な経験則として、この値を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番目のードに戻ってチェックをします。