このスケジューラーは本番環境での使用を想定して作成されたものではありません
Hello world.
このスケジューラーは学習向けに開発されたもので、コマンドライン上から動作を確認しつつ、スケジューラーの機能の実装の様子を見て取ることができます。
また、client-goを用いてシナリオを記述し、スケジューラーの動作を試すことができます。
このスケジューラーはブランチごとに段階を踏んで進化していく様子を追うことができるように開発されています。それぞれのブランチでスケジューラーの動作を確認し、コードを変更するなどして理解を深めることができます。
各ブランチにそのブランチで追加された機能の説明が書かれています (いくつかのブランチの説明はまだ未着手です。)
最も初期の段階のスケジューラーであり、全てのNodeから完全にランダムにPodを配置します。
このブランチのスケジューラーはfilter pluginの実行に対応しています。unschedulable nodeプラグインのみが有効になっています。
このブランチのスケジューラーはさらにscore pluginの実行に対応しています。custom pluginであるnodenumberプラグインのみがscore pluginとして有効になっています。nodenumber プラグインの実装もブランチ内に存在しています。
このブランチのスケジューラーはさらにpre-score pluginの実行に対応しています。custom pluginであるnodenumberプラグインにpre-score pluginの機能を実装し、有効にしています。
このブランチのスケジューラーはさらにpremit pluginの実行に対応しています。custom pluginであるnodenumberプラグインにpremit pluginの機能を実装し、有効にしています。 また、このブランチでは、Binding Cycleが並行にgoroutineで実行されるようになっています。
このブランチにはScheduling Queueが実装されています。また、スケジュールの失敗時に、PodをunschedulableとしてQueueに戻すことにも対応しています。
このブランチにはEventHandlerを用いたQueueの更新に対応しています。これにて、スケジュールに失敗したPodの再スケジュールに対応しています。
スケジューラーのメインロジックは、/minischedに存在しています。 このディレクトリ以下に変更を加えることで、起動するスケジューラーのロジックを変更することができます
プログラムの実行時、このスケジューラーはここで起動されます。 そのため、起動時の振る舞いを変更したい場合や、何か変数を渡したい場合などはこちらから変更してください。
ここ でclient-goを用いてAPIを叩き、スケジューラーの動作を試すシナリオが記述されています。 自由に変更し、スケジューラーの動作確認に使用してください。
以下のようにclient-goをとおしてAPIを叩き、スケジューラーの動作を試すことができます。
func scenario(client clientset.Interface) error {
ctx := context.Background()
// create node0 ~ node9, but all nodes are unschedulable
for i := 0; i < 9; i++ {
suffix := strconv.Itoa(i)
_, err := client.CoreV1().Nodes().Create(ctx, &v1.Node{
ObjectMeta: metav1.ObjectMeta{
Name: "node" + suffix,
},
Spec: v1.NodeSpec{
Unschedulable: true,
},
}, metav1.CreateOptions{})
if err != nil {
return fmt.Errorf("create node: %w", err)
}
}
klog.Info("scenario: all nodes created")
_, err := client.CoreV1().Pods("default").Create(ctx, &v1.Pod{
ObjectMeta: metav1.ObjectMeta{Name: "pod1"},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Name: "container1",
Image: "k8s.gcr.io/pause:3.5",
},
},
},
}, metav1.CreateOptions{})
if err != nil {
return fmt.Errorf("create pod: %w", err)
}
klog.Info("scenario: pod1 created")
// wait to schedule
time.Sleep(3 * time.Second)
pod1, err := client.CoreV1().Pods("default").Get(ctx, "pod1", metav1.GetOptions{})
if err != nil {
return fmt.Errorf("get pod: %w", err)
}
klog.Info("scenario: pod1 is bound to " + pod1.Spec.NodeName)
return nil
}
スケジューラーを起動して、シナリオを実行するにはGoとetcdが必要になります etcdに関してはこちらのKubernetes本体に用意されているインストール方法を使用できます。
kubernetes/kubernetes/hack/install-etcd.sh.
もちろん別の方法でinstallしていただいても構いません。
そして make start
でスケジューラーとスケジューラーに必要なコンポーネントが立ち上がり、シナリオが実行されます。
このmini-kube-schedulerのスケジューラーの起動やシナリオの実行などの全体的な仕組みに関してはkubernetes-sigs/kube-scheduler-simulatorとsanposhiho/kube-scheduler-simulator-cliをベースにしています.