Skip to content

Commit ba3276f

Browse files
committed
run kube controllers separately based on their command
1 parent 457a31c commit ba3276f

File tree

4 files changed

+131
-84
lines changed

4 files changed

+131
-84
lines changed

Diff for: pkg/cmd/server/kubernetes/master/controller/config.go

-39
This file was deleted.
+102
Original file line numberDiff line numberDiff line change
@@ -1 +1,103 @@
11
package start
2+
3+
import (
4+
"github.com/golang/glog"
5+
6+
kerrors "k8s.io/apimachinery/pkg/util/errors"
7+
controllerapp "k8s.io/kubernetes/cmd/kube-controller-manager/app"
8+
controlleroptions "k8s.io/kubernetes/cmd/kube-controller-manager/app/options"
9+
_ "k8s.io/kubernetes/plugin/pkg/scheduler/algorithmprovider"
10+
11+
"github.com/openshift/origin/pkg/cmd/server/bootstrappolicy"
12+
"k8s.io/kubernetes/pkg/api/v1"
13+
kapiv1 "k8s.io/kubernetes/pkg/api/v1"
14+
"k8s.io/kubernetes/pkg/volume"
15+
16+
cmdflags "github.com/openshift/origin/pkg/cmd/util/flags"
17+
"github.com/spf13/pflag"
18+
)
19+
20+
// newPersistentVolumeRecyclerPodTemplate provides a function which makes our recycler pod template for use in the kube-controller-manager
21+
// this is a stop-gap until the kube-controller-manager take a pod manifest
22+
func newPersistentVolumeRecyclerPodTemplate(recyclerImageName string) func() *v1.Pod {
23+
oldTemplateFunc := volume.NewPersistentVolumeRecyclerPodTemplate
24+
return func() *v1.Pod {
25+
uid := int64(0)
26+
defaultScrubPod := oldTemplateFunc()
27+
// TODO: Move the recycler pods to dedicated namespace instead of polluting openshift-infra.
28+
defaultScrubPod.Namespace = "openshift-infra"
29+
defaultScrubPod.Spec.ServiceAccountName = bootstrappolicy.InfraPersistentVolumeRecyclerControllerServiceAccountName
30+
defaultScrubPod.Spec.Containers[0].Image = recyclerImageName
31+
defaultScrubPod.Spec.Containers[0].Command = []string{"/usr/bin/openshift-recycle"}
32+
defaultScrubPod.Spec.Containers[0].Args = []string{"/scrub"}
33+
defaultScrubPod.Spec.Containers[0].SecurityContext = &kapiv1.SecurityContext{RunAsUser: &uid}
34+
defaultScrubPod.Spec.Containers[0].ImagePullPolicy = kapiv1.PullIfNotPresent
35+
36+
return defaultScrubPod
37+
}
38+
}
39+
40+
func kubeControllerManagerAddFlags(cmserver *controlleroptions.CMServer) func(flags *pflag.FlagSet) {
41+
return func(flags *pflag.FlagSet) {
42+
cmserver.AddFlags(flags, controllerapp.KnownControllers(), controllerapp.ControllersDisabledByDefault.List())
43+
}
44+
}
45+
46+
func newKubeControllerManager(kubeconfigFile, saPrivateKeyFile, saRootCAFile string, cmdLineArgs map[string][]string) (*controlleroptions.CMServer, error) {
47+
if cmdLineArgs == nil {
48+
cmdLineArgs = map[string][]string{}
49+
}
50+
51+
if len(cmdLineArgs["controllers"]) == 0 {
52+
cmdLineArgs["controllers"] = []string{}
53+
}
54+
// these two are ones we disable in addition to others
55+
cmdLineArgs["controllers"] = []string{
56+
// we don't appear to use this
57+
"-ttl",
58+
// we have to configure this separately until it is generic
59+
"-horizontalpodautoscaler",
60+
// we carry patches on this. For now....
61+
"-serviceaccount-token",
62+
}
63+
if len(cmdLineArgs["use-service-account-credentials"]) == 0 {
64+
cmdLineArgs["use-service-account-credentials"] = []string{"true"}
65+
}
66+
if len(cmdLineArgs["service-account-private-key-file"]) == 0 {
67+
cmdLineArgs["service-account-private-key-file"] = []string{saPrivateKeyFile}
68+
}
69+
if len(cmdLineArgs["root-ca-file"]) == 0 {
70+
cmdLineArgs["root-ca-file"] = []string{saRootCAFile}
71+
}
72+
if len(cmdLineArgs["kubeconfig"]) == 0 {
73+
cmdLineArgs["kubeconfig"] = []string{kubeconfigFile}
74+
}
75+
76+
// disable serving http since we didn't used to expose it
77+
if len(cmdLineArgs["port"]) == 0 {
78+
cmdLineArgs["port"] = []string{"-1"}
79+
}
80+
81+
// resolve arguments
82+
controllerManager := controlleroptions.NewCMServer()
83+
if err := cmdflags.Resolve(cmdLineArgs, kubeControllerManagerAddFlags(controllerManager)); len(err) > 0 {
84+
return nil, kerrors.NewAggregate(err)
85+
}
86+
87+
return controllerManager, nil
88+
}
89+
90+
func runEmbeddedKubeControllerManager(kubeconfigFile, saPrivateKeyFile, saRootCAFile string, cmdLineArgs map[string][]string, recyclerImage string) {
91+
volume.NewPersistentVolumeRecyclerPodTemplate = newPersistentVolumeRecyclerPodTemplate(recyclerImage)
92+
93+
// TODO we need a real identity for this. Right now it's just using the loopback connection like it used to.
94+
controllerManager, err := newKubeControllerManager(kubeconfigFile, saPrivateKeyFile, saRootCAFile, cmdLineArgs)
95+
if err != nil {
96+
glog.Fatal(err)
97+
}
98+
// this does a second leader election, but doing the second leader election will allow us to move out process in
99+
// 3.8 if we so choose.
100+
if err := controllerapp.Run(controllerManager); err != nil {
101+
glog.Fatal(err)
102+
}
103+
}

Diff for: pkg/cmd/server/start/start_master.go

+8-26
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import (
2727
clientgoclientset "k8s.io/client-go/kubernetes"
2828
"k8s.io/client-go/tools/cache"
2929
aggregatorinstall "k8s.io/kube-aggregator/pkg/apis/apiregistration/install"
30-
kubecontroller "k8s.io/kubernetes/cmd/kube-controller-manager/app"
3130
kapi "k8s.io/kubernetes/pkg/api"
3231
"k8s.io/kubernetes/pkg/capabilities"
3332
kinformers "k8s.io/kubernetes/pkg/client/informers/informers_generated/externalversions"
@@ -47,7 +46,6 @@ import (
4746
"github.com/openshift/origin/pkg/cmd/server/etcd"
4847
"github.com/openshift/origin/pkg/cmd/server/etcd/etcdserver"
4948
kubernetes "github.com/openshift/origin/pkg/cmd/server/kubernetes/master"
50-
kubecontrollers "github.com/openshift/origin/pkg/cmd/server/kubernetes/master/controller"
5149
"github.com/openshift/origin/pkg/cmd/server/origin"
5250
origincontrollers "github.com/openshift/origin/pkg/cmd/server/origin/controller"
5351
originrest "github.com/openshift/origin/pkg/cmd/server/origin/rest"
@@ -407,11 +405,13 @@ func (m *Master) Start() error {
407405
return err
408406
}
409407

408+
imageTemplate := variable.NewDefaultImageTemplate()
409+
imageTemplate.Format = m.config.ImageConfig.Format
410+
imageTemplate.Latest = m.config.ImageConfig.Latest
411+
recyclerImage := imageTemplate.ExpandOrDie("recycler")
412+
410413
// you can't double run healthz, so only do this next bit if we aren't starting the API
411414
if !m.api {
412-
imageTemplate := variable.NewDefaultImageTemplate()
413-
imageTemplate.Format = m.config.ImageConfig.Format
414-
imageTemplate.Latest = m.config.ImageConfig.Latest
415415

416416
glog.Infof("Starting controllers on %s (%s)", m.config.ServingInfo.BindAddress, version.Get().String())
417417
if len(m.config.DisabledFeatures) > 0 {
@@ -476,6 +476,8 @@ func (m *Master) Start() error {
476476
// continuously run the scheduler while we have the primary lease
477477
go runEmbeddedScheduler(m.config.MasterClients.OpenShiftLoopbackKubeConfig, m.config.KubernetesMasterConfig.SchedulerConfigFile, m.config.KubernetesMasterConfig.SchedulerArguments)
478478

479+
go runEmbeddedKubeControllerManager(m.config.MasterClients.OpenShiftLoopbackKubeConfig, m.config.ServiceAccountConfig.PrivateKeyFile, m.config.ServiceAccountConfig.MasterCA, m.config.KubernetesMasterConfig.ControllerArguments, recyclerImage)
480+
479481
controllerContext, err := getControllerContext(*m.config, kubeControllerManagerConfig, cloudProvider, informers, utilwait.NeverStop)
480482
if err != nil {
481483
glog.Fatal(err)
@@ -700,24 +702,10 @@ func startControllers(options configapi.MasterConfig, allocationController origi
700702

701703
allocationController.RunSecurityAllocationController()
702704

703-
// set the upstream default until it is configurable
704-
kubecontrollers.SetPVRecyclerPod(options.ImageConfig)
705-
kubernetesControllerInitializers := kubecontroller.NewControllerInitializers()
706-
// remove the HPA controller until it is generic
707-
delete(kubernetesControllerInitializers, "horizontalpodautoscaling")
708-
709705
openshiftControllerInitializers, err := openshiftControllerConfig.GetControllerInitializers()
710706
if err != nil {
711707
return err
712708
}
713-
// Add kubernetes controllers initialized from Origin
714-
for name, initFn := range kubernetesControllerInitializers {
715-
if _, exists := openshiftControllerInitializers[name]; exists {
716-
// don't overwrite, openshift takes priority
717-
continue
718-
}
719-
openshiftControllerInitializers[name] = origincontrollers.FromKubeInitFunc(initFn)
720-
}
721709

722710
excludedControllers := getExcludedControllers(options)
723711

@@ -751,17 +739,11 @@ func startControllers(options configapi.MasterConfig, allocationController origi
751739
}
752740

753741
func getExcludedControllers(options configapi.MasterConfig) sets.String {
754-
excludedControllers := sets.NewString(
755-
// not used in openshift. Yet?
756-
"ttl",
757-
"bootstrapsigner",
758-
"tokencleaner",
759-
)
742+
excludedControllers := sets.NewString()
760743
if !configapi.IsBuildEnabled(&options) {
761744
excludedControllers.Insert("openshift.io/build")
762745
excludedControllers.Insert("openshift.io/build-config-change")
763746
}
764-
765747
return excludedControllers
766748
}
767749

Diff for: vendor/k8s.io/kubernetes/cmd/kube-controller-manager/app/controllermanager.go

+21-19
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)