Use secrets to configure kube clients in federation cluster controller, and cache kube clients.

This commit is contained in:
Quinton Hoole 2016-05-28 11:12:59 -07:00
parent 20c75956fd
commit 85a0de3300
2 changed files with 23 additions and 20 deletions

View File

@ -72,6 +72,7 @@ var KubeconfigGetterForCluster = func(c *federation_v1alpha1.Cluster) clientcmd.
type ClusterClient struct { type ClusterClient struct {
discoveryClient *discovery.DiscoveryClient discoveryClient *discovery.DiscoveryClient
kubeClient *clientset.Clientset
} }
func NewClusterClientSet(c *federation_v1alpha1.Cluster) (*ClusterClient, error) { func NewClusterClientSet(c *federation_v1alpha1.Cluster) (*ClusterClient, error) {
@ -105,6 +106,10 @@ func NewClusterClientSet(c *federation_v1alpha1.Cluster) (*ClusterClient, error)
if clusterClientSet.discoveryClient == nil { if clusterClientSet.discoveryClient == nil {
return nil, nil return nil, nil
} }
clusterClientSet.kubeClient = clientset.NewForConfigOrDie((restclient.AddUserAgent(clusterConfig, UserAgentName)))
if clusterClientSet.kubeClient == nil {
return nil, nil
}
} }
return &clusterClientSet, err return &clusterClientSet, err
} }
@ -159,8 +164,8 @@ func (self *ClusterClient) GetClusterHealthStatus() *federation_v1alpha1.Cluster
} }
// GetClusterZones gets the kubernetes cluster zones and region by inspecting labels on nodes in the cluster. // GetClusterZones gets the kubernetes cluster zones and region by inspecting labels on nodes in the cluster.
func GetClusterZones(client *clientset.Clientset) (zones []string, region string, err error) { func (self *ClusterClient) GetClusterZones() (zones []string, region string, err error) {
return getZoneNames(client) return getZoneNames(self.kubeClient)
} }
// Find the name of the zone in which a Node is running // Find the name of the zone in which a Node is running
@ -194,6 +199,11 @@ func getZoneNames(client *clientset.Clientset) (zones []string, region string, e
return nil, "", err return nil, "", err
} }
for i, node := range nodes.Items { for i, node := range nodes.Items {
// TODO: quinton-hoole make this more efficient.
// For non-multi-zone clusters the zone will
// be identical for all nodes, so we only need to look at one node
// For multi-zone clusters we know at build time
// which zones are included. Rather get this info from there, because it's cheaper.
zoneName, err := getZoneNameForNode(node) zoneName, err := getZoneNameForNode(node)
if err != nil { if err != nil {
return nil, "", err return nil, "", err

View File

@ -27,9 +27,6 @@ import (
federationclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_release_1_3" federationclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_release_1_3"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/client/cache" "k8s.io/kubernetes/pkg/client/cache"
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
"k8s.io/kubernetes/pkg/client/restclient"
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
"k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller"
"k8s.io/kubernetes/pkg/controller/framework" "k8s.io/kubernetes/pkg/controller/framework"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
@ -187,10 +184,16 @@ func (cc *ClusterController) UpdateClusterStatus() error {
} }
} }
} }
clusterClientSet, _ := NewClusterClientset(&cluster) clusterClient, found := cc.clusterKubeClientMap[cluster.Name]
zones, region, err := GetClusterZones(clusterClientSet) if !found {
glog.Warningf("Failed to client for cluster %s", cluster.Name)
continue
}
zones, region, err := clusterClient.GetClusterZones()
if err != nil { if err != nil {
glog.Errorf("Failed to get zones and region for cluster %s: %v", cluster.Name, err) glog.Warningf("Failed to get zones and region for cluster %s: %v", cluster.Name, err)
// Don't return err here, as we want the rest of the status update to proceed.
} else { } else {
clusterStatusNew.Zones = zones clusterStatusNew.Zones = zones
clusterStatusNew.Region = region clusterStatusNew.Region = region
@ -199,20 +202,10 @@ func (cc *ClusterController) UpdateClusterStatus() error {
cluster.Status = *clusterStatusNew cluster.Status = *clusterStatusNew
cluster, err := cc.federationClient.Federation().Clusters().UpdateStatus(&cluster) cluster, err := cc.federationClient.Federation().Clusters().UpdateStatus(&cluster)
if err != nil { if err != nil {
glog.Infof("Failed to update the status of cluster: %v ,error is : %v", cluster.Name, err) glog.Warningf("Failed to update the status of cluster: %v ,error is : %v", cluster.Name, err)
// Don't return err here, as we want to continue processing remaining clusters.
continue continue
} }
} }
return nil return nil
} }
func NewClusterClientset(c *federation_v1alpha1.Cluster) (*clientset.Clientset, error) { // TODO: Stolen from federation/pkg/federation-controller/service/cluster_helper.go - factor it out of there.
clusterConfig, err := clientcmd.BuildConfigFromFlags(c.Spec.ServerAddressByClientCIDRs[0].ServerAddress, "")
if err != nil {
return nil, err
}
clusterConfig.QPS = KubeAPIQPS
clusterConfig.Burst = KubeAPIBurst
clientset := clientset.NewForConfigOrDie(restclient.AddUserAgent(clusterConfig, UserAgentName))
return clientset, nil
}