From d0860f32120540bf171d023b3b2204c3e15eb3dc Mon Sep 17 00:00:00 2001 From: Solly Ross Date: Wed, 21 Oct 2015 20:12:32 -0400 Subject: [PATCH] Add HPA support for DeploymentConfig This commit makes the HorizontalPodAutoscaler controller use the DelegatingScaleNamespacer so that it can reach both Kubernetes objects with Scale subresources, as well as Origin DeploymentConfigs. --- pkg/cmd/server/bootstrappolicy/policy.go | 40 +++++++++++++++++++++++- pkg/cmd/server/kubernetes/master.go | 9 ++++-- pkg/cmd/server/start/start_master.go | 4 +-- 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/pkg/cmd/server/bootstrappolicy/policy.go b/pkg/cmd/server/bootstrappolicy/policy.go index 5362f6017b50..8bb979285855 100644 --- a/pkg/cmd/server/bootstrappolicy/policy.go +++ b/pkg/cmd/server/bootstrappolicy/policy.go @@ -39,6 +39,7 @@ func GetBootstrapClusterRoles() []authorizationapi.ClusterRole { { Verbs: sets.NewString(authorizationapi.VerbAll), Resources: sets.NewString(authorizationapi.ResourceAll), + APIGroups: []string{authorizationapi.APIGroupAll}, }, { Verbs: sets.NewString(authorizationapi.VerbAll), @@ -396,7 +397,44 @@ func GetBootstrapClusterRoles() []authorizationapi.ClusterRole { ObjectMeta: kapi.ObjectMeta{ Name: HPAControllerRoleName, }, - Rules: []authorizationapi.PolicyRule{}, + Rules: []authorizationapi.PolicyRule{ + // HPA Controller + { + APIGroups: []string{authorizationapi.APIGroupExtensions}, + Verbs: sets.NewString("get", "list"), + Resources: sets.NewString("horizontalpodautoscalers"), + }, + { + APIGroups: []string{authorizationapi.APIGroupExtensions}, + Verbs: sets.NewString("update"), + Resources: sets.NewString("horizontalpodautoscalers/status"), + }, + { + APIGroups: []string{authorizationapi.APIGroupExtensions}, + Verbs: sets.NewString("get", "update"), + Resources: sets.NewString("replicationcontrollers/scale"), + }, + { + Verbs: sets.NewString("get", "update"), + Resources: sets.NewString("deploymentconfigs/scale"), + }, + { + Verbs: sets.NewString("create", "update", "patch"), + Resources: sets.NewString("events"), + }, + // Heapster MetricsClient + { + Verbs: sets.NewString("list"), + Resources: sets.NewString("pods"), + }, + { + // TODO: fix MetricsClient to no longer require root proxy access + // TODO: restrict this to the appropriate namespace + Verbs: sets.NewString("proxy"), + Resources: sets.NewString("services"), + ResourceNames: sets.NewString("heapster"), + }, + }, }, { ObjectMeta: kapi.ObjectMeta{ diff --git a/pkg/cmd/server/kubernetes/master.go b/pkg/cmd/server/kubernetes/master.go index 60c43d0d8e1b..33f4849b2d5a 100644 --- a/pkg/cmd/server/kubernetes/master.go +++ b/pkg/cmd/server/kubernetes/master.go @@ -11,6 +11,7 @@ import ( kapi "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/client/record" + osclient "github.com/openshift/origin/pkg/client" client "k8s.io/kubernetes/pkg/client/unversioned" endpointcontroller "k8s.io/kubernetes/pkg/controller/endpoint" jobcontroller "k8s.io/kubernetes/pkg/controller/job" @@ -19,6 +20,8 @@ import ( volumeclaimbinder "k8s.io/kubernetes/pkg/controller/persistentvolume" replicationcontroller "k8s.io/kubernetes/pkg/controller/replication" resourcequotacontroller "k8s.io/kubernetes/pkg/controller/resourcequota" + podautoscalercontroller "k8s.io/kubernetes/pkg/controller/podautoscaler" + "k8s.io/kubernetes/pkg/controller/podautoscaler/metrics" "k8s.io/kubernetes/pkg/master" "k8s.io/kubernetes/pkg/util" "k8s.io/kubernetes/pkg/volume" @@ -113,8 +116,10 @@ func (c *MasterConfig) RunJobController(client *client.Client) { } // RunHPAController starts the Kubernetes hpa controller sync loop -func (c *MasterConfig) RunHPAController(client *client.Client) { - // TDO fix stub +func (c *MasterConfig) RunHPAController(oc *osclient.Client, kc *client.Client, heapsterNamespace string) { + delegScaleNamespacer := osclient.NewDelegatingScaleNamespacer(oc, kc) + podautoscaler := podautoscalercontroller.NewHorizontalController(kc, delegScaleNamespacer, kc, metrics.NewHeapsterMetricsClient(kc, heapsterNamespace, "heapster")) + podautoscaler.Run(c.ControllerManager.HorizontalPodAutoscalerSyncPeriod) } // RunEndpointController starts the Kubernetes replication controller sync loop diff --git a/pkg/cmd/server/start/start_master.go b/pkg/cmd/server/start/start_master.go index e16c32ab7179..5dd5174dbfac 100644 --- a/pkg/cmd/server/start/start_master.go +++ b/pkg/cmd/server/start/start_master.go @@ -534,7 +534,7 @@ func startControllers(oc *origin.MasterConfig, kc *kubernetes.MasterConfig) erro if err != nil { glog.Fatalf("Could not get client for job controller: %v", err) } - _, hpaKClient, err := oc.GetServiceAccountClients(oc.HPAControllerServiceAccount) + hpaOClient, hpaKClient, err := oc.GetServiceAccountClients(oc.HPAControllerServiceAccount) if err != nil { glog.Fatalf("Could not get client for HPA controller: %v", err) } @@ -547,7 +547,7 @@ func startControllers(oc *origin.MasterConfig, kc *kubernetes.MasterConfig) erro kc.RunScheduler() kc.RunReplicationController(rcClient) kc.RunJobController(jobClient) - kc.RunHPAController(hpaKClient) + kc.RunHPAController(hpaOClient, hpaKClient, oc.Options.PolicyConfig.OpenShiftInfrastructureNamespace) kc.RunEndpointController() kc.RunNamespaceController() kc.RunPersistentVolumeClaimBinder()