From b89454a48ebab8b95bd77c3700f9d2b77d502910 Mon Sep 17 00:00:00 2001 From: Joe Beda Date: Fri, 30 Jan 2015 15:59:27 -0800 Subject: [PATCH] Convert the scheduler binary to hyperkube. --- cmd/hyperkube/hyperkube.go | 2 + plugin/cmd/kube-scheduler/scheduler.go | 59 ++----------- plugin/pkg/scheduler/server/server.go | 111 +++++++++++++++++++++++++ 3 files changed, 119 insertions(+), 53 deletions(-) create mode 100644 plugin/pkg/scheduler/server/server.go diff --git a/cmd/hyperkube/hyperkube.go b/cmd/hyperkube/hyperkube.go index c6af4c7ed35..dc88a14997b 100644 --- a/cmd/hyperkube/hyperkube.go +++ b/cmd/hyperkube/hyperkube.go @@ -24,6 +24,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/controllermanager" "github.com/GoogleCloudPlatform/kubernetes/pkg/hyperkube" apiserver "github.com/GoogleCloudPlatform/kubernetes/pkg/master/server" + sched "github.com/GoogleCloudPlatform/kubernetes/plugin/pkg/scheduler/server" ) func main() { @@ -34,6 +35,7 @@ func main() { hk.AddServer(apiserver.NewHyperkubeServer()) hk.AddServer(controllermanager.NewHyperkubeServer()) + hk.AddServer(sched.NewHyperkubeServer()) hk.RunToExit(os.Args) } diff --git a/plugin/cmd/kube-scheduler/scheduler.go b/plugin/cmd/kube-scheduler/scheduler.go index 20c67dc8324..41e90d56940 100644 --- a/plugin/cmd/kube-scheduler/scheduler.go +++ b/plugin/cmd/kube-scheduler/scheduler.go @@ -17,69 +17,22 @@ limitations under the License. package main import ( - "net" - "net/http" - "strconv" - - "github.com/GoogleCloudPlatform/kubernetes/pkg/api" - "github.com/GoogleCloudPlatform/kubernetes/pkg/client" - "github.com/GoogleCloudPlatform/kubernetes/pkg/client/record" - _ "github.com/GoogleCloudPlatform/kubernetes/pkg/healthz" - "github.com/GoogleCloudPlatform/kubernetes/pkg/master/ports" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" "github.com/GoogleCloudPlatform/kubernetes/pkg/version/verflag" - "github.com/GoogleCloudPlatform/kubernetes/plugin/pkg/scheduler" - _ "github.com/GoogleCloudPlatform/kubernetes/plugin/pkg/scheduler/algorithmprovider" - "github.com/GoogleCloudPlatform/kubernetes/plugin/pkg/scheduler/factory" - "github.com/golang/glog" + "github.com/GoogleCloudPlatform/kubernetes/plugin/pkg/scheduler/server" - flag "github.com/spf13/pflag" + "github.com/spf13/pflag" ) -var ( - port = flag.Int("port", ports.SchedulerPort, "The port that the scheduler's http service runs on") - address = util.IP(net.ParseIP("127.0.0.1")) - clientConfig = &client.Config{} - algorithmProvider = flag.String("algorithm_provider", factory.DefaultProvider, "The scheduling algorithm provider to use") -) - -func init() { - flag.Var(&address, "address", "The IP address to serve on (set to 0.0.0.0 for all interfaces)") - client.BindClientConfigFlags(flag.CommandLine, clientConfig) -} - func main() { + s := server.NewSchedulerServer() + s.AddFlags(pflag.CommandLine) + util.InitFlags() util.InitLogs() defer util.FlushLogs() verflag.PrintAndExitIfRequested() - kubeClient, err := client.New(clientConfig) - if err != nil { - glog.Fatalf("Invalid API configuration: %v", err) - } - - record.StartRecording(kubeClient.Events(""), api.EventSource{Component: "scheduler"}) - - go http.ListenAndServe(net.JoinHostPort(address.String(), strconv.Itoa(*port)), nil) - - configFactory := factory.NewConfigFactory(kubeClient) - config, err := createConfig(configFactory) - if err != nil { - glog.Fatalf("Failed to create scheduler configuration: %v", err) - } - s := scheduler.New(config) - s.Run() - - select {} -} - -func createConfig(configFactory *factory.ConfigFactory) (*scheduler.Config, error) { - // check of algorithm provider is registered and fail fast - _, err := factory.GetAlgorithmProvider(*algorithmProvider) - if err != nil { - return nil, err - } - return configFactory.CreateFromProvider(*algorithmProvider) + s.Run(pflag.CommandLine.Args()) } diff --git a/plugin/pkg/scheduler/server/server.go b/plugin/pkg/scheduler/server/server.go new file mode 100644 index 00000000000..c1a86c88432 --- /dev/null +++ b/plugin/pkg/scheduler/server/server.go @@ -0,0 +1,111 @@ +/* +Copyright 2014 Google Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package server implements a Server object for running the scheduler. +package server + +import ( + "net" + "net/http" + "strconv" + + "github.com/GoogleCloudPlatform/kubernetes/pkg/api" + "github.com/GoogleCloudPlatform/kubernetes/pkg/client" + "github.com/GoogleCloudPlatform/kubernetes/pkg/client/record" + _ "github.com/GoogleCloudPlatform/kubernetes/pkg/healthz" + "github.com/GoogleCloudPlatform/kubernetes/pkg/hyperkube" + "github.com/GoogleCloudPlatform/kubernetes/pkg/master/ports" + "github.com/GoogleCloudPlatform/kubernetes/pkg/util" + "github.com/GoogleCloudPlatform/kubernetes/plugin/pkg/scheduler" + _ "github.com/GoogleCloudPlatform/kubernetes/plugin/pkg/scheduler/algorithmprovider" + "github.com/GoogleCloudPlatform/kubernetes/plugin/pkg/scheduler/factory" + + "github.com/golang/glog" + "github.com/spf13/pflag" +) + +// SchedulerServer has all the context and params needed to run a Scheduler +type SchedulerServer struct { + Port int + Address util.IP + ClientConfig client.Config + AlgorithmProvider string +} + +// NewSchedulerServer creates a new SchedulerServer with default parameters +func NewSchedulerServer() *SchedulerServer { + s := SchedulerServer{ + Port: ports.SchedulerPort, + Address: util.IP(net.ParseIP("127.0.0.1")), + AlgorithmProvider: factory.DefaultProvider, + } + return &s +} + +// NewHyperkubeServer creates a new hyperkube Server object that includes the +// description and flags. +func NewHyperkubeServer() *hyperkube.Server { + s := NewSchedulerServer() + + hks := hyperkube.Server{ + SimpleUsage: "scheduler", + Long: "Implements a Kubernetes scheduler. This will assign pods to kubelets based on capacity and constraints.", + Run: func(_ *hyperkube.Server, args []string) error { + return s.Run(args) + }, + } + s.AddFlags(hks.Flags()) + return &hks +} + +// AddFlags adds flags for a specific SchedulerServer to the specified FlagSet +func (s *SchedulerServer) AddFlags(fs *pflag.FlagSet) { + fs.IntVar(&s.Port, "port", s.Port, "The port that the scheduler's http service runs on") + fs.Var(&s.Address, "address", "The IP address to serve on (set to 0.0.0.0 for all interfaces)") + client.BindClientConfigFlags(fs, &s.ClientConfig) + fs.StringVar(&s.AlgorithmProvider, "algorithm_provider", s.AlgorithmProvider, "The scheduling algorithm provider to use") +} + +// Run runs the specified SchedulerServer. This should never exit. +func (s *SchedulerServer) Run(_ []string) error { + kubeClient, err := client.New(&s.ClientConfig) + if err != nil { + glog.Fatalf("Invalid API configuration: %v", err) + } + + record.StartRecording(kubeClient.Events(""), api.EventSource{Component: "scheduler"}) + + go http.ListenAndServe(net.JoinHostPort(s.Address.String(), strconv.Itoa(s.Port)), nil) + + configFactory := factory.NewConfigFactory(kubeClient) + config, err := s.createConfig(configFactory) + if err != nil { + glog.Fatalf("Failed to create scheduler configuration: %v", err) + } + sched := scheduler.New(config) + sched.Run() + + select {} +} + +func (s *SchedulerServer) createConfig(configFactory *factory.ConfigFactory) (*scheduler.Config, error) { + // check of algorithm provider is registered and fail fast + _, err := factory.GetAlgorithmProvider(s.AlgorithmProvider) + if err != nil { + return nil, err + } + return configFactory.CreateFromProvider(s.AlgorithmProvider) +}