From 54cafc7ab366b0bee0bbf81e490715ecc75ee71d Mon Sep 17 00:00:00 2001 From: David Eads Date: Fri, 12 Jan 2018 11:19:58 -0500 Subject: [PATCH 1/2] UPSTREAM: : allow injection of controller context function --- .../kube-controller-manager/app/controllermanager.go | 9 +++++++-- .../cmd/kube-controller-manager/app/patch.go | 11 ++--------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/vendor/k8s.io/kubernetes/cmd/kube-controller-manager/app/controllermanager.go b/vendor/k8s.io/kubernetes/cmd/kube-controller-manager/app/controllermanager.go index 621c5cb17e01..62fd912667bd 100644 --- a/vendor/k8s.io/kubernetes/cmd/kube-controller-manager/app/controllermanager.go +++ b/vendor/k8s.io/kubernetes/cmd/kube-controller-manager/app/controllermanager.go @@ -423,9 +423,14 @@ func GetAvailableResources(clientBuilder controller.ControllerClientBuilder) (ma // CreateControllerContext creates a context struct containing references to resources needed by the // controllers such as the cloud provider and clientBuilder. rootClientBuilder is only used for // the shared-informers client and token controller. -func createControllerContext(s *options.CMServer, rootClientBuilder, clientBuilder controller.ControllerClientBuilder, stop <-chan struct{}) (ControllerContext, error) { +func CreateControllerContext(s *options.CMServer, rootClientBuilder, clientBuilder controller.ControllerClientBuilder, stop <-chan struct{}) (ControllerContext, error) { versionedClient := rootClientBuilder.ClientOrDie("shared-informers") - sharedInformers := informers.NewSharedInformerFactory(versionedClient, ResyncPeriod(s)()) + var sharedInformers informers.SharedInformerFactory + if InformerFactoryOverride == nil{ + sharedInformers = informers.NewSharedInformerFactory(versionedClient, ResyncPeriod(s)()) + } else{ + sharedInformers = InformerFactoryOverride + } availableResources, err := GetAvailableResources(rootClientBuilder) if err != nil { diff --git a/vendor/k8s.io/kubernetes/cmd/kube-controller-manager/app/patch.go b/vendor/k8s.io/kubernetes/cmd/kube-controller-manager/app/patch.go index 02ce021eee48..b08bafcb4ff9 100644 --- a/vendor/k8s.io/kubernetes/cmd/kube-controller-manager/app/patch.go +++ b/vendor/k8s.io/kubernetes/cmd/kube-controller-manager/app/patch.go @@ -1,12 +1,5 @@ package app -import ( - "k8s.io/kubernetes/cmd/kube-controller-manager/app/options" - "k8s.io/kubernetes/pkg/controller" -) +import "k8s.io/client-go/informers" -// This allows overriding from inside the same process. It's not pretty, but its fairly easy to maintain because conflicts are small. -var CreateControllerContext func(s *options.CMServer, rootClientBuilder, clientBuilder controller.ControllerClientBuilder, stop <-chan struct{}) (ControllerContext, error) = createControllerContext - -// StartInformers allows overriding inside of the same process. -var StartInformers func(stop <-chan struct{}) = nil +var InformerFactoryOverride informers.SharedInformerFactory From 33febceaf342e23b861a3d1ed0686b5626b6ef18 Mon Sep 17 00:00:00 2001 From: David Eads Date: Fri, 12 Jan 2018 11:20:37 -0500 Subject: [PATCH 2/2] inject an informer factory override for kube controllers to minimize impact --- .../start/start_kube_controller_manager.go | 29 +++++-------------- 1 file changed, 7 insertions(+), 22 deletions(-) diff --git a/pkg/cmd/server/start/start_kube_controller_manager.go b/pkg/cmd/server/start/start_kube_controller_manager.go index 4be6ac5c0bbb..173b60ab917b 100644 --- a/pkg/cmd/server/start/start_kube_controller_manager.go +++ b/pkg/cmd/server/start/start_kube_controller_manager.go @@ -16,7 +16,6 @@ import ( controllerapp "k8s.io/kubernetes/cmd/kube-controller-manager/app" controlleroptions "k8s.io/kubernetes/cmd/kube-controller-manager/app/options" "k8s.io/kubernetes/pkg/api/legacyscheme" - "k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/volume" _ "k8s.io/kubernetes/plugin/pkg/scheduler/algorithmprovider" @@ -25,26 +24,6 @@ import ( "k8s.io/kubernetes/pkg/apis/componentconfig" ) -// newKubeControllerContext provides a function which overrides the default and plugs a different set of informers in -func newKubeControllerContext(informers *informers) func(s *controlleroptions.CMServer, rootClientBuilder, clientBuilder controller.ControllerClientBuilder, stop <-chan struct{}) (controllerapp.ControllerContext, error) { - oldContextFunc := controllerapp.CreateControllerContext - return func(s *controlleroptions.CMServer, rootClientBuilder, clientBuilder controller.ControllerClientBuilder, stop <-chan struct{}) (controllerapp.ControllerContext, error) { - ret, err := oldContextFunc(s, rootClientBuilder, clientBuilder, stop) - if err != nil { - return controllerapp.ControllerContext{}, err - } - - // Overwrite the informers, because we have our custom generic informers for quota. - // TODO update quota to create its own informer like garbage collection or if we split this out, actually add our external types to the kube generic informer - ret.InformerFactory = externalKubeInformersWithExtraGenerics{ - SharedInformerFactory: informers.GetExternalKubeInformers(), - genericResourceInformer: informers.ToGenericInformer(), - } - - return ret, nil - } -} - func kubeControllerManagerAddFlags(cmserver *controlleroptions.CMServer) func(flags *pflag.FlagSet) { return func(flags *pflag.FlagSet) { cmserver.AddFlags(flags, controllerapp.KnownControllers(), controllerapp.ControllersDisabledByDefault.List()) @@ -225,7 +204,13 @@ func createRecylerTemplate(recyclerImage string) (string, error) { func runEmbeddedKubeControllerManager(kubeconfigFile, saPrivateKeyFile, saRootCAFile, podEvictionTimeout string, dynamicProvisioningEnabled bool, cmdLineArgs map[string][]string, recyclerImage string, informers *informers) { - controllerapp.CreateControllerContext = newKubeControllerContext(informers) + + // Overwrite the informers, because we have our custom generic informers for quota. + // TODO update quota to create its own informer like garbage collection or if we split this out, actually add our external types to the kube generic informer + controllerapp.InformerFactoryOverride = externalKubeInformersWithExtraGenerics{ + SharedInformerFactory: informers.GetExternalKubeInformers(), + genericResourceInformer: informers.ToGenericInformer(), + } // TODO we need a real identity for this. Right now it's just using the loopback connection like it used to. controllerManager, cleanupFunctions, err := newKubeControllerManager(kubeconfigFile, saPrivateKeyFile, saRootCAFile, podEvictionTimeout, recyclerImage, dynamicProvisioningEnabled, cmdLineArgs)