options.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  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. "k8s.io/component-base/metrics"
  31. kubectrlmgrconfigv1alpha1 "k8s.io/kube-controller-manager/config/v1alpha1"
  32. cmoptions "k8s.io/kubernetes/cmd/controller-manager/app/options"
  33. kubecontrollerconfig "k8s.io/kubernetes/cmd/kube-controller-manager/app/config"
  34. kubectrlmgrconfig "k8s.io/kubernetes/pkg/controller/apis/config"
  35. kubectrlmgrconfigscheme "k8s.io/kubernetes/pkg/controller/apis/config/scheme"
  36. "k8s.io/kubernetes/pkg/controller/garbagecollector"
  37. garbagecollectorconfig "k8s.io/kubernetes/pkg/controller/garbagecollector/config"
  38. "k8s.io/kubernetes/pkg/master/ports"
  39. // add the kubernetes feature gates
  40. _ "k8s.io/kubernetes/pkg/features"
  41. "k8s.io/klog"
  42. )
  43. const (
  44. // KubeControllerManagerUserAgent is the userAgent name when starting kube-controller managers.
  45. KubeControllerManagerUserAgent = "kube-controller-manager"
  46. )
  47. // KubeControllerManagerOptions is the main context object for the kube-controller manager.
  48. type KubeControllerManagerOptions struct {
  49. Generic *cmoptions.GenericControllerManagerConfigurationOptions
  50. KubeCloudShared *cmoptions.KubeCloudSharedOptions
  51. ServiceController *cmoptions.ServiceControllerOptions
  52. AttachDetachController *AttachDetachControllerOptions
  53. CSRSigningController *CSRSigningControllerOptions
  54. DaemonSetController *DaemonSetControllerOptions
  55. DeploymentController *DeploymentControllerOptions
  56. StatefulSetController *StatefulSetControllerOptions
  57. DeprecatedFlags *DeprecatedControllerOptions
  58. EndpointController *EndpointControllerOptions
  59. EndpointSliceController *EndpointSliceControllerOptions
  60. GarbageCollectorController *GarbageCollectorControllerOptions
  61. HPAController *HPAControllerOptions
  62. JobController *JobControllerOptions
  63. NamespaceController *NamespaceControllerOptions
  64. NodeIPAMController *NodeIPAMControllerOptions
  65. NodeLifecycleController *NodeLifecycleControllerOptions
  66. PersistentVolumeBinderController *PersistentVolumeBinderControllerOptions
  67. PodGCController *PodGCControllerOptions
  68. ReplicaSetController *ReplicaSetControllerOptions
  69. ReplicationController *ReplicationControllerOptions
  70. ResourceQuotaController *ResourceQuotaControllerOptions
  71. SAController *SAControllerOptions
  72. TTLAfterFinishedController *TTLAfterFinishedControllerOptions
  73. SecureServing *apiserveroptions.SecureServingOptionsWithLoopback
  74. // TODO: remove insecure serving mode
  75. InsecureServing *apiserveroptions.DeprecatedInsecureServingOptionsWithLoopback
  76. Authentication *apiserveroptions.DelegatingAuthenticationOptions
  77. Authorization *apiserveroptions.DelegatingAuthorizationOptions
  78. Master string
  79. Kubeconfig string
  80. ShowHiddenMetricsForVersion string
  81. }
  82. // NewKubeControllerManagerOptions creates a new KubeControllerManagerOptions with a default config.
  83. func NewKubeControllerManagerOptions() (*KubeControllerManagerOptions, error) {
  84. componentConfig, err := NewDefaultComponentConfig(ports.InsecureKubeControllerManagerPort)
  85. if err != nil {
  86. return nil, err
  87. }
  88. s := KubeControllerManagerOptions{
  89. Generic: cmoptions.NewGenericControllerManagerConfigurationOptions(&componentConfig.Generic),
  90. KubeCloudShared: cmoptions.NewKubeCloudSharedOptions(&componentConfig.KubeCloudShared),
  91. ServiceController: &cmoptions.ServiceControllerOptions{
  92. ServiceControllerConfiguration: &componentConfig.ServiceController,
  93. },
  94. AttachDetachController: &AttachDetachControllerOptions{
  95. &componentConfig.AttachDetachController,
  96. },
  97. CSRSigningController: &CSRSigningControllerOptions{
  98. &componentConfig.CSRSigningController,
  99. },
  100. DaemonSetController: &DaemonSetControllerOptions{
  101. &componentConfig.DaemonSetController,
  102. },
  103. DeploymentController: &DeploymentControllerOptions{
  104. &componentConfig.DeploymentController,
  105. },
  106. StatefulSetController: &StatefulSetControllerOptions{
  107. &componentConfig.StatefulSetController,
  108. },
  109. DeprecatedFlags: &DeprecatedControllerOptions{
  110. &componentConfig.DeprecatedController,
  111. },
  112. EndpointController: &EndpointControllerOptions{
  113. &componentConfig.EndpointController,
  114. },
  115. EndpointSliceController: &EndpointSliceControllerOptions{
  116. &componentConfig.EndpointSliceController,
  117. },
  118. GarbageCollectorController: &GarbageCollectorControllerOptions{
  119. &componentConfig.GarbageCollectorController,
  120. },
  121. HPAController: &HPAControllerOptions{
  122. &componentConfig.HPAController,
  123. },
  124. JobController: &JobControllerOptions{
  125. &componentConfig.JobController,
  126. },
  127. NamespaceController: &NamespaceControllerOptions{
  128. &componentConfig.NamespaceController,
  129. },
  130. NodeIPAMController: &NodeIPAMControllerOptions{
  131. &componentConfig.NodeIPAMController,
  132. },
  133. NodeLifecycleController: &NodeLifecycleControllerOptions{
  134. &componentConfig.NodeLifecycleController,
  135. },
  136. PersistentVolumeBinderController: &PersistentVolumeBinderControllerOptions{
  137. &componentConfig.PersistentVolumeBinderController,
  138. },
  139. PodGCController: &PodGCControllerOptions{
  140. &componentConfig.PodGCController,
  141. },
  142. ReplicaSetController: &ReplicaSetControllerOptions{
  143. &componentConfig.ReplicaSetController,
  144. },
  145. ReplicationController: &ReplicationControllerOptions{
  146. &componentConfig.ReplicationController,
  147. },
  148. ResourceQuotaController: &ResourceQuotaControllerOptions{
  149. &componentConfig.ResourceQuotaController,
  150. },
  151. SAController: &SAControllerOptions{
  152. &componentConfig.SAController,
  153. },
  154. TTLAfterFinishedController: &TTLAfterFinishedControllerOptions{
  155. &componentConfig.TTLAfterFinishedController,
  156. },
  157. SecureServing: apiserveroptions.NewSecureServingOptions().WithLoopback(),
  158. InsecureServing: (&apiserveroptions.DeprecatedInsecureServingOptions{
  159. BindAddress: net.ParseIP(componentConfig.Generic.Address),
  160. BindPort: int(componentConfig.Generic.Port),
  161. BindNetwork: "tcp",
  162. }).WithLoopback(),
  163. Authentication: apiserveroptions.NewDelegatingAuthenticationOptions(),
  164. Authorization: apiserveroptions.NewDelegatingAuthorizationOptions(),
  165. }
  166. s.Authentication.RemoteKubeConfigFileOptional = true
  167. s.Authorization.RemoteKubeConfigFileOptional = true
  168. s.Authorization.AlwaysAllowPaths = []string{"/healthz"}
  169. // Set the PairName but leave certificate directory blank to generate in-memory by default
  170. s.SecureServing.ServerCert.CertDirectory = ""
  171. s.SecureServing.ServerCert.PairName = "kube-controller-manager"
  172. s.SecureServing.BindPort = ports.KubeControllerManagerPort
  173. gcIgnoredResources := make([]garbagecollectorconfig.GroupResource, 0, len(garbagecollector.DefaultIgnoredResources()))
  174. for r := range garbagecollector.DefaultIgnoredResources() {
  175. gcIgnoredResources = append(gcIgnoredResources, garbagecollectorconfig.GroupResource{Group: r.Group, Resource: r.Resource})
  176. }
  177. s.GarbageCollectorController.GCIgnoredResources = gcIgnoredResources
  178. s.Generic.LeaderElection.ResourceName = "kube-controller-manager"
  179. s.Generic.LeaderElection.ResourceNamespace = "kube-system"
  180. return &s, nil
  181. }
  182. // NewDefaultComponentConfig returns kube-controller manager configuration object.
  183. func NewDefaultComponentConfig(insecurePort int32) (kubectrlmgrconfig.KubeControllerManagerConfiguration, error) {
  184. versioned := kubectrlmgrconfigv1alpha1.KubeControllerManagerConfiguration{}
  185. kubectrlmgrconfigscheme.Scheme.Default(&versioned)
  186. internal := kubectrlmgrconfig.KubeControllerManagerConfiguration{}
  187. if err := kubectrlmgrconfigscheme.Scheme.Convert(&versioned, &internal, nil); err != nil {
  188. return internal, err
  189. }
  190. internal.Generic.Port = insecurePort
  191. return internal, nil
  192. }
  193. // Flags returns flags for a specific APIServer by section name
  194. func (s *KubeControllerManagerOptions) Flags(allControllers []string, disabledByDefaultControllers []string) cliflag.NamedFlagSets {
  195. fss := cliflag.NamedFlagSets{}
  196. s.Generic.AddFlags(&fss, allControllers, disabledByDefaultControllers)
  197. s.KubeCloudShared.AddFlags(fss.FlagSet("generic"))
  198. s.ServiceController.AddFlags(fss.FlagSet("service controller"))
  199. s.SecureServing.AddFlags(fss.FlagSet("secure serving"))
  200. s.InsecureServing.AddUnqualifiedFlags(fss.FlagSet("insecure serving"))
  201. s.Authentication.AddFlags(fss.FlagSet("authentication"))
  202. s.Authorization.AddFlags(fss.FlagSet("authorization"))
  203. s.AttachDetachController.AddFlags(fss.FlagSet("attachdetach controller"))
  204. s.CSRSigningController.AddFlags(fss.FlagSet("csrsigning controller"))
  205. s.DeploymentController.AddFlags(fss.FlagSet("deployment controller"))
  206. s.StatefulSetController.AddFlags(fss.FlagSet("statefulset controller"))
  207. s.DaemonSetController.AddFlags(fss.FlagSet("daemonset controller"))
  208. s.DeprecatedFlags.AddFlags(fss.FlagSet("deprecated"))
  209. s.EndpointController.AddFlags(fss.FlagSet("endpoint controller"))
  210. s.EndpointSliceController.AddFlags(fss.FlagSet("endpointslice controller"))
  211. s.GarbageCollectorController.AddFlags(fss.FlagSet("garbagecollector controller"))
  212. s.HPAController.AddFlags(fss.FlagSet("horizontalpodautoscaling controller"))
  213. s.JobController.AddFlags(fss.FlagSet("job controller"))
  214. s.NamespaceController.AddFlags(fss.FlagSet("namespace controller"))
  215. s.NodeIPAMController.AddFlags(fss.FlagSet("nodeipam controller"))
  216. s.NodeLifecycleController.AddFlags(fss.FlagSet("nodelifecycle controller"))
  217. s.PersistentVolumeBinderController.AddFlags(fss.FlagSet("persistentvolume-binder controller"))
  218. s.PodGCController.AddFlags(fss.FlagSet("podgc controller"))
  219. s.ReplicaSetController.AddFlags(fss.FlagSet("replicaset controller"))
  220. s.ReplicationController.AddFlags(fss.FlagSet("replicationcontroller"))
  221. s.ResourceQuotaController.AddFlags(fss.FlagSet("resourcequota controller"))
  222. s.SAController.AddFlags(fss.FlagSet("serviceaccount controller"))
  223. s.TTLAfterFinishedController.AddFlags(fss.FlagSet("ttl-after-finished controller"))
  224. fs := fss.FlagSet("misc")
  225. fs.StringVar(&s.Master, "master", s.Master, "The address of the Kubernetes API server (overrides any value in kubeconfig).")
  226. fs.StringVar(&s.Kubeconfig, "kubeconfig", s.Kubeconfig, "Path to kubeconfig file with authorization and master location information.")
  227. utilfeature.DefaultMutableFeatureGate.AddFlag(fss.FlagSet("generic"))
  228. mfs := fss.FlagSet("metrics")
  229. mfs.StringVar(&s.ShowHiddenMetricsForVersion, "show-hidden-metrics-for-version", s.ShowHiddenMetricsForVersion,
  230. "The previous version for which you want to show hidden metrics. "+
  231. "Only the previous minor version is meaningful, other values will not be allowed. "+
  232. "The format is <major>.<minor>, e.g.: '1.16'. "+
  233. "The purpose of this format is make sure you have the opportunity to notice if the next release hides additional metrics, "+
  234. "rather than being surprised when they are permanently removed in the release after that.")
  235. return fss
  236. }
  237. // ApplyTo fills up controller manager config with options.
  238. func (s *KubeControllerManagerOptions) ApplyTo(c *kubecontrollerconfig.Config) error {
  239. if err := s.Generic.ApplyTo(&c.ComponentConfig.Generic); err != nil {
  240. return err
  241. }
  242. if err := s.KubeCloudShared.ApplyTo(&c.ComponentConfig.KubeCloudShared); err != nil {
  243. return err
  244. }
  245. if err := s.AttachDetachController.ApplyTo(&c.ComponentConfig.AttachDetachController); err != nil {
  246. return err
  247. }
  248. if err := s.CSRSigningController.ApplyTo(&c.ComponentConfig.CSRSigningController); err != nil {
  249. return err
  250. }
  251. if err := s.DaemonSetController.ApplyTo(&c.ComponentConfig.DaemonSetController); err != nil {
  252. return err
  253. }
  254. if err := s.DeploymentController.ApplyTo(&c.ComponentConfig.DeploymentController); err != nil {
  255. return err
  256. }
  257. if err := s.StatefulSetController.ApplyTo(&c.ComponentConfig.StatefulSetController); err != nil {
  258. return err
  259. }
  260. if err := s.DeprecatedFlags.ApplyTo(&c.ComponentConfig.DeprecatedController); err != nil {
  261. return err
  262. }
  263. if err := s.EndpointController.ApplyTo(&c.ComponentConfig.EndpointController); err != nil {
  264. return err
  265. }
  266. if err := s.EndpointSliceController.ApplyTo(&c.ComponentConfig.EndpointSliceController); err != nil {
  267. return err
  268. }
  269. if err := s.GarbageCollectorController.ApplyTo(&c.ComponentConfig.GarbageCollectorController); err != nil {
  270. return err
  271. }
  272. if err := s.HPAController.ApplyTo(&c.ComponentConfig.HPAController); err != nil {
  273. return err
  274. }
  275. if err := s.JobController.ApplyTo(&c.ComponentConfig.JobController); err != nil {
  276. return err
  277. }
  278. if err := s.NamespaceController.ApplyTo(&c.ComponentConfig.NamespaceController); err != nil {
  279. return err
  280. }
  281. if err := s.NodeIPAMController.ApplyTo(&c.ComponentConfig.NodeIPAMController); err != nil {
  282. return err
  283. }
  284. if err := s.NodeLifecycleController.ApplyTo(&c.ComponentConfig.NodeLifecycleController); err != nil {
  285. return err
  286. }
  287. if err := s.PersistentVolumeBinderController.ApplyTo(&c.ComponentConfig.PersistentVolumeBinderController); err != nil {
  288. return err
  289. }
  290. if err := s.PodGCController.ApplyTo(&c.ComponentConfig.PodGCController); err != nil {
  291. return err
  292. }
  293. if err := s.ReplicaSetController.ApplyTo(&c.ComponentConfig.ReplicaSetController); err != nil {
  294. return err
  295. }
  296. if err := s.ReplicationController.ApplyTo(&c.ComponentConfig.ReplicationController); err != nil {
  297. return err
  298. }
  299. if err := s.ResourceQuotaController.ApplyTo(&c.ComponentConfig.ResourceQuotaController); err != nil {
  300. return err
  301. }
  302. if err := s.SAController.ApplyTo(&c.ComponentConfig.SAController); err != nil {
  303. return err
  304. }
  305. if err := s.ServiceController.ApplyTo(&c.ComponentConfig.ServiceController); err != nil {
  306. return err
  307. }
  308. if err := s.TTLAfterFinishedController.ApplyTo(&c.ComponentConfig.TTLAfterFinishedController); err != nil {
  309. return err
  310. }
  311. if err := s.InsecureServing.ApplyTo(&c.InsecureServing, &c.LoopbackClientConfig); err != nil {
  312. return err
  313. }
  314. if err := s.SecureServing.ApplyTo(&c.SecureServing, &c.LoopbackClientConfig); err != nil {
  315. return err
  316. }
  317. if s.SecureServing.BindPort != 0 || s.SecureServing.Listener != nil {
  318. if err := s.Authentication.ApplyTo(&c.Authentication, c.SecureServing, nil); err != nil {
  319. return err
  320. }
  321. if err := s.Authorization.ApplyTo(&c.Authorization); err != nil {
  322. return err
  323. }
  324. }
  325. // sync back to component config
  326. // TODO: find more elegant way than syncing back the values.
  327. c.ComponentConfig.Generic.Port = int32(s.InsecureServing.BindPort)
  328. c.ComponentConfig.Generic.Address = s.InsecureServing.BindAddress.String()
  329. return nil
  330. }
  331. // Validate is used to validate the options and config before launching the controller manager
  332. func (s *KubeControllerManagerOptions) Validate(allControllers []string, disabledByDefaultControllers []string) error {
  333. var errs []error
  334. errs = append(errs, s.Generic.Validate(allControllers, disabledByDefaultControllers)...)
  335. errs = append(errs, s.KubeCloudShared.Validate()...)
  336. errs = append(errs, s.AttachDetachController.Validate()...)
  337. errs = append(errs, s.CSRSigningController.Validate()...)
  338. errs = append(errs, s.DaemonSetController.Validate()...)
  339. errs = append(errs, s.DeploymentController.Validate()...)
  340. errs = append(errs, s.StatefulSetController.Validate()...)
  341. errs = append(errs, s.DeprecatedFlags.Validate()...)
  342. errs = append(errs, s.EndpointController.Validate()...)
  343. errs = append(errs, s.EndpointSliceController.Validate()...)
  344. errs = append(errs, s.GarbageCollectorController.Validate()...)
  345. errs = append(errs, s.HPAController.Validate()...)
  346. errs = append(errs, s.JobController.Validate()...)
  347. errs = append(errs, s.NamespaceController.Validate()...)
  348. errs = append(errs, s.NodeIPAMController.Validate()...)
  349. errs = append(errs, s.NodeLifecycleController.Validate()...)
  350. errs = append(errs, s.PersistentVolumeBinderController.Validate()...)
  351. errs = append(errs, s.PodGCController.Validate()...)
  352. errs = append(errs, s.ReplicaSetController.Validate()...)
  353. errs = append(errs, s.ReplicationController.Validate()...)
  354. errs = append(errs, s.ResourceQuotaController.Validate()...)
  355. errs = append(errs, s.SAController.Validate()...)
  356. errs = append(errs, s.ServiceController.Validate()...)
  357. errs = append(errs, s.TTLAfterFinishedController.Validate()...)
  358. errs = append(errs, s.SecureServing.Validate()...)
  359. errs = append(errs, s.InsecureServing.Validate()...)
  360. errs = append(errs, s.Authentication.Validate()...)
  361. errs = append(errs, s.Authorization.Validate()...)
  362. errs = append(errs, metrics.ValidateShowHiddenMetricsVersion(s.ShowHiddenMetricsForVersion)...)
  363. // TODO: validate component config, master and kubeconfig
  364. return utilerrors.NewAggregate(errs)
  365. }
  366. // Config return a controller manager config objective
  367. func (s KubeControllerManagerOptions) Config(allControllers []string, disabledByDefaultControllers []string) (*kubecontrollerconfig.Config, error) {
  368. if err := s.Validate(allControllers, disabledByDefaultControllers); err != nil {
  369. return nil, err
  370. }
  371. if err := s.SecureServing.MaybeDefaultWithSelfSignedCerts("localhost", nil, []net.IP{net.ParseIP("127.0.0.1")}); err != nil {
  372. return nil, fmt.Errorf("error creating self-signed certificates: %v", err)
  373. }
  374. kubeconfig, err := clientcmd.BuildConfigFromFlags(s.Master, s.Kubeconfig)
  375. if err != nil {
  376. return nil, err
  377. }
  378. kubeconfig.DisableCompression = true
  379. kubeconfig.ContentConfig.AcceptContentTypes = s.Generic.ClientConnection.AcceptContentTypes
  380. kubeconfig.ContentConfig.ContentType = s.Generic.ClientConnection.ContentType
  381. kubeconfig.QPS = s.Generic.ClientConnection.QPS
  382. kubeconfig.Burst = int(s.Generic.ClientConnection.Burst)
  383. client, err := clientset.NewForConfig(restclient.AddUserAgent(kubeconfig, KubeControllerManagerUserAgent))
  384. if err != nil {
  385. return nil, err
  386. }
  387. // shallow copy, do not modify the kubeconfig.Timeout.
  388. config := *kubeconfig
  389. config.Timeout = s.Generic.LeaderElection.RenewDeadline.Duration
  390. leaderElectionClient := clientset.NewForConfigOrDie(restclient.AddUserAgent(&config, "leader-election"))
  391. eventRecorder := createRecorder(client, KubeControllerManagerUserAgent)
  392. c := &kubecontrollerconfig.Config{
  393. Client: client,
  394. Kubeconfig: kubeconfig,
  395. EventRecorder: eventRecorder,
  396. LeaderElectionClient: leaderElectionClient,
  397. }
  398. if err := s.ApplyTo(c); err != nil {
  399. return nil, err
  400. }
  401. if len(s.ShowHiddenMetricsForVersion) > 0 {
  402. metrics.SetShowHidden()
  403. }
  404. return c, nil
  405. }
  406. func createRecorder(kubeClient clientset.Interface, userAgent string) record.EventRecorder {
  407. eventBroadcaster := record.NewBroadcaster()
  408. eventBroadcaster.StartLogging(klog.Infof)
  409. eventBroadcaster.StartRecordingToSink(&v1core.EventSinkImpl{Interface: kubeClient.CoreV1().Events("")})
  410. return eventBroadcaster.NewRecorder(clientgokubescheme.Scheme, v1.EventSource{Component: userAgent})
  411. }