diff --git a/cmd/apiserver/apiserver.go b/cmd/apiserver/apiserver.go index f104f994f0..1f238717b8 100644 --- a/cmd/apiserver/apiserver.go +++ b/cmd/apiserver/apiserver.go @@ -21,17 +21,10 @@ package main import ( "flag" "log" - "math/rand" "net" - "net/http" "strconv" - "time" - "github.com/coreos/go-etcd/etcd" - - "github.com/GoogleCloudPlatform/kubernetes/pkg/apiserver" - "github.com/GoogleCloudPlatform/kubernetes/pkg/client" - "github.com/GoogleCloudPlatform/kubernetes/pkg/registry" + "github.com/GoogleCloudPlatform/kubernetes/pkg/master" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" ) @@ -54,45 +47,13 @@ func main() { log.Fatal("No machines specified!") } - var ( - podRegistry registry.PodRegistry - controllerRegistry registry.ControllerRegistry - serviceRegistry registry.ServiceRegistry - ) + var m *master.Master if len(etcdServerList) > 0 { - log.Printf("Creating etcd client pointing to %v", etcdServerList) - etcdClient := etcd.NewClient(etcdServerList) - podRegistry = registry.MakeEtcdRegistry(etcdClient, machineList) - controllerRegistry = registry.MakeEtcdRegistry(etcdClient, machineList) - serviceRegistry = registry.MakeEtcdRegistry(etcdClient, machineList) + m = master.New(etcdServerList, machineList) } else { - podRegistry = registry.MakeMemoryRegistry() - controllerRegistry = registry.MakeMemoryRegistry() - serviceRegistry = registry.MakeMemoryRegistry() + m = master.NewMemoryServer(machineList) } - containerInfo := &client.HTTPContainerInfo{ - Client: http.DefaultClient, - Port: 10250, - } - - random := rand.New(rand.NewSource(int64(time.Now().Nanosecond()))) - storage := map[string]apiserver.RESTStorage{ - "pods": registry.MakePodRegistryStorage(podRegistry, containerInfo, registry.MakeFirstFitScheduler(machineList, podRegistry, random)), - "replicationControllers": registry.MakeControllerRegistryStorage(controllerRegistry), - "services": registry.MakeServiceRegistryStorage(serviceRegistry), - } - - endpoints := registry.MakeEndpointController(serviceRegistry, podRegistry) - go util.Forever(func() { endpoints.SyncServiceEndpoints() }, time.Second*10) - - s := &http.Server{ - Addr: net.JoinHostPort(*address, strconv.Itoa(int(*port))), - Handler: apiserver.New(storage, *apiPrefix), - ReadTimeout: 10 * time.Second, - WriteTimeout: 10 * time.Second, - MaxHeaderBytes: 1 << 20, - } - log.Fatal(s.ListenAndServe()) + log.Fatal(m.Run(net.JoinHostPort(*address, strconv.Itoa(int(*port))), *apiPrefix)) } diff --git a/cmd/localkube/localkube.go b/cmd/localkube/localkube.go index a7a0f89f6e..3c9ba9d65b 100644 --- a/cmd/localkube/localkube.go +++ b/cmd/localkube/localkube.go @@ -23,14 +23,14 @@ import ( "flag" "fmt" "log" - "math/rand" - "net/http" + "net" "os" + "strconv" "time" - "github.com/GoogleCloudPlatform/kubernetes/pkg/apiserver" "github.com/GoogleCloudPlatform/kubernetes/pkg/client" "github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet" + "github.com/GoogleCloudPlatform/kubernetes/pkg/master" "github.com/GoogleCloudPlatform/kubernetes/pkg/registry" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" "github.com/coreos/go-etcd/etcd" @@ -80,36 +80,8 @@ func fake_kubelet() { // Starts api services (the master). Never returns. func api_server() { - machineList := util.StringList{*kubelet_address} - - etcdClient := etcd.NewClient([]string{*etcd_server}) - podRegistry := registry.MakeEtcdRegistry(etcdClient, machineList) - controllerRegistry := registry.MakeEtcdRegistry(etcdClient, machineList) - serviceRegistry := registry.MakeEtcdRegistry(etcdClient, machineList) - - containerInfo := &client.HTTPContainerInfo{ - Client: http.DefaultClient, - Port: *kubelet_port, - } - random := rand.New(rand.NewSource(int64(time.Now().Nanosecond()))) - - storage := map[string]apiserver.RESTStorage{ - "pods": registry.MakePodRegistryStorage(podRegistry, containerInfo, registry.MakeFirstFitScheduler(machineList, podRegistry, random)), - "replicationControllers": registry.MakeControllerRegistryStorage(controllerRegistry), - "services": registry.MakeServiceRegistryStorage(serviceRegistry), - } - - endpoints := registry.MakeEndpointController(serviceRegistry, podRegistry) - go util.Forever(func() { endpoints.SyncServiceEndpoints() }, time.Second*10) - - s := &http.Server{ - Addr: fmt.Sprintf("%s:%d", *master_address, *master_port), - Handler: apiserver.New(storage, *apiPrefix), - ReadTimeout: 10 * time.Second, - WriteTimeout: 10 * time.Second, - MaxHeaderBytes: 1 << 20, - } - log.Fatal(s.ListenAndServe()) + m := master.New([]string{*etcd_server}, []string{*kubelet_address}) + log.Fatal(m.Run(net.JoinHostPort(*master_address, strconv.Itoa(int(*master_port))), *apiPrefix)) } // Starts up a controller manager. Never returns. diff --git a/pkg/master/doc.go b/pkg/master/doc.go new file mode 100644 index 0000000000..fdc205fc20 --- /dev/null +++ b/pkg/master/doc.go @@ -0,0 +1,19 @@ +/* +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 master contains code for setting up and running a kubenetes +// cluster master. +package master diff --git a/pkg/master/master.go b/pkg/master/master.go new file mode 100644 index 0000000000..ab18d2743d --- /dev/null +++ b/pkg/master/master.go @@ -0,0 +1,94 @@ +/* +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 master + +import ( + "math/rand" + "net/http" + "time" + + "github.com/GoogleCloudPlatform/kubernetes/pkg/apiserver" + "github.com/GoogleCloudPlatform/kubernetes/pkg/client" + "github.com/GoogleCloudPlatform/kubernetes/pkg/registry" + "github.com/GoogleCloudPlatform/kubernetes/pkg/util" + "github.com/coreos/go-etcd/etcd" +) + +// Master contains state for a Kubernetes cluster master/api server. +type Master struct { + podRegistry registry.PodRegistry + controllerRegistry registry.ControllerRegistry + serviceRegistry registry.ServiceRegistry + + minions []string + random *rand.Rand + storage map[string]apiserver.RESTStorage +} + +// Returns a memory (not etcd) backed apiserver. +func NewMemoryServer(minions []string) *Master { + m := &Master{ + podRegistry: registry.MakeMemoryRegistry(), + controllerRegistry: registry.MakeMemoryRegistry(), + serviceRegistry: registry.MakeMemoryRegistry(), + } + m.init(minions) + return m +} + +// Returns a new apiserver. +func New(etcdServers, minions []string) *Master { + etcdClient := etcd.NewClient(etcdServers) + m := &Master{ + podRegistry: registry.MakeEtcdRegistry(etcdClient, minions), + controllerRegistry: registry.MakeEtcdRegistry(etcdClient, minions), + serviceRegistry: registry.MakeEtcdRegistry(etcdClient, minions), + } + m.init(minions) + return m +} + +func (m *Master) init(minions []string) { + containerInfo := &client.HTTPContainerInfo{ + Client: http.DefaultClient, + Port: 10250, + } + + m.minions = minions + m.random = rand.New(rand.NewSource(int64(time.Now().Nanosecond()))) + m.storage = map[string]apiserver.RESTStorage{ + "pods": registry.MakePodRegistryStorage(m.podRegistry, containerInfo, registry.MakeFirstFitScheduler(m.minions, m.podRegistry, m.random)), + "replicationControllers": registry.MakeControllerRegistryStorage(m.controllerRegistry), + "services": registry.MakeServiceRegistryStorage(m.serviceRegistry), + } + +} + +// Runs master. Never returns. +func (m *Master) Run(myAddress, apiPrefix string) error { + endpoints := registry.MakeEndpointController(m.serviceRegistry, m.podRegistry) + go util.Forever(func() { endpoints.SyncServiceEndpoints() }, time.Second*10) + + s := &http.Server{ + Addr: myAddress, + Handler: apiserver.New(m.storage, apiPrefix), + ReadTimeout: 10 * time.Second, + WriteTimeout: 10 * time.Second, + MaxHeaderBytes: 1 << 20, + } + return s.ListenAndServe() +}