mirror of https://github.com/k3s-io/k3s
Refactor apiserver command; move logic to a package for reuse and eventual testing
parent
b3ab658c71
commit
ea5cbd44bb
|
@ -21,17 +21,10 @@ package main
|
||||||
import (
|
import (
|
||||||
"flag"
|
"flag"
|
||||||
"log"
|
"log"
|
||||||
"math/rand"
|
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/coreos/go-etcd/etcd"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/master"
|
||||||
|
|
||||||
"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/GoogleCloudPlatform/kubernetes/pkg/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -54,45 +47,13 @@ func main() {
|
||||||
log.Fatal("No machines specified!")
|
log.Fatal("No machines specified!")
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var m *master.Master
|
||||||
podRegistry registry.PodRegistry
|
|
||||||
controllerRegistry registry.ControllerRegistry
|
|
||||||
serviceRegistry registry.ServiceRegistry
|
|
||||||
)
|
|
||||||
|
|
||||||
if len(etcdServerList) > 0 {
|
if len(etcdServerList) > 0 {
|
||||||
log.Printf("Creating etcd client pointing to %v", etcdServerList)
|
m = master.New(etcdServerList, machineList)
|
||||||
etcdClient := etcd.NewClient(etcdServerList)
|
|
||||||
podRegistry = registry.MakeEtcdRegistry(etcdClient, machineList)
|
|
||||||
controllerRegistry = registry.MakeEtcdRegistry(etcdClient, machineList)
|
|
||||||
serviceRegistry = registry.MakeEtcdRegistry(etcdClient, machineList)
|
|
||||||
} else {
|
} else {
|
||||||
podRegistry = registry.MakeMemoryRegistry()
|
m = master.NewMemoryServer(machineList)
|
||||||
controllerRegistry = registry.MakeMemoryRegistry()
|
|
||||||
serviceRegistry = registry.MakeMemoryRegistry()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
containerInfo := &client.HTTPContainerInfo{
|
log.Fatal(m.Run(net.JoinHostPort(*address, strconv.Itoa(int(*port))), *apiPrefix))
|
||||||
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())
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,14 +23,14 @@ import (
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"math/rand"
|
"net"
|
||||||
"net/http"
|
|
||||||
"os"
|
"os"
|
||||||
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/apiserver"
|
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/client"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/client"
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet"
|
||||||
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/master"
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/registry"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/registry"
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
|
||||||
"github.com/coreos/go-etcd/etcd"
|
"github.com/coreos/go-etcd/etcd"
|
||||||
|
@ -80,36 +80,8 @@ func fake_kubelet() {
|
||||||
|
|
||||||
// Starts api services (the master). Never returns.
|
// Starts api services (the master). Never returns.
|
||||||
func api_server() {
|
func api_server() {
|
||||||
machineList := util.StringList{*kubelet_address}
|
m := master.New([]string{*etcd_server}, []string{*kubelet_address})
|
||||||
|
log.Fatal(m.Run(net.JoinHostPort(*master_address, strconv.Itoa(int(*master_port))), *apiPrefix))
|
||||||
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())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Starts up a controller manager. Never returns.
|
// Starts up a controller manager. Never returns.
|
||||||
|
|
|
@ -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
|
|
@ -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()
|
||||||
|
}
|
Loading…
Reference in New Issue