DUICUO

kube-scheduler-simulator を使用して Kubernetes スケジューラ環境をシミュレートする

Kubernetesのデフォルトスケジューラは高度に設定可能であるため、多くの場合、スケジューリング動作をカスタマイズするためにコードを記述する必要はありません。しかし、スケジューラの仕組みを理解したい場合や、さらなる開発ニーズがある場合は、独自のスケジューラを開発してみるのも良いでしょう。この記事では、kube-scheduler-simulatorスケジューラシミュレータを用いてスケジューラ開発環境を構築する方法を紹介します。

エミュレータをインストールする

まず、クローンエミュレータのコード:

 $ git clone https://github.com/kubernetes-sigs/kube-scheduler-simulator
$ cd kube - スケジューラ- シミュレータ

Web フロントエンドとシミュレーター サーバーのイメージをビルドするには、コマンド `make docker_build_and_up` を実行するだけです。

イメージがビルドされると、`docker-compose up` コマンドを直接使用してエミュレーターを起動できます。

起動後、次に示すように、ブラウザで localhost:3000 経由でエミュレータの Web ページに直接アクセスできます。

このページでは、新しいリソースを作成するためのさまざまな方法が提供されています。例えば、「NEW NODE」ボタンをクリックして新しいノードを作成できます。

「適用」ボタンをクリックするだけでノードを追加できます。ここでは5つのノードを追加しています。次に、同じ方法で「新しいポッド」をクリックして新しいポッドを作成します。これにより、スケジューリングプロセス全体がシミュレートされます。

新しく作成されたポッドは、次のノードの 1 つにスケジュールされました。

ポッドの名前をクリックすると、フィルター フェーズ、スコア フェーズ、最終スコアなど、そのポッドのスケジュール プロセス全体が表示されます。

左上隅にある設定ボタンを直接クリックしてスケジューラを設定できます。これには基本的に、KubeSchedulerConfiguration オブジェクトの変更が含まれます。

使用

シミュレータを通してPodのスケジューリングを理解する方法を学びました。では、新しいスケジューラプラグインを開発したい場合、シミュレータとどのように組み合わせればよいでしょうか?

ここでは、https://github.com/sanposhiho/mini-kube-scheduler プログラムを例として使用します。このスケジューラは、Podノードのランダム選択を実装しています。

シミュレータでスケジューラを使用するには、次の手順を実行する必要があります。

  • mini-kube-scheduler/minisched (initial-random-scheduler ブランチから) を kube-scheduler-simulator にコピーします。
  • minisched を使用するように kube-scheduler-simulator/scheduler/scheduler.go ファイルを変更します。

以下は、主に StartScheduler 関数の変更に焦点を当てた、kube-scheduler-simulator/scheduler/scheduler.go ファイルへの変更です。

 パッケージスケジューラ
輸入
"コンテクスト"
「sigs.k8s.io/kube-scheduler-simulator/simulator/minisched」
「golang.org/x/xerrors」
v1 "k8s.io/api/core/v1"
クライアントセット「k8s.io/client-go/kubernetes」
レストクライアント「k8s.io/client-go/rest」
「k8s.io/client-go/tools/イベント
「k8s.io/klog/v2」
v1beta2config "k8s.io/kube-scheduler/config/v1beta2"
k8s.io/kubernetes/pkg/スケジューラー
「k8s.io/kubernetes/pkg/scheduler/apis/config」
k8s.io/kubernetes/pkg/scheduler/apis/config/scheme
k8s.io/kubernetes/pkg/scheduler/apis/config/v1beta2
シミュレータスケジューリング構成"sigs.k8s.io/kube-scheduler-simulator/simulator/scheduler/config"
sigs.k8s.io/kube-scheduler-simulator/simulator/scheduler/plugin

//……
// StartScheduler はスケジューラを開始します。
func ( s * Service ) StartScheduler ( versionedcfg * v1beta2config . KubeSchedulerConfiguration ) error {
クライアントセット: = s.clientset
ctx , cancel : = context.WithCancel (context.Background ( ) )

informerFactory : = scheduler . NewInformerFactory ( clientSet , 0 )
evtBroadcaster : = events.NewBroadcaster ( & events.EventSinkImpl {
インターフェース: clientSet.EventsV1 ( ),
})
evtBroadcaster.StartRecordingToSink ( ctx.Done ( ) )
s . currentSchedulerCfg = versionedcfg . DeepCopy ()
スケジュール: = minisched.New (
クライアントセット
インフォーマーファクトリー

informerFactory.Start ( ctx.Done ( ))
informerFactory.WaitForCacheSync ( ctx.Done ( ) )
go sched.Run (ctx )
s.shutdownfn = キャンセル
nil を返す
}
//……

スケジューラを sched := minisched.New(clientSet informerFactory, ) に変更します。これにより、minisched スケジューラのみを使用するようになります。

変更を加えた後、プロジェクトを再コンパイルします。

 $ docker_build_and_up を実行します

コンパイル後にコンテナを再起動します。

 docker-compose アップ

起動後、localhost:3000 経由でエミュレータに再度アクセスできます。これで、エミュレータには minisched スケジューリングアルゴリズムのみが搭載されました。テスト用にいくつかの Pod を作成できます。

以前のスケジューラ ステージは登録されていないため、表示されなくなりました。

例えば、minisched スケジューラのスケジューリングアルゴリズムを、ノードをランダムに選択するのではなく、常に最初のノードを選択するように変更できます。これは、`kube-scheduler-simulator/simulator/minisched/minisched.go` ファイル内の `scheduleOne` 関数を以下のように変更することで実現できます。

同じ変更を加えてコンテナを再コンパイルし、再起動し、エミュレータの Web ページに再度アクセスすると、新しく作成された Pod が常に最初のノードにスケジュールされていることがわかります。

今では、実際の Kubernetes クラスターをまったく必要とせずに、ニーズに応じて独自のスケジューラ アルゴリズムを開発できます。