options.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. /*
  2. Copyright 2014 The Kubernetes Authors.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. // Package options provides the flags used for the controller manager.
  14. //
  15. package options
  16. import (
  17. "fmt"
  18. "net"
  19. v1 "k8s.io/api/core/v1"
  20. utilerrors "k8s.io/apimachinery/pkg/util/errors"
  21. apiserveroptions "k8s.io/apiserver/pkg/server/options"
  22. utilfeature "k8s.io/apiserver/pkg/util/feature"
  23. clientset "k8s.io/client-go/kubernetes"
  24. clientgokubescheme "k8s.io/client-go/kubernetes/scheme"
  25. v1core "k8s.io/client-go/kubernetes/typed/core/v1"
  26. restclient "k8s.io/client-go/rest"
  27. "k8s.io/client-go/tools/clientcmd"
  28. "k8s.io/client-go/tools/record"
  29. cliflag "k8s.io/component-base/cli/flag"
  30. kubectrlmgrconfigv1alpha1 "k8s.io/kube-controller-manager/config/v1alpha1"
  31. cmoptions "k8s.io/kubernetes/cmd/controller-manager/app/options"
  32. kubecontrollerconfig "k8s.io/kubernetes/cmd/kube-controller-manager/app/config"
  33. kubectrlmgrconfig "k8s.io/kubernetes/pkg/controller/apis/config"
  34. kubectrlmgrconfigscheme "k8s.io/kubernetes/pkg/controller/apis/config/scheme"
  35. "k8s.io/kubernetes/pkg/controller/garbagecollector"
  36. garbagecollectorconfig "k8s.io/kubernetes/pkg/controller/garbagecollector/config"
  37. "k8s.io/kubernetes/pkg/master/ports"
  38. // add the kubernetes feature gates
  39. _ "k8s.io/kubernetes/pkg/features"
  40. "k8s.io/klog"
  41. )
  42. const (
  43. // KubeControllerManagerUserAgent is the userAgent name when starting kube-controller managers.
  44. KubeControllerManagerUserAgent = "kube-controller-manager"
  45. )
  46. // KubeControllerManagerOptions is the main context object for the kube-controller manager.
  47. type KubeControllerManagerOptions struct {
  48. Generic *cmoptions.GenericControllerManagerConfigurationOptions
  49. KubeCloudShared *cmoptions.KubeCloudSharedOptions
  50. ServiceController *cmoptions.ServiceControllerOptions
  51. AttachDetachController *AttachDetachControllerOptions
  52. CSRSigningController *CSRSigningControllerOptions
  53. DaemonSetController *DaemonSetControllerOptions
  54. DeploymentController *DeploymentControllerOptions
  55. DeprecatedFlags *DeprecatedControllerOptions
  56. EndpointController *EndpointControllerOptions
  57. GarbageCollectorController *GarbageCollectorControllerOptions
  58. HPAController *HPAControllerOptions
  59. JobController *JobControllerOptions
  60. NamespaceController *NamespaceControllerOptions
  61. NodeIPAMController *NodeIPAMControllerOptions
  62. NodeLifecycleController *NodeLifecycleControllerOptions
  63. PersistentVolumeBinderController *PersistentVolumeBinderControllerOptions
  64. PodGCController *PodGCControllerOptions
  65. ReplicaSetController *ReplicaSetControllerOptions
  66. ReplicationController *ReplicationControllerOptions
  67. ResourceQuotaController *ResourceQuotaControllerOptions
  68. SAController *SAControllerOptions
  69. TTLAfterFinishedController *TTLAfterFinishedControllerOptions
  70. SecureServing *apiserveroptions.SecureServingOptionsWithLoopback
  71. // TODO: remove insecure serving mode
  72. InsecureServing *apiserveroptions.DeprecatedInsecureServingOptionsWithLoopback
  73. Authentication *apiserveroptions.DelegatingAuthenticationOptions
  74. Authorization *apiserveroptions.DelegatingAuthorizationOptions
  75. Master string
  76. Kubeconfig string
  77. }
  78. // NewKubeControllerManagerOptions creates a new KubeControllerManagerOptions with a default config.
  79. func NewKubeControllerManagerOptions() (*KubeControllerManagerOptions, error) {
  80. componentConfig, err := NewDefaultComponentConfig(ports.InsecureKubeControllerManagerPort)
  81. if err != nil {
  82. return nil, err
  83. }
  84. s := KubeControllerManagerOptions{
  85. Generic: cmoptions.NewGenericControllerManagerConfigurationOptions(&componentConfig.Generic),
  86. KubeCloudShared: cmoptions.NewKubeCloudSharedOptions(&componentConfig.KubeCloudShared),
  87. ServiceController: &cmoptions.ServiceControllerOptions{
  88. ServiceControllerConfiguration: &componentConfig.ServiceController,
  89. },
  90. AttachDetachController: &AttachDetachControllerOptions{
  91. &componentConfig.AttachDetachController,
  92. },
  93. CSRSigningController: &CSRSigningControllerOptions{
  94. &componentConfig.CSRSigningController,
  95. },
  96. DaemonSetController: &DaemonSetControllerOptions{
  97. &componentConfig.DaemonSetController,
  98. },
  99. DeploymentController: &DeploymentControllerOptions{
  100. &componentConfig.DeploymentController,
  101. },
  102. DeprecatedFlags: &DeprecatedControllerOptions{
  103. &componentConfig.DeprecatedController,
  104. },
  105. EndpointController: &EndpointControllerOptions{
  106. &componentConfig.EndpointController,
  107. },
  108. GarbageCollectorController: &GarbageCollectorControllerOptions{
  109. &componentConfig.GarbageCollectorController,
  110. },
  111. HPAController: &HPAControllerOptions{
  112. &componentConfig.HPAController,
  113. },
  114. JobController: &JobControllerOptions{
  115. &componentConfig.JobController,
  116. },
  117. NamespaceController: &NamespaceControllerOptions{
  118. &componentConfig.NamespaceController,
  119. },
  120. NodeIPAMController: &NodeIPAMControllerOptions{
  121. &componentConfig.NodeIPAMController,
  122. },
  123. NodeLifecycleController: &NodeLifecycleControllerOptions{
  124. &componentConfig.NodeLifecycleController,
  125. },
  126. PersistentVolumeBinderController: &PersistentVolumeBinderControllerOptions{
  127. &componentConfig.PersistentVolumeBinderController,
  128. },
  129. PodGCController: &PodGCControllerOptions{
  130. &componentConfig.PodGCController,
  131. },
  132. ReplicaSetController: &ReplicaSetControllerOptions{
  133. &componentConfig.ReplicaSetController,
  134. },
  135. ReplicationController: &ReplicationControllerOptions{
  136. &componentConfig.ReplicationController,
  137. },
  138. ResourceQuotaController: &ResourceQuotaControllerOptions{
  139. &componentConfig.ResourceQuotaController,
  140. },
  141. SAController: &SAControllerOptions{
  142. &componentConfig.SAController,
  143. },
  144. TTLAfterFinishedController: &TTLAfterFinishedControllerOptions{
  145. &componentConfig.TTLAfterFinishedController,
  146. },
  147. SecureServing: apiserveroptions.NewSecureServingOptions().WithLoopback(),
  148. InsecureServing: (&apiserveroptions.DeprecatedInsecureServingOptions{
  149. BindAddress: net.ParseIP(componentConfig.Generic.Address),
  150. BindPort: int(componentConfig.Generic.Port),
  151. BindNetwork: "tcp",
  152. }).WithLoopback(),
  153. Authentication: apiserveroptions.NewDelegatingAuthenticationOptions(),
  154. Authorization: apiserveroptions.NewDelegatingAuthorizationOptions(),
  155. }
  156. s.Authentication.RemoteKubeConfigFileOptional = true
  157. s.Authorization.RemoteKubeConfigFileOptional = true
  158. s.Authorization.AlwaysAllowPaths = []string{"/healthz"}
  159. // Set the PairName but leave certificate directory blank to generate in-memory by default
  160. s.SecureServing.ServerCert.CertDirectory = ""
  161. s.SecureServing.ServerCert.PairName = "kube-controller-manager"
  162. s.SecureServing.BindPort = ports.KubeControllerManagerPort
  163. gcIgnoredResources := make([]garbagecollectorconfig.GroupResource, 0, len(garbagecollector.DefaultIgnoredResources()))
  164. for r := range garbagecollector.DefaultIgnoredResources() {
  165. gcIgnoredResources = append(gcIgnoredResources, garbagecollectorconfig.GroupResource{Group: r.Group, Resource: r.Resource})
  166. }
  167. s.GarbageCollectorController.GCIgnoredResources = gcIgnoredResources
  168. return &s, nil
  169. }
  170. // NewDefaultComponentConfig returns kube-controller manager configuration object.
  171. func NewDefaultComponentConfig(insecurePort int32) (kubectrlmgrconfig.KubeControllerManagerConfiguration, error) {
  172. versioned := kubectrlmgrconfigv1alpha1.KubeControllerManagerConfiguration{}
  173. kubectrlmgrconfigscheme.Scheme.Default(&versioned)
  174. internal := kubectrlmgrconfig.KubeControllerManagerConfiguration{}
  175. if err := kubectrlmgrconfigscheme.Scheme.Convert(&versioned, &internal, nil); err != nil {
  176. return internal, err
  177. }
  178. internal.Generic.Port = insecurePort
  179. return internal, nil
  180. }
  181. // Flags returns flags for a specific APIServer by section name
  182. func (s *KubeControllerManagerOptions) Flags(allControllers []string, disabledByDefaultControllers []string) cliflag.NamedFlagSets {
  183. fss := cliflag.NamedFlagSets{}
  184. s.Generic.AddFlags(&fss, allControllers, disabledByDefaultControllers)
  185. s.KubeCloudShared.AddFlags(fss.FlagSet("generic"))
  186. s.ServiceController.AddFlags(fss.FlagSet("service controller"))
  187. s.SecureServing.AddFlags(fss.FlagSet("secure serving"))
  188. s.InsecureServing.AddUnqualifiedFlags(fss.FlagSet("insecure serving"))
  189. s.Authentication.AddFlags(fss.FlagSet("authentication"))
  190. s.Authorization.AddFlags(fss.FlagSet("authorization"))
  191. s.AttachDetachController.AddFlags(fss.FlagSet("attachdetach controller"))
  192. s.CSRSigningController.AddFlags(fss.FlagSet("csrsigning controller"))
  193. s.DeploymentController.AddFlags(fss.FlagSet("deployment controller"))
  194. s.DaemonSetController.AddFlags(fss.FlagSet("daemonset controller"))
  195. s.DeprecatedFlags.AddFlags(fss.FlagSet("deprecated"))
  196. s.EndpointController.AddFlags(fss.FlagSet("endpoint controller"))
  197. s.GarbageCollectorController.AddFlags(fss.FlagSet("garbagecollector controller"))
  198. s.HPAController.AddFlags(fss.FlagSet("horizontalpodautoscaling controller"))
  199. s.JobController.AddFlags(fss.FlagSet("job controller"))
  200. s.NamespaceController.AddFlags(fss.FlagSet("namespace controller"))
  201. s.NodeIPAMController.AddFlags(fss.FlagSet("nodeipam controller"))
  202. s.NodeLifecycleController.AddFlags(fss.FlagSet("nodelifecycle controller"))
  203. s.PersistentVolumeBinderController.AddFlags(fss.FlagSet("persistentvolume-binder controller"))
  204. s.PodGCController.AddFlags(fss.FlagSet("podgc controller"))
  205. s.ReplicaSetController.AddFlags(fss.FlagSet("replicaset controller"))
  206. s.ReplicationController.AddFlags(fss.FlagSet("replicationcontroller"))
  207. s.ResourceQuotaController.AddFlags(fss.FlagSet("resourcequota controller"))
  208. s.SAController.AddFlags(fss.FlagSet("serviceaccount controller"))
  209. s.TTLAfterFinishedController.AddFlags(fss.FlagSet("ttl-after-finished controller"))
  210. fs := fss.FlagSet("misc")
  211. fs.StringVar(&s.Master, "master", s.Master, "The address of the Kubernetes API server (overrides any value in kubeconfig).")
  212. fs.StringVar(&s.Kubeconfig, "kubeconfig", s.Kubeconfig, "Path to kubeconfig file with authorization and master location information.")
  213. utilfeature.DefaultMutableFeatureGate.AddFlag(fss.FlagSet("generic"))
  214. return fss
  215. }
  216. // ApplyTo fills up controller manager config with options.
  217. func (s *KubeControllerManagerOptions) ApplyTo(c *kubecontrollerconfig.Config) error {
  218. if err := s.Generic.ApplyTo(&c.ComponentConfig.Generic); err != nil {
  219. return err
  220. }
  221. if err := s.KubeCloudShared.ApplyTo(&c.ComponentConfig.KubeCloudShared); err != nil {
  222. return err
  223. }
  224. if err := s.AttachDetachController.ApplyTo(&c.ComponentConfig.AttachDetachController); err != nil {
  225. return err
  226. }
  227. if err := s.CSRSigningController.ApplyTo(&c.ComponentConfig.CSRSigningController); err != nil {
  228. return err
  229. }
  230. if err := s.DaemonSetController.ApplyTo(&c.ComponentConfig.DaemonSetController); err != nil {
  231. return err
  232. }
  233. if err := s.DeploymentController.ApplyTo(&c.ComponentConfig.DeploymentController); err != nil {
  234. return err
  235. }
  236. if err := s.DeprecatedFlags.ApplyTo(&c.ComponentConfig.DeprecatedController); err != nil {
  237. return err
  238. }
  239. if err := s.EndpointController.ApplyTo(&c.ComponentConfig.EndpointController); err != nil {
  240. return err
  241. }
  242. if err := s.GarbageCollectorController.ApplyTo(&c.ComponentConfig.GarbageCollectorController); err != nil {
  243. return err
  244. }
  245. if err := s.HPAController.ApplyTo(&c.ComponentConfig.HPAController); err != nil {
  246. return err
  247. }
  248. if err := s.JobController.ApplyTo(&c.ComponentConfig.JobController); err != nil {
  249. return err
  250. }
  251. if err := s.NamespaceController.ApplyTo(&c.ComponentConfig.NamespaceController); err != nil {
  252. return err
  253. }
  254. if err := s.NodeIPAMController.ApplyTo(&c.ComponentConfig.NodeIPAMController); err != nil {
  255. return err
  256. }
  257. if err := s.NodeLifecycleController.ApplyTo(&c.ComponentConfig.NodeLifecycleController); err != nil {
  258. return err
  259. }
  260. if err := s.PersistentVolumeBinderController.ApplyTo(&c.ComponentConfig.PersistentVolumeBinderController); err != nil {
  261. return err
  262. }
  263. if err := s.PodGCController.ApplyTo(&c.ComponentConfig.PodGCController); err != nil {
  264. return err
  265. }
  266. if err := s.ReplicaSetController.ApplyTo(&c.ComponentConfig.ReplicaSetController); err != nil {
  267. return err
  268. }
  269. if err := s.ReplicationController.ApplyTo(&c.ComponentConfig.ReplicationController); err != nil {
  270. return err
  271. }
  272. if err := s.ResourceQuotaController.ApplyTo(&c.ComponentConfig.ResourceQuotaController); err != nil {
  273. return err
  274. }
  275. if err := s.SAController.ApplyTo(&c.ComponentConfig.SAController); err != nil {
  276. return err
  277. }
  278. if err := s.ServiceController.ApplyTo(&c.ComponentConfig.ServiceController); err != nil {
  279. return err
  280. }
  281. if err := s.TTLAfterFinishedController.ApplyTo(&c.ComponentConfig.TTLAfterFinishedController); err != nil {
  282. return err
  283. }
  284. if err := s.InsecureServing.ApplyTo(&c.InsecureServing, &c.LoopbackClientConfig); err != nil {
  285. return err
  286. }
  287. if err := s.SecureServing.ApplyTo(&c.SecureServing, &c.LoopbackClientConfig); err != nil {
  288. return err
  289. }
  290. if s.SecureServing.BindPort != 0 || s.SecureServing.Listener != nil {
  291. if err := s.Authentication.ApplyTo(&c.Authentication, c.SecureServing, nil); err != nil {
  292. return err
  293. }
  294. if err := s.Authorization.ApplyTo(&c.Authorization); err != nil {
  295. return err
  296. }
  297. }
  298. // sync back to component config
  299. // TODO: find more elegant way than syncing back the values.
  300. c.ComponentConfig.Generic.Port = int32(s.InsecureServing.BindPort)
  301. c.ComponentConfig.Generic.Address = s.InsecureServing.BindAddress.String()
  302. return nil
  303. }
  304. // Validate is used to validate the options and config before launching the controller manager
  305. func (s *KubeControllerManagerOptions) Validate(allControllers []string, disabledByDefaultControllers []string) error {
  306. var errs []error
  307. errs = append(errs, s.Generic.Validate(allControllers, disabledByDefaultControllers)...)
  308. errs = append(errs, s.KubeCloudShared.Validate()...)
  309. errs = append(errs, s.AttachDetachController.Validate()...)
  310. errs = append(errs, s.CSRSigningController.Validate()...)
  311. errs = append(errs, s.DaemonSetController.Validate()...)
  312. errs = append(errs, s.DeploymentController.Validate()...)
  313. errs = append(errs, s.DeprecatedFlags.Validate()...)
  314. errs = append(errs, s.EndpointController.Validate()...)
  315. errs = append(errs, s.GarbageCollectorController.Validate()...)
  316. errs = append(errs, s.HPAController.Validate()...)
  317. errs = append(errs, s.JobController.Validate()...)
  318. errs = append(errs, s.NamespaceController.Validate()...)
  319. errs = append(errs, s.NodeIPAMController.Validate()...)
  320. errs = append(errs, s.NodeLifecycleController.Validate()...)
  321. errs = append(errs, s.PersistentVolumeBinderController.Validate()...)
  322. errs = append(errs, s.PodGCController.Validate()...)
  323. errs = append(errs, s.ReplicaSetController.Validate()...)
  324. errs = append(errs, s.ReplicationController.Validate()...)
  325. errs = append(errs, s.ResourceQuotaController.Validate()...)
  326. errs = append(errs, s.SAController.Validate()...)
  327. errs = append(errs, s.ServiceController.Validate()...)
  328. errs = append(errs, s.TTLAfterFinishedController.Validate()...)
  329. errs = append(errs, s.SecureServing.Validate()...)
  330. errs = append(errs, s.InsecureServing.Validate()...)
  331. errs = append(errs, s.Authentication.Validate()...)
  332. errs = append(errs, s.Authorization.Validate()...)
  333. // TODO: validate component config, master and kubeconfig
  334. return utilerrors.NewAggregate(errs)
  335. }
  336. // Config return a controller manager config objective
  337. func (s KubeControllerManagerOptions) Config(allControllers []string, disabledByDefaultControllers []string) (*kubecontrollerconfig.Config, error) {
  338. if err := s.Validate(allControllers, disabledByDefaultControllers); err != nil {
  339. return nil, err
  340. }
  341. if err := s.SecureServing.MaybeDefaultWithSelfSignedCerts("localhost", nil, []net.IP{net.ParseIP("127.0.0.1")}); err != nil {
  342. return nil, fmt.Errorf("error creating self-signed certificates: %v", err)
  343. }
  344. kubeconfig, err := clientcmd.BuildConfigFromFlags(s.Master, s.Kubeconfig)
  345. if err != nil {
  346. return nil, err
  347. }
  348. kubeconfig.ContentConfig.ContentType = s.Generic.ClientConnection.ContentType
  349. kubeconfig.QPS = s.Generic.ClientConnection.QPS
  350. kubeconfig.Burst = int(s.Generic.ClientConnection.Burst)
  351. client, err := clientset.NewForConfig(restclient.AddUserAgent(kubeconfig, KubeControllerManagerUserAgent))
  352. if err != nil {
  353. return nil, err
  354. }
  355. // shallow copy, do not modify the kubeconfig.Timeout.
  356. config := *kubeconfig
  357. config.Timeout = s.Generic.LeaderElection.RenewDeadline.Duration
  358. leaderElectionClient := clientset.NewForConfigOrDie(restclient.AddUserAgent(&config, "leader-election"))
  359. eventRecorder := createRecorder(client, KubeControllerManagerUserAgent)
  360. c := &kubecontrollerconfig.Config{
  361. Client: client,
  362. Kubeconfig: kubeconfig,
  363. EventRecorder: eventRecorder,
  364. LeaderElectionClient: leaderElectionClient,
  365. }
  366. if err := s.ApplyTo(c); err != nil {
  367. return nil, err
  368. }
  369. return c, nil
  370. }
  371. func createRecorder(kubeClient clientset.Interface, userAgent string) record.EventRecorder {
  372. eventBroadcaster := record.NewBroadcaster()
  373. eventBroadcaster.StartLogging(klog.Infof)
  374. eventBroadcaster.StartRecordingToSink(&v1core.EventSinkImpl{Interface: kubeClient.CoreV1().Events("")})
  375. return eventBroadcaster.NewRecorder(clientgokubescheme.Scheme, v1.EventSource{Component: userAgent})
  376. }