From 6c734b1c5521c4e4166e00f9af9d5184f45d58f1 Mon Sep 17 00:00:00 2001 From: Brendan Burns Date: Thu, 17 Jul 2014 20:54:54 -0700 Subject: [PATCH] integrate minion health checking and caching. --- cmd/apiserver/apiserver.go | 5 ++++- cmd/integration/integration.go | 2 +- pkg/master/master.go | 27 +++++++++++++++++++++------ 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/cmd/apiserver/apiserver.go b/cmd/apiserver/apiserver.go index 7f0603f805..5572567b0f 100644 --- a/cmd/apiserver/apiserver.go +++ b/cmd/apiserver/apiserver.go @@ -23,6 +23,7 @@ import ( "net" "net/http" "strconv" + "time" "github.com/GoogleCloudPlatform/kubernetes/pkg/client" "github.com/GoogleCloudPlatform/kubernetes/pkg/cloudprovider" @@ -38,6 +39,8 @@ var ( cloudProvider = flag.String("cloud_provider", "", "The provider for cloud services. Empty string for no provider.") minionRegexp = flag.String("minion_regexp", "", "If non empty, and -cloud_provider is specified, a regular expression for matching minion VMs") minionPort = flag.Uint("minion_port", 10250, "The port at which kubelet will be listening on the minions.") + healthCheckMinions = flag.Bool("health_check_minions", true, "If true, health check minions and filter unhealthy ones. [default true]") + minionCacheTTL = flag.Duration("minion_cache_ttl", 30*time.Second, "Duration of time to cache minion information. [default 30 seconds]") etcdServerList, machineList util.StringList ) @@ -80,7 +83,7 @@ func main() { var m *master.Master if len(etcdServerList) > 0 { - m = master.New(etcdServerList, machineList, podInfoGetter, cloud, *minionRegexp, client) + m = master.New(etcdServerList, machineList, podInfoGetter, cloud, *minionRegexp, client, *healthCheckMinions, *minionCacheTTL) } else { m = master.NewMemoryServer(machineList, podInfoGetter, cloud, client) } diff --git a/cmd/integration/integration.go b/cmd/integration/integration.go index 07fb02ffc7..b9baba78e3 100644 --- a/cmd/integration/integration.go +++ b/cmd/integration/integration.go @@ -94,7 +94,7 @@ func startComponents(manifestURL string) (apiServerURL string) { cl.Sync = true // Master - m := master.New(servers, machineList, fakePodInfoGetter{}, nil, "", cl) + m := master.New(servers, machineList, fakePodInfoGetter{}, nil, "", cl, false, 0) handler.delegate = m.ConstructHandler("/api/v1beta1") controllerManager := controller.MakeReplicationManager(etcdClient, cl) diff --git a/pkg/master/master.go b/pkg/master/master.go index a26cbdd655..672b20c233 100644 --- a/pkg/master/master.go +++ b/pkg/master/master.go @@ -55,9 +55,9 @@ func NewMemoryServer(minions []string, podInfoGetter client.PodInfoGetter, cloud } // New returns a new instance of Master connected to the given etcdServer. -func New(etcdServers, minions []string, podInfoGetter client.PodInfoGetter, cloud cloudprovider.Interface, minionRegexp string, client *client.Client) *Master { +func New(etcdServers, minions []string, podInfoGetter client.PodInfoGetter, cloud cloudprovider.Interface, minionRegexp string, client *client.Client, healthCheckMinions bool, cacheMinionsTTL time.Duration) *Master { etcdClient := etcd.NewClient(etcdServers) - minionRegistry := minionRegistryMaker(minions, cloud, minionRegexp) + minionRegistry := minionRegistryMaker(minions, cloud, minionRegexp, healthCheckMinions, cacheMinionsTTL) m := &Master{ podRegistry: registry.MakeEtcdRegistry(etcdClient, minionRegistry), controllerRegistry: registry.MakeEtcdRegistry(etcdClient, minionRegistry), @@ -69,15 +69,30 @@ func New(etcdServers, minions []string, podInfoGetter client.PodInfoGetter, clou return m } -func minionRegistryMaker(minions []string, cloud cloudprovider.Interface, minionRegexp string) registry.MinionRegistry { +func minionRegistryMaker(minions []string, cloud cloudprovider.Interface, minionRegexp string, healthCheck bool, cacheTTL time.Duration) registry.MinionRegistry { + var minionRegistry registry.MinionRegistry if cloud != nil && len(minionRegexp) > 0 { - minionRegistry, err := registry.MakeCloudMinionRegistry(cloud, minionRegexp) + var err error + minionRegistry, err = registry.MakeCloudMinionRegistry(cloud, minionRegexp) if err != nil { glog.Errorf("Failed to initalize cloud minion registry reverting to static registry (%#v)", err) } - return minionRegistry } - return registry.MakeMinionRegistry(minions) + if minionRegistry == nil { + minionRegistry = registry.MakeMinionRegistry(minions) + } + if healthCheck { + minionRegistry = registry.NewHealthyMinionRegistry(minionRegistry, &http.Client{}) + } + if cacheTTL > 0 { + cachingMinionRegistry, err := registry.NewCachingMinionRegistry(minionRegistry, cacheTTL) + if err != nil { + glog.Errorf("Failed to initialize caching layer, ignoring cache.") + } else { + minionRegistry = cachingMinionRegistry + } + } + return minionRegistry } func (m *Master) init(cloud cloudprovider.Interface, podInfoGetter client.PodInfoGetter) {