mirror of https://github.com/k3s-io/k3s
Merge pull request #69 from brendandburns/scheduler
Fix the first fit scheduler to randomize.pull/6/head
commit
02d9cf2eb9
|
@ -21,6 +21,7 @@ import (
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
"math/rand"
|
||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -74,8 +75,9 @@ func main() {
|
||||||
Port: 10250,
|
Port: 10250,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
random := rand.New(rand.NewSource(int64(time.Now().Nanosecond())))
|
||||||
storage := map[string]apiserver.RESTStorage{
|
storage := map[string]apiserver.RESTStorage{
|
||||||
"pods": registry.MakePodRegistryStorage(podRegistry, containerInfo, registry.MakeFirstFitScheduler(machineList, podRegistry)),
|
"pods": registry.MakePodRegistryStorage(podRegistry, containerInfo, registry.MakeFirstFitScheduler(machineList, podRegistry, random)),
|
||||||
"replicationControllers": registry.MakeControllerRegistryStorage(controllerRegistry),
|
"replicationControllers": registry.MakeControllerRegistryStorage(controllerRegistry),
|
||||||
"services": registry.MakeServiceRegistryStorage(serviceRegistry),
|
"services": registry.MakeServiceRegistryStorage(serviceRegistry),
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,12 +66,14 @@ func (s *RoundRobinScheduler) Schedule(pod Pod) (string, error) {
|
||||||
type FirstFitScheduler struct {
|
type FirstFitScheduler struct {
|
||||||
machines []string
|
machines []string
|
||||||
registry PodRegistry
|
registry PodRegistry
|
||||||
|
random *rand.Rand
|
||||||
}
|
}
|
||||||
|
|
||||||
func MakeFirstFitScheduler(machines []string, registry PodRegistry) Scheduler {
|
func MakeFirstFitScheduler(machines []string, registry PodRegistry, random *rand.Rand) Scheduler {
|
||||||
return &FirstFitScheduler{
|
return &FirstFitScheduler{
|
||||||
machines: machines,
|
machines: machines,
|
||||||
registry: registry,
|
registry: registry,
|
||||||
|
random: random,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,6 +98,7 @@ func (s *FirstFitScheduler) Schedule(pod Pod) (string, error) {
|
||||||
host := scheduledPod.CurrentState.Host
|
host := scheduledPod.CurrentState.Host
|
||||||
machineToPods[host] = append(machineToPods[host], scheduledPod)
|
machineToPods[host] = append(machineToPods[host], scheduledPod)
|
||||||
}
|
}
|
||||||
|
var machineOptions []string
|
||||||
for _, machine := range s.machines {
|
for _, machine := range s.machines {
|
||||||
podFits := true
|
podFits := true
|
||||||
for _, scheduledPod := range machineToPods[machine] {
|
for _, scheduledPod := range machineToPods[machine] {
|
||||||
|
@ -108,8 +111,12 @@ func (s *FirstFitScheduler) Schedule(pod Pod) (string, error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if podFits {
|
if podFits {
|
||||||
return machine, nil
|
machineOptions = append(machineOptions, machine)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if len(machineOptions) == 0 {
|
||||||
return "", fmt.Errorf("Failed to find fit for %#v", pod)
|
return "", fmt.Errorf("Failed to find fit for %#v", pod)
|
||||||
|
} else {
|
||||||
|
return machineOptions[s.random.Int()%len(machineOptions)], nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,8 +47,9 @@ func TestRandomScheduler(t *testing.T) {
|
||||||
|
|
||||||
func TestFirstFitSchedulerNothingScheduled(t *testing.T) {
|
func TestFirstFitSchedulerNothingScheduled(t *testing.T) {
|
||||||
mockRegistry := MockPodRegistry{}
|
mockRegistry := MockPodRegistry{}
|
||||||
scheduler := MakeFirstFitScheduler([]string{"m1", "m2", "m3"}, &mockRegistry)
|
r := rand.New(rand.NewSource(0))
|
||||||
expectSchedule(scheduler, Pod{}, "m1", t)
|
scheduler := MakeFirstFitScheduler([]string{"m1", "m2", "m3"}, &mockRegistry, r)
|
||||||
|
expectSchedule(scheduler, Pod{}, "m3", t)
|
||||||
}
|
}
|
||||||
|
|
||||||
func makePod(host string, hostPorts ...int) Pod {
|
func makePod(host string, hostPorts ...int) Pod {
|
||||||
|
@ -78,8 +79,9 @@ func TestFirstFitSchedulerFirstScheduled(t *testing.T) {
|
||||||
makePod("m1", 8080),
|
makePod("m1", 8080),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
scheduler := MakeFirstFitScheduler([]string{"m1", "m2", "m3"}, &mockRegistry)
|
r := rand.New(rand.NewSource(0))
|
||||||
expectSchedule(scheduler, makePod("", 8080), "m2", t)
|
scheduler := MakeFirstFitScheduler([]string{"m1", "m2", "m3"}, &mockRegistry, r)
|
||||||
|
expectSchedule(scheduler, makePod("", 8080), "m3", t)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFirstFitSchedulerFirstScheduledComplicated(t *testing.T) {
|
func TestFirstFitSchedulerFirstScheduledComplicated(t *testing.T) {
|
||||||
|
@ -90,7 +92,8 @@ func TestFirstFitSchedulerFirstScheduledComplicated(t *testing.T) {
|
||||||
makePod("m3", 80, 443, 8085),
|
makePod("m3", 80, 443, 8085),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
scheduler := MakeFirstFitScheduler([]string{"m1", "m2", "m3"}, &mockRegistry)
|
r := rand.New(rand.NewSource(0))
|
||||||
|
scheduler := MakeFirstFitScheduler([]string{"m1", "m2", "m3"}, &mockRegistry, r)
|
||||||
expectSchedule(scheduler, makePod("", 8080, 8081), "m3", t)
|
expectSchedule(scheduler, makePod("", 8080, 8081), "m3", t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,7 +105,8 @@ func TestFirstFitSchedulerFirstScheduledImpossible(t *testing.T) {
|
||||||
makePod("m3", 8080),
|
makePod("m3", 8080),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
scheduler := MakeFirstFitScheduler([]string{"m1", "m2", "m3"}, &mockRegistry)
|
r := rand.New(rand.NewSource(0))
|
||||||
|
scheduler := MakeFirstFitScheduler([]string{"m1", "m2", "m3"}, &mockRegistry, r)
|
||||||
_, err := scheduler.Schedule(makePod("", 8080, 8081))
|
_, err := scheduler.Schedule(makePod("", 8080, 8081))
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Error("Unexpected non-error.")
|
t.Error("Unexpected non-error.")
|
||||||
|
|
Loading…
Reference in New Issue