diff --git a/cmd/integration/integration.go b/cmd/integration/integration.go index dcd3610157bc5..e8c902eb27eb7 100644 --- a/cmd/integration/integration.go +++ b/cmd/integration/integration.go @@ -40,16 +40,17 @@ import ( nodeControllerPkg "github.com/GoogleCloudPlatform/kubernetes/pkg/cloudprovider/controller" replicationControllerPkg "github.com/GoogleCloudPlatform/kubernetes/pkg/controller" "github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/dockertools" + kubeletServer "github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/server" "github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/volume/empty_dir" "github.com/GoogleCloudPlatform/kubernetes/pkg/labels" "github.com/GoogleCloudPlatform/kubernetes/pkg/master" "github.com/GoogleCloudPlatform/kubernetes/pkg/probe" "github.com/GoogleCloudPlatform/kubernetes/pkg/service" - "github.com/GoogleCloudPlatform/kubernetes/pkg/standalone" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" "github.com/GoogleCloudPlatform/kubernetes/pkg/util/wait" "github.com/GoogleCloudPlatform/kubernetes/plugin/pkg/admission/admit" "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/coreos/go-etcd/etcd" @@ -202,13 +203,13 @@ func startComponents(manifestURL string) (apiServerURL string) { // Kubelet (localhost) testRootDir := makeTempDirOrDie("kubelet_integ_1.") glog.Infof("Using %s as root dir for kubelet #1", testRootDir) - standalone.SimpleRunKubelet(cl, nil, &fakeDocker1, machineList[0], testRootDir, manifestURL, "127.0.0.1", 10250, api.NamespaceDefault, empty_dir.ProbeVolumePlugins()) + kubeletServer.SimpleRunKubelet(cl, nil, &fakeDocker1, machineList[0], testRootDir, manifestURL, "127.0.0.1", 10250, api.NamespaceDefault, empty_dir.ProbeVolumePlugins()) // Kubelet (machine) // Create a second kubelet so that the guestbook example's two redis slaves both // have a place they can schedule. testRootDir = makeTempDirOrDie("kubelet_integ_2.") glog.Infof("Using %s as root dir for kubelet #2", testRootDir) - standalone.SimpleRunKubelet(cl, nil, &fakeDocker2, machineList[1], testRootDir, "", "127.0.0.1", 10251, api.NamespaceDefault, empty_dir.ProbeVolumePlugins()) + kubeletServer.SimpleRunKubelet(cl, nil, &fakeDocker2, machineList[1], testRootDir, "", "127.0.0.1", 10251, api.NamespaceDefault, empty_dir.ProbeVolumePlugins()) return apiServer.URL } diff --git a/cmd/kubelet/kubelet.go b/cmd/kubelet/kubelet.go index 95fa61a901945..3d637283dd7a9 100644 --- a/cmd/kubelet/kubelet.go +++ b/cmd/kubelet/kubelet.go @@ -30,8 +30,8 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/credentialprovider" _ "github.com/GoogleCloudPlatform/kubernetes/pkg/healthz" "github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet" + kubeletServer "github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/server" "github.com/GoogleCloudPlatform/kubernetes/pkg/master/ports" - "github.com/GoogleCloudPlatform/kubernetes/pkg/standalone" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" "github.com/GoogleCloudPlatform/kubernetes/pkg/version/verflag" @@ -123,14 +123,14 @@ func main() { glog.Info(err) } - client, err := standalone.GetAPIServerClient(*authPath, apiServerList) + client, err := kubeletServer.GetAPIServerClient(*authPath, apiServerList) if err != nil && len(apiServerList) > 0 { glog.Warningf("No API client: %v", err) } credentialprovider.SetPreferredDockercfgPath(*rootDirectory) - kcfg := standalone.KubeletConfig{ + kcfg := kubeletServer.KubeletConfig{ Address: address, AllowPrivileged: *allowPrivileged, HostnameOverride: *hostnameOverride, @@ -159,7 +159,7 @@ func main() { VolumePlugins: app.ProbeVolumePlugins(), } - standalone.RunKubelet(&kcfg) + kubeletServer.RunKubelet(&kcfg) // runs forever select {} } diff --git a/cmd/kubernetes/kubernetes.go b/cmd/kubernetes/kubernetes.go index c1898f2059c5c..fc592cd9a9245 100644 --- a/cmd/kubernetes/kubernetes.go +++ b/cmd/kubernetes/kubernetes.go @@ -23,14 +23,26 @@ package main import ( "fmt" "net" + "net/http" + "time" kubeletapp "github.com/GoogleCloudPlatform/kubernetes/cmd/kubelet/app" "github.com/GoogleCloudPlatform/kubernetes/pkg/api" + "github.com/GoogleCloudPlatform/kubernetes/pkg/api/resource" "github.com/GoogleCloudPlatform/kubernetes/pkg/api/testapi" + "github.com/GoogleCloudPlatform/kubernetes/pkg/apiserver" "github.com/GoogleCloudPlatform/kubernetes/pkg/client" - "github.com/GoogleCloudPlatform/kubernetes/pkg/standalone" + nodeControllerPkg "github.com/GoogleCloudPlatform/kubernetes/pkg/cloudprovider/controller" + "github.com/GoogleCloudPlatform/kubernetes/pkg/controller" + kubeletServer "github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/server" + "github.com/GoogleCloudPlatform/kubernetes/pkg/master" + "github.com/GoogleCloudPlatform/kubernetes/pkg/master/ports" + "github.com/GoogleCloudPlatform/kubernetes/pkg/service" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "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" flag "github.com/spf13/pflag" @@ -47,15 +59,89 @@ var ( masterServiceNamespace = flag.String("master_service_namespace", api.NamespaceDefault, "The namespace from which the kubernetes master services should be injected into pods") ) +type delegateHandler struct { + delegate http.Handler +} + +func (h *delegateHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { + if h.delegate != nil { + h.delegate.ServeHTTP(w, req) + return + } + w.WriteHeader(http.StatusNotFound) +} + +// RunApiServer starts an API server in a go routine. +func runApiServer(cl *client.Client, etcdClient tools.EtcdClient, addr net.IP, port int, masterServiceNamespace string) { + handler := delegateHandler{} + + helper, err := master.NewEtcdHelper(etcdClient, "") + if err != nil { + glog.Fatalf("Unable to get etcd helper: %v", err) + } + + // Create a master and install handlers into mux. + m := master.New(&master.Config{ + Client: cl, + EtcdHelper: helper, + KubeletClient: &client.HTTPKubeletClient{ + Client: http.DefaultClient, + Port: 10250, + }, + EnableLogsSupport: false, + EnableSwaggerSupport: true, + APIPrefix: "/api", + Authorizer: apiserver.NewAlwaysAllowAuthorizer(), + + ReadWritePort: port, + ReadOnlyPort: port, + PublicAddress: addr, + MasterServiceNamespace: masterServiceNamespace, + }) + handler.delegate = m.InsecureHandler + + go http.ListenAndServe(fmt.Sprintf("%s:%d", addr, port), &handler) +} + +// RunScheduler starts up a scheduler in it's own goroutine +func runScheduler(cl *client.Client) { + // Scheduler + schedulerConfigFactory := factory.NewConfigFactory(cl) + schedulerConfig, err := schedulerConfigFactory.Create() + if err != nil { + glog.Fatalf("Couldn't create scheduler config: %v", err) + } + scheduler.New(schedulerConfig).Run() +} + +// RunControllerManager starts a controller +func runControllerManager(machineList []string, cl *client.Client, nodeMilliCPU, nodeMemory int64) { + nodeResources := &api.NodeResources{ + Capacity: api.ResourceList{ + api.ResourceCPU: *resource.NewMilliQuantity(nodeMilliCPU, resource.DecimalSI), + api.ResourceMemory: *resource.NewQuantity(nodeMemory, resource.BinarySI), + }, + } + kubeClient := &client.HTTPKubeletClient{Client: http.DefaultClient, Port: ports.KubeletPort} + nodeController := nodeControllerPkg.NewNodeController(nil, "", machineList, nodeResources, cl, kubeClient) + nodeController.Run(10*time.Second, 10) + + endpoints := service.NewEndpointController(cl) + go util.Forever(func() { endpoints.SyncServiceEndpoints() }, time.Second*10) + + controllerManager := controller.NewReplicationManager(cl) + controllerManager.Run(10 * time.Second) +} + func startComponents(etcdClient tools.EtcdClient, cl *client.Client, addr net.IP, port int) { machineList := []string{"localhost"} - standalone.RunApiServer(cl, etcdClient, addr, port, *masterServiceNamespace) - standalone.RunScheduler(cl) - standalone.RunControllerManager(machineList, cl, *nodeMilliCPU, *nodeMemory) + runApiServer(cl, etcdClient, addr, port, *masterServiceNamespace) + runScheduler(cl) + runControllerManager(machineList, cl, *nodeMilliCPU, *nodeMemory) dockerClient := util.ConnectToDockerOrDie(*dockerEndpoint) - standalone.SimpleRunKubelet(cl, nil, dockerClient, machineList[0], "/tmp/kubernetes", "", "127.0.0.1", 10250, *masterServiceNamespace, kubeletapp.ProbeVolumePlugins()) + kubeletServer.SimpleRunKubelet(cl, nil, dockerClient, machineList[0], "/tmp/kubernetes", "", "127.0.0.1", 10250, *masterServiceNamespace, kubeletapp.ProbeVolumePlugins()) } func newApiClient(addr net.IP, port int) *client.Client { diff --git a/pkg/standalone/standalone.go b/pkg/kubelet/server/server.go similarity index 69% rename from pkg/standalone/standalone.go rename to pkg/kubelet/server/server.go index 1074a36f3bda0..a8105ec36df7a 100644 --- a/pkg/standalone/standalone.go +++ b/pkg/kubelet/server/server.go @@ -14,51 +14,27 @@ See the License for the specific language governing permissions and limitations under the License. */ -package standalone +// package server makes it easy to create a kubelet server for various contexts. +package server import ( "fmt" "net" - "net/http" "time" - "github.com/GoogleCloudPlatform/kubernetes/pkg/api" - "github.com/GoogleCloudPlatform/kubernetes/pkg/api/resource" - "github.com/GoogleCloudPlatform/kubernetes/pkg/apiserver" "github.com/GoogleCloudPlatform/kubernetes/pkg/client" - "github.com/GoogleCloudPlatform/kubernetes/pkg/clientauth" - nodeControllerPkg "github.com/GoogleCloudPlatform/kubernetes/pkg/cloudprovider/controller" - "github.com/GoogleCloudPlatform/kubernetes/pkg/controller" "github.com/GoogleCloudPlatform/kubernetes/pkg/credentialprovider" "github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet" "github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/config" "github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/dockertools" "github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/volume" - "github.com/GoogleCloudPlatform/kubernetes/pkg/master" - "github.com/GoogleCloudPlatform/kubernetes/pkg/master/ports" - "github.com/GoogleCloudPlatform/kubernetes/pkg/service" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "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" ) -type delegateHandler struct { - delegate http.Handler -} - -func (h *delegateHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { - if h.delegate != nil { - h.delegate.ServeHTTP(w, req) - return - } - w.WriteHeader(http.StatusNotFound) -} - // TODO: replace this with clientcmd func GetAPIServerClient(authPath string, apiServerList util.StringList) (*client.Client, error) { authInfo, err := clientauth.LoadFromFile(authPath) @@ -88,69 +64,6 @@ func GetAPIServerClient(authPath string, apiServerList util.StringList) (*client return c, nil } -// RunApiServer starts an API server in a go routine. -func RunApiServer(cl *client.Client, etcdClient tools.EtcdClient, addr net.IP, port int, masterServiceNamespace string) { - handler := delegateHandler{} - - helper, err := master.NewEtcdHelper(etcdClient, "") - if err != nil { - glog.Fatalf("Unable to get etcd helper: %v", err) - } - - // Create a master and install handlers into mux. - m := master.New(&master.Config{ - Client: cl, - EtcdHelper: helper, - KubeletClient: &client.HTTPKubeletClient{ - Client: http.DefaultClient, - Port: 10250, - }, - EnableLogsSupport: false, - EnableSwaggerSupport: true, - EnableIndex: true, - APIPrefix: "/api", - Authorizer: apiserver.NewAlwaysAllowAuthorizer(), - - ReadWritePort: port, - ReadOnlyPort: port, - PublicAddress: addr, - MasterServiceNamespace: masterServiceNamespace, - }) - handler.delegate = m.InsecureHandler - - go http.ListenAndServe(fmt.Sprintf("%s:%d", addr, port), &handler) -} - -// RunScheduler starts up a scheduler in it's own goroutine -func RunScheduler(cl *client.Client) { - // Scheduler - schedulerConfigFactory := factory.NewConfigFactory(cl) - schedulerConfig, err := schedulerConfigFactory.Create() - if err != nil { - glog.Fatalf("Couldn't create scheduler config: %v", err) - } - scheduler.New(schedulerConfig).Run() -} - -// RunControllerManager starts a controller -func RunControllerManager(machineList []string, cl *client.Client, nodeMilliCPU, nodeMemory int64) { - nodeResources := &api.NodeResources{ - Capacity: api.ResourceList{ - api.ResourceCPU: *resource.NewMilliQuantity(nodeMilliCPU, resource.DecimalSI), - api.ResourceMemory: *resource.NewQuantity(nodeMemory, resource.BinarySI), - }, - } - kubeClient := &client.HTTPKubeletClient{Client: http.DefaultClient, Port: ports.KubeletPort} - nodeController := nodeControllerPkg.NewNodeController(nil, "", machineList, nodeResources, cl, kubeClient) - nodeController.Run(10*time.Second, 10) - - endpoints := service.NewEndpointController(cl) - go util.Forever(func() { endpoints.SyncServiceEndpoints() }, time.Second*10) - - controllerManager := controller.NewReplicationManager(cl) - controllerManager.Run(10 * time.Second) -} - // SimpleRunKubelet is a simple way to start a Kubelet talking to dockerEndpoint, using an etcdClient. // Under the hood it calls RunKubelet (below) func SimpleRunKubelet(client *client.Client, diff --git a/pkg/standalone/doc.go b/pkg/standalone/doc.go deleted file mode 100644 index 426e46f4b68c8..0000000000000 --- a/pkg/standalone/doc.go +++ /dev/null @@ -1,18 +0,0 @@ -/* -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 standalone has utilities for running different Kubernetes binaries in a single binary. -package standalone