options_test.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  1. /*
  2. Copyright 2017 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
  14. import (
  15. "net"
  16. "reflect"
  17. "sort"
  18. "testing"
  19. "time"
  20. "github.com/spf13/pflag"
  21. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  22. "k8s.io/apimachinery/pkg/util/diff"
  23. apiserveroptions "k8s.io/apiserver/pkg/server/options"
  24. componentbaseconfig "k8s.io/component-base/config"
  25. cmoptions "k8s.io/kubernetes/cmd/controller-manager/app/options"
  26. kubecontrollerconfig "k8s.io/kubernetes/cmd/kube-controller-manager/app/config"
  27. kubectrlmgrconfig "k8s.io/kubernetes/pkg/controller/apis/config"
  28. csrsigningconfig "k8s.io/kubernetes/pkg/controller/certificates/signer/config"
  29. daemonconfig "k8s.io/kubernetes/pkg/controller/daemon/config"
  30. deploymentconfig "k8s.io/kubernetes/pkg/controller/deployment/config"
  31. endpointconfig "k8s.io/kubernetes/pkg/controller/endpoint/config"
  32. endpointsliceconfig "k8s.io/kubernetes/pkg/controller/endpointslice/config"
  33. garbagecollectorconfig "k8s.io/kubernetes/pkg/controller/garbagecollector/config"
  34. jobconfig "k8s.io/kubernetes/pkg/controller/job/config"
  35. namespaceconfig "k8s.io/kubernetes/pkg/controller/namespace/config"
  36. nodeipamconfig "k8s.io/kubernetes/pkg/controller/nodeipam/config"
  37. nodelifecycleconfig "k8s.io/kubernetes/pkg/controller/nodelifecycle/config"
  38. poautosclerconfig "k8s.io/kubernetes/pkg/controller/podautoscaler/config"
  39. podgcconfig "k8s.io/kubernetes/pkg/controller/podgc/config"
  40. replicasetconfig "k8s.io/kubernetes/pkg/controller/replicaset/config"
  41. replicationconfig "k8s.io/kubernetes/pkg/controller/replication/config"
  42. resourcequotaconfig "k8s.io/kubernetes/pkg/controller/resourcequota/config"
  43. serviceconfig "k8s.io/kubernetes/pkg/controller/service/config"
  44. serviceaccountconfig "k8s.io/kubernetes/pkg/controller/serviceaccount/config"
  45. statefulsetconfig "k8s.io/kubernetes/pkg/controller/statefulset/config"
  46. ttlafterfinishedconfig "k8s.io/kubernetes/pkg/controller/ttlafterfinished/config"
  47. attachdetachconfig "k8s.io/kubernetes/pkg/controller/volume/attachdetach/config"
  48. persistentvolumeconfig "k8s.io/kubernetes/pkg/controller/volume/persistentvolume/config"
  49. )
  50. var args = []string{
  51. "--address=192.168.4.10",
  52. "--allocate-node-cidrs=true",
  53. "--attach-detach-reconcile-sync-period=30s",
  54. "--cidr-allocator-type=CloudAllocator",
  55. "--cloud-config=/cloud-config",
  56. "--cloud-provider=gce",
  57. "--cluster-cidr=1.2.3.4/24",
  58. "--cluster-name=k8s",
  59. "--cluster-signing-cert-file=/cluster-signing-cert",
  60. "--cluster-signing-key-file=/cluster-signing-key",
  61. "--concurrent-deployment-syncs=10",
  62. "--concurrent-statefulset-syncs=15",
  63. "--concurrent-endpoint-syncs=10",
  64. "--concurrent-service-endpoint-syncs=10",
  65. "--concurrent-gc-syncs=30",
  66. "--concurrent-namespace-syncs=20",
  67. "--concurrent-replicaset-syncs=10",
  68. "--concurrent-resource-quota-syncs=10",
  69. "--concurrent-service-syncs=2",
  70. "--concurrent-serviceaccount-token-syncs=10",
  71. "--concurrent_rc_syncs=10",
  72. "--configure-cloud-routes=false",
  73. "--contention-profiling=true",
  74. "--controller-start-interval=2m",
  75. "--controllers=foo,bar",
  76. "--deployment-controller-sync-period=45s",
  77. "--disable-attach-detach-reconcile-sync=true",
  78. "--enable-dynamic-provisioning=false",
  79. "--enable-garbage-collector=false",
  80. "--enable-hostpath-provisioner=true",
  81. "--enable-taint-manager=false",
  82. "--experimental-cluster-signing-duration=10h",
  83. "--flex-volume-plugin-dir=/flex-volume-plugin",
  84. "--horizontal-pod-autoscaler-downscale-delay=2m",
  85. "--horizontal-pod-autoscaler-sync-period=45s",
  86. "--horizontal-pod-autoscaler-upscale-delay=1m",
  87. "--horizontal-pod-autoscaler-downscale-stabilization=3m",
  88. "--horizontal-pod-autoscaler-cpu-initialization-period=90s",
  89. "--horizontal-pod-autoscaler-initial-readiness-delay=50s",
  90. "--http2-max-streams-per-connection=47",
  91. "--kube-api-burst=100",
  92. "--kube-api-content-type=application/json",
  93. "--kube-api-qps=50.0",
  94. "--kubeconfig=/kubeconfig",
  95. "--large-cluster-size-threshold=100",
  96. "--leader-elect=false",
  97. "--leader-elect-lease-duration=30s",
  98. "--leader-elect-renew-deadline=15s",
  99. "--leader-elect-resource-lock=configmap",
  100. "--leader-elect-retry-period=5s",
  101. "--master=192.168.4.20",
  102. "--max-endpoints-per-slice=200",
  103. "--min-resync-period=8h",
  104. "--namespace-sync-period=10m",
  105. "--node-cidr-mask-size=48",
  106. "--node-cidr-mask-size-ipv4=48",
  107. "--node-cidr-mask-size-ipv6=108",
  108. "--node-eviction-rate=0.2",
  109. "--node-monitor-grace-period=30s",
  110. "--node-monitor-period=10s",
  111. "--node-startup-grace-period=30s",
  112. "--pod-eviction-timeout=2m",
  113. "--port=10000",
  114. "--profiling=false",
  115. "--pv-recycler-increment-timeout-nfs=45",
  116. "--pv-recycler-minimum-timeout-hostpath=45",
  117. "--pv-recycler-minimum-timeout-nfs=200",
  118. "--pv-recycler-timeout-increment-hostpath=45",
  119. "--pvclaimbinder-sync-period=30s",
  120. "--resource-quota-sync-period=10m",
  121. "--route-reconciliation-period=30s",
  122. "--secondary-node-eviction-rate=0.05",
  123. "--service-account-private-key-file=/service-account-private-key",
  124. "--terminated-pod-gc-threshold=12000",
  125. "--unhealthy-zone-threshold=0.6",
  126. "--use-service-account-credentials=true",
  127. "--cert-dir=/a/b/c",
  128. "--bind-address=192.168.4.21",
  129. "--secure-port=10001",
  130. "--concurrent-ttl-after-finished-syncs=8",
  131. }
  132. func TestAddFlags(t *testing.T) {
  133. fs := pflag.NewFlagSet("addflagstest", pflag.ContinueOnError)
  134. s, _ := NewKubeControllerManagerOptions()
  135. for _, f := range s.Flags([]string{""}, []string{""}).FlagSets {
  136. fs.AddFlagSet(f)
  137. }
  138. fs.Parse(args)
  139. // Sort GCIgnoredResources because it's built from a map, which means the
  140. // insertion order is random.
  141. sort.Sort(sortedGCIgnoredResources(s.GarbageCollectorController.GCIgnoredResources))
  142. expected := &KubeControllerManagerOptions{
  143. Generic: &cmoptions.GenericControllerManagerConfigurationOptions{
  144. GenericControllerManagerConfiguration: &kubectrlmgrconfig.GenericControllerManagerConfiguration{
  145. Port: 10252, // Note: InsecureServingOptions.ApplyTo will write the flag value back into the component config
  146. Address: "0.0.0.0", // Note: InsecureServingOptions.ApplyTo will write the flag value back into the component config
  147. MinResyncPeriod: metav1.Duration{Duration: 8 * time.Hour},
  148. ClientConnection: componentbaseconfig.ClientConnectionConfiguration{
  149. ContentType: "application/json",
  150. QPS: 50.0,
  151. Burst: 100,
  152. },
  153. ControllerStartInterval: metav1.Duration{Duration: 2 * time.Minute},
  154. LeaderElection: componentbaseconfig.LeaderElectionConfiguration{
  155. ResourceLock: "configmap",
  156. LeaderElect: false,
  157. LeaseDuration: metav1.Duration{Duration: 30 * time.Second},
  158. RenewDeadline: metav1.Duration{Duration: 15 * time.Second},
  159. RetryPeriod: metav1.Duration{Duration: 5 * time.Second},
  160. ResourceName: "kube-controller-manager",
  161. ResourceNamespace: "kube-system",
  162. },
  163. Controllers: []string{"foo", "bar"},
  164. },
  165. Debugging: &cmoptions.DebuggingOptions{
  166. DebuggingConfiguration: &componentbaseconfig.DebuggingConfiguration{
  167. EnableProfiling: false,
  168. EnableContentionProfiling: true,
  169. },
  170. },
  171. },
  172. KubeCloudShared: &cmoptions.KubeCloudSharedOptions{
  173. KubeCloudSharedConfiguration: &kubectrlmgrconfig.KubeCloudSharedConfiguration{
  174. UseServiceAccountCredentials: true,
  175. RouteReconciliationPeriod: metav1.Duration{Duration: 30 * time.Second},
  176. NodeMonitorPeriod: metav1.Duration{Duration: 10 * time.Second},
  177. ClusterName: "k8s",
  178. ClusterCIDR: "1.2.3.4/24",
  179. AllocateNodeCIDRs: true,
  180. CIDRAllocatorType: "CloudAllocator",
  181. ConfigureCloudRoutes: false,
  182. },
  183. CloudProvider: &cmoptions.CloudProviderOptions{
  184. CloudProviderConfiguration: &kubectrlmgrconfig.CloudProviderConfiguration{
  185. Name: "gce",
  186. CloudConfigFile: "/cloud-config",
  187. },
  188. },
  189. },
  190. ServiceController: &cmoptions.ServiceControllerOptions{
  191. ServiceControllerConfiguration: &serviceconfig.ServiceControllerConfiguration{
  192. ConcurrentServiceSyncs: 2,
  193. },
  194. },
  195. AttachDetachController: &AttachDetachControllerOptions{
  196. &attachdetachconfig.AttachDetachControllerConfiguration{
  197. ReconcilerSyncLoopPeriod: metav1.Duration{Duration: 30 * time.Second},
  198. DisableAttachDetachReconcilerSync: true,
  199. },
  200. },
  201. CSRSigningController: &CSRSigningControllerOptions{
  202. &csrsigningconfig.CSRSigningControllerConfiguration{
  203. ClusterSigningCertFile: "/cluster-signing-cert",
  204. ClusterSigningKeyFile: "/cluster-signing-key",
  205. ClusterSigningDuration: metav1.Duration{Duration: 10 * time.Hour},
  206. },
  207. },
  208. DaemonSetController: &DaemonSetControllerOptions{
  209. &daemonconfig.DaemonSetControllerConfiguration{
  210. ConcurrentDaemonSetSyncs: 2,
  211. },
  212. },
  213. DeploymentController: &DeploymentControllerOptions{
  214. &deploymentconfig.DeploymentControllerConfiguration{
  215. ConcurrentDeploymentSyncs: 10,
  216. DeploymentControllerSyncPeriod: metav1.Duration{Duration: 45 * time.Second},
  217. },
  218. },
  219. StatefulSetController: &StatefulSetControllerOptions{
  220. &statefulsetconfig.StatefulSetControllerConfiguration{
  221. ConcurrentStatefulSetSyncs: 15,
  222. },
  223. },
  224. DeprecatedFlags: &DeprecatedControllerOptions{
  225. &kubectrlmgrconfig.DeprecatedControllerConfiguration{
  226. DeletingPodsQPS: 0.1,
  227. RegisterRetryCount: 10,
  228. },
  229. },
  230. EndpointController: &EndpointControllerOptions{
  231. &endpointconfig.EndpointControllerConfiguration{
  232. ConcurrentEndpointSyncs: 10,
  233. },
  234. },
  235. EndpointSliceController: &EndpointSliceControllerOptions{
  236. &endpointsliceconfig.EndpointSliceControllerConfiguration{
  237. ConcurrentServiceEndpointSyncs: 10,
  238. MaxEndpointsPerSlice: 200,
  239. },
  240. },
  241. GarbageCollectorController: &GarbageCollectorControllerOptions{
  242. &garbagecollectorconfig.GarbageCollectorControllerConfiguration{
  243. ConcurrentGCSyncs: 30,
  244. GCIgnoredResources: []garbagecollectorconfig.GroupResource{
  245. {Group: "", Resource: "events"},
  246. },
  247. EnableGarbageCollector: false,
  248. },
  249. },
  250. HPAController: &HPAControllerOptions{
  251. &poautosclerconfig.HPAControllerConfiguration{
  252. HorizontalPodAutoscalerSyncPeriod: metav1.Duration{Duration: 45 * time.Second},
  253. HorizontalPodAutoscalerUpscaleForbiddenWindow: metav1.Duration{Duration: 1 * time.Minute},
  254. HorizontalPodAutoscalerDownscaleForbiddenWindow: metav1.Duration{Duration: 2 * time.Minute},
  255. HorizontalPodAutoscalerDownscaleStabilizationWindow: metav1.Duration{Duration: 3 * time.Minute},
  256. HorizontalPodAutoscalerCPUInitializationPeriod: metav1.Duration{Duration: 90 * time.Second},
  257. HorizontalPodAutoscalerInitialReadinessDelay: metav1.Duration{Duration: 50 * time.Second},
  258. HorizontalPodAutoscalerTolerance: 0.1,
  259. HorizontalPodAutoscalerUseRESTClients: true,
  260. },
  261. },
  262. JobController: &JobControllerOptions{
  263. &jobconfig.JobControllerConfiguration{
  264. ConcurrentJobSyncs: 5,
  265. },
  266. },
  267. NamespaceController: &NamespaceControllerOptions{
  268. &namespaceconfig.NamespaceControllerConfiguration{
  269. NamespaceSyncPeriod: metav1.Duration{Duration: 10 * time.Minute},
  270. ConcurrentNamespaceSyncs: 20,
  271. },
  272. },
  273. NodeIPAMController: &NodeIPAMControllerOptions{
  274. &nodeipamconfig.NodeIPAMControllerConfiguration{
  275. NodeCIDRMaskSize: 48,
  276. NodeCIDRMaskSizeIPv4: 48,
  277. NodeCIDRMaskSizeIPv6: 108,
  278. },
  279. },
  280. NodeLifecycleController: &NodeLifecycleControllerOptions{
  281. &nodelifecycleconfig.NodeLifecycleControllerConfiguration{
  282. EnableTaintManager: false,
  283. NodeEvictionRate: 0.2,
  284. SecondaryNodeEvictionRate: 0.05,
  285. NodeMonitorGracePeriod: metav1.Duration{Duration: 30 * time.Second},
  286. NodeStartupGracePeriod: metav1.Duration{Duration: 30 * time.Second},
  287. PodEvictionTimeout: metav1.Duration{Duration: 2 * time.Minute},
  288. LargeClusterSizeThreshold: 100,
  289. UnhealthyZoneThreshold: 0.6,
  290. },
  291. },
  292. PersistentVolumeBinderController: &PersistentVolumeBinderControllerOptions{
  293. &persistentvolumeconfig.PersistentVolumeBinderControllerConfiguration{
  294. PVClaimBinderSyncPeriod: metav1.Duration{Duration: 30 * time.Second},
  295. VolumeConfiguration: persistentvolumeconfig.VolumeConfiguration{
  296. EnableDynamicProvisioning: false,
  297. EnableHostPathProvisioning: true,
  298. FlexVolumePluginDir: "/flex-volume-plugin",
  299. PersistentVolumeRecyclerConfiguration: persistentvolumeconfig.PersistentVolumeRecyclerConfiguration{
  300. MaximumRetry: 3,
  301. MinimumTimeoutNFS: 200,
  302. IncrementTimeoutNFS: 45,
  303. MinimumTimeoutHostPath: 45,
  304. IncrementTimeoutHostPath: 45,
  305. },
  306. },
  307. },
  308. },
  309. PodGCController: &PodGCControllerOptions{
  310. &podgcconfig.PodGCControllerConfiguration{
  311. TerminatedPodGCThreshold: 12000,
  312. },
  313. },
  314. ReplicaSetController: &ReplicaSetControllerOptions{
  315. &replicasetconfig.ReplicaSetControllerConfiguration{
  316. ConcurrentRSSyncs: 10,
  317. },
  318. },
  319. ReplicationController: &ReplicationControllerOptions{
  320. &replicationconfig.ReplicationControllerConfiguration{
  321. ConcurrentRCSyncs: 10,
  322. },
  323. },
  324. ResourceQuotaController: &ResourceQuotaControllerOptions{
  325. &resourcequotaconfig.ResourceQuotaControllerConfiguration{
  326. ResourceQuotaSyncPeriod: metav1.Duration{Duration: 10 * time.Minute},
  327. ConcurrentResourceQuotaSyncs: 10,
  328. },
  329. },
  330. SAController: &SAControllerOptions{
  331. &serviceaccountconfig.SAControllerConfiguration{
  332. ServiceAccountKeyFile: "/service-account-private-key",
  333. ConcurrentSATokenSyncs: 10,
  334. },
  335. },
  336. TTLAfterFinishedController: &TTLAfterFinishedControllerOptions{
  337. &ttlafterfinishedconfig.TTLAfterFinishedControllerConfiguration{
  338. ConcurrentTTLSyncs: 8,
  339. },
  340. },
  341. SecureServing: (&apiserveroptions.SecureServingOptions{
  342. BindPort: 10001,
  343. BindAddress: net.ParseIP("192.168.4.21"),
  344. ServerCert: apiserveroptions.GeneratableKeyCert{
  345. CertDirectory: "/a/b/c",
  346. PairName: "kube-controller-manager",
  347. },
  348. HTTP2MaxStreamsPerConnection: 47,
  349. }).WithLoopback(),
  350. InsecureServing: (&apiserveroptions.DeprecatedInsecureServingOptions{
  351. BindAddress: net.ParseIP("192.168.4.10"),
  352. BindPort: int(10000),
  353. BindNetwork: "tcp",
  354. }).WithLoopback(),
  355. Authentication: &apiserveroptions.DelegatingAuthenticationOptions{
  356. CacheTTL: 10 * time.Second,
  357. ClientCert: apiserveroptions.ClientCertAuthenticationOptions{},
  358. RequestHeader: apiserveroptions.RequestHeaderAuthenticationOptions{
  359. UsernameHeaders: []string{"x-remote-user"},
  360. GroupHeaders: []string{"x-remote-group"},
  361. ExtraHeaderPrefixes: []string{"x-remote-extra-"},
  362. },
  363. RemoteKubeConfigFileOptional: true,
  364. },
  365. Authorization: &apiserveroptions.DelegatingAuthorizationOptions{
  366. AllowCacheTTL: 10 * time.Second,
  367. DenyCacheTTL: 10 * time.Second,
  368. RemoteKubeConfigFileOptional: true,
  369. AlwaysAllowPaths: []string{"/healthz"}, // note: this does not match /healthz/ or /healthz/*
  370. },
  371. Kubeconfig: "/kubeconfig",
  372. Master: "192.168.4.20",
  373. }
  374. // Sort GCIgnoredResources because it's built from a map, which means the
  375. // insertion order is random.
  376. sort.Sort(sortedGCIgnoredResources(expected.GarbageCollectorController.GCIgnoredResources))
  377. if !reflect.DeepEqual(expected, s) {
  378. t.Errorf("Got different run options than expected.\nDifference detected on:\n%s", diff.ObjectReflectDiff(expected, s))
  379. }
  380. }
  381. func TestApplyTo(t *testing.T) {
  382. fs := pflag.NewFlagSet("addflagstest", pflag.ContinueOnError)
  383. s, _ := NewKubeControllerManagerOptions()
  384. // flag set to parse the args that are required to start the kube controller manager
  385. for _, f := range s.Flags([]string{""}, []string{""}).FlagSets {
  386. fs.AddFlagSet(f)
  387. }
  388. fs.Parse(args)
  389. // Sort GCIgnoredResources because it's built from a map, which means the
  390. // insertion order is random.
  391. sort.Sort(sortedGCIgnoredResources(s.GarbageCollectorController.GCIgnoredResources))
  392. expected := &kubecontrollerconfig.Config{
  393. ComponentConfig: kubectrlmgrconfig.KubeControllerManagerConfiguration{
  394. Generic: kubectrlmgrconfig.GenericControllerManagerConfiguration{
  395. Port: 10252, // Note: InsecureServingOptions.ApplyTo will write the flag value back into the component config
  396. Address: "0.0.0.0", // Note: InsecureServingOptions.ApplyTo will write the flag value back into the component config
  397. MinResyncPeriod: metav1.Duration{Duration: 8 * time.Hour},
  398. ClientConnection: componentbaseconfig.ClientConnectionConfiguration{
  399. ContentType: "application/json",
  400. QPS: 50.0,
  401. Burst: 100,
  402. },
  403. ControllerStartInterval: metav1.Duration{Duration: 2 * time.Minute},
  404. LeaderElection: componentbaseconfig.LeaderElectionConfiguration{
  405. ResourceLock: "configmap",
  406. LeaderElect: false,
  407. LeaseDuration: metav1.Duration{Duration: 30 * time.Second},
  408. RenewDeadline: metav1.Duration{Duration: 15 * time.Second},
  409. RetryPeriod: metav1.Duration{Duration: 5 * time.Second},
  410. ResourceName: "kube-controller-manager",
  411. ResourceNamespace: "kube-system",
  412. },
  413. Controllers: []string{"foo", "bar"},
  414. Debugging: componentbaseconfig.DebuggingConfiguration{
  415. EnableProfiling: false,
  416. EnableContentionProfiling: true,
  417. },
  418. },
  419. KubeCloudShared: kubectrlmgrconfig.KubeCloudSharedConfiguration{
  420. UseServiceAccountCredentials: true,
  421. RouteReconciliationPeriod: metav1.Duration{Duration: 30 * time.Second},
  422. NodeMonitorPeriod: metav1.Duration{Duration: 10 * time.Second},
  423. ClusterName: "k8s",
  424. ClusterCIDR: "1.2.3.4/24",
  425. AllocateNodeCIDRs: true,
  426. CIDRAllocatorType: "CloudAllocator",
  427. ConfigureCloudRoutes: false,
  428. CloudProvider: kubectrlmgrconfig.CloudProviderConfiguration{
  429. Name: "gce",
  430. CloudConfigFile: "/cloud-config",
  431. },
  432. },
  433. ServiceController: serviceconfig.ServiceControllerConfiguration{
  434. ConcurrentServiceSyncs: 2,
  435. },
  436. AttachDetachController: attachdetachconfig.AttachDetachControllerConfiguration{
  437. ReconcilerSyncLoopPeriod: metav1.Duration{Duration: 30 * time.Second},
  438. DisableAttachDetachReconcilerSync: true,
  439. },
  440. CSRSigningController: csrsigningconfig.CSRSigningControllerConfiguration{
  441. ClusterSigningCertFile: "/cluster-signing-cert",
  442. ClusterSigningKeyFile: "/cluster-signing-key",
  443. ClusterSigningDuration: metav1.Duration{Duration: 10 * time.Hour},
  444. },
  445. DaemonSetController: daemonconfig.DaemonSetControllerConfiguration{
  446. ConcurrentDaemonSetSyncs: 2,
  447. },
  448. DeploymentController: deploymentconfig.DeploymentControllerConfiguration{
  449. ConcurrentDeploymentSyncs: 10,
  450. DeploymentControllerSyncPeriod: metav1.Duration{Duration: 45 * time.Second},
  451. },
  452. StatefulSetController: statefulsetconfig.StatefulSetControllerConfiguration{
  453. ConcurrentStatefulSetSyncs: 15,
  454. },
  455. DeprecatedController: kubectrlmgrconfig.DeprecatedControllerConfiguration{
  456. DeletingPodsQPS: 0.1,
  457. RegisterRetryCount: 10,
  458. },
  459. EndpointController: endpointconfig.EndpointControllerConfiguration{
  460. ConcurrentEndpointSyncs: 10,
  461. },
  462. EndpointSliceController: endpointsliceconfig.EndpointSliceControllerConfiguration{
  463. ConcurrentServiceEndpointSyncs: 10,
  464. MaxEndpointsPerSlice: 200,
  465. },
  466. GarbageCollectorController: garbagecollectorconfig.GarbageCollectorControllerConfiguration{
  467. ConcurrentGCSyncs: 30,
  468. GCIgnoredResources: []garbagecollectorconfig.GroupResource{
  469. {Group: "", Resource: "events"},
  470. },
  471. EnableGarbageCollector: false,
  472. },
  473. HPAController: poautosclerconfig.HPAControllerConfiguration{
  474. HorizontalPodAutoscalerSyncPeriod: metav1.Duration{Duration: 45 * time.Second},
  475. HorizontalPodAutoscalerUpscaleForbiddenWindow: metav1.Duration{Duration: 1 * time.Minute},
  476. HorizontalPodAutoscalerDownscaleForbiddenWindow: metav1.Duration{Duration: 2 * time.Minute},
  477. HorizontalPodAutoscalerDownscaleStabilizationWindow: metav1.Duration{Duration: 3 * time.Minute},
  478. HorizontalPodAutoscalerCPUInitializationPeriod: metav1.Duration{Duration: 90 * time.Second},
  479. HorizontalPodAutoscalerInitialReadinessDelay: metav1.Duration{Duration: 50 * time.Second},
  480. HorizontalPodAutoscalerTolerance: 0.1,
  481. HorizontalPodAutoscalerUseRESTClients: true,
  482. },
  483. JobController: jobconfig.JobControllerConfiguration{
  484. ConcurrentJobSyncs: 5,
  485. },
  486. NamespaceController: namespaceconfig.NamespaceControllerConfiguration{
  487. NamespaceSyncPeriod: metav1.Duration{Duration: 10 * time.Minute},
  488. ConcurrentNamespaceSyncs: 20,
  489. },
  490. NodeIPAMController: nodeipamconfig.NodeIPAMControllerConfiguration{
  491. NodeCIDRMaskSize: 48,
  492. NodeCIDRMaskSizeIPv4: 48,
  493. NodeCIDRMaskSizeIPv6: 108,
  494. },
  495. NodeLifecycleController: nodelifecycleconfig.NodeLifecycleControllerConfiguration{
  496. EnableTaintManager: false,
  497. NodeEvictionRate: 0.2,
  498. SecondaryNodeEvictionRate: 0.05,
  499. NodeMonitorGracePeriod: metav1.Duration{Duration: 30 * time.Second},
  500. NodeStartupGracePeriod: metav1.Duration{Duration: 30 * time.Second},
  501. PodEvictionTimeout: metav1.Duration{Duration: 2 * time.Minute},
  502. LargeClusterSizeThreshold: 100,
  503. UnhealthyZoneThreshold: 0.6,
  504. },
  505. PersistentVolumeBinderController: persistentvolumeconfig.PersistentVolumeBinderControllerConfiguration{
  506. PVClaimBinderSyncPeriod: metav1.Duration{Duration: 30 * time.Second},
  507. VolumeConfiguration: persistentvolumeconfig.VolumeConfiguration{
  508. EnableDynamicProvisioning: false,
  509. EnableHostPathProvisioning: true,
  510. FlexVolumePluginDir: "/flex-volume-plugin",
  511. PersistentVolumeRecyclerConfiguration: persistentvolumeconfig.PersistentVolumeRecyclerConfiguration{
  512. MaximumRetry: 3,
  513. MinimumTimeoutNFS: 200,
  514. IncrementTimeoutNFS: 45,
  515. MinimumTimeoutHostPath: 45,
  516. IncrementTimeoutHostPath: 45,
  517. },
  518. },
  519. },
  520. PodGCController: podgcconfig.PodGCControllerConfiguration{
  521. TerminatedPodGCThreshold: 12000,
  522. },
  523. ReplicaSetController: replicasetconfig.ReplicaSetControllerConfiguration{
  524. ConcurrentRSSyncs: 10,
  525. },
  526. ReplicationController: replicationconfig.ReplicationControllerConfiguration{
  527. ConcurrentRCSyncs: 10,
  528. },
  529. ResourceQuotaController: resourcequotaconfig.ResourceQuotaControllerConfiguration{
  530. ResourceQuotaSyncPeriod: metav1.Duration{Duration: 10 * time.Minute},
  531. ConcurrentResourceQuotaSyncs: 10,
  532. },
  533. SAController: serviceaccountconfig.SAControllerConfiguration{
  534. ServiceAccountKeyFile: "/service-account-private-key",
  535. ConcurrentSATokenSyncs: 10,
  536. },
  537. TTLAfterFinishedController: ttlafterfinishedconfig.TTLAfterFinishedControllerConfiguration{
  538. ConcurrentTTLSyncs: 8,
  539. },
  540. },
  541. }
  542. // Sort GCIgnoredResources because it's built from a map, which means the
  543. // insertion order is random.
  544. sort.Sort(sortedGCIgnoredResources(expected.ComponentConfig.GarbageCollectorController.GCIgnoredResources))
  545. c := &kubecontrollerconfig.Config{}
  546. s.ApplyTo(c)
  547. if !reflect.DeepEqual(expected.ComponentConfig, c.ComponentConfig) {
  548. t.Errorf("Got different configuration than expected.\nDifference detected on:\n%s", diff.ObjectReflectDiff(expected.ComponentConfig, c.ComponentConfig))
  549. }
  550. }
  551. type sortedGCIgnoredResources []garbagecollectorconfig.GroupResource
  552. func (r sortedGCIgnoredResources) Len() int {
  553. return len(r)
  554. }
  555. func (r sortedGCIgnoredResources) Less(i, j int) bool {
  556. if r[i].Group < r[j].Group {
  557. return true
  558. } else if r[i].Group > r[j].Group {
  559. return false
  560. }
  561. return r[i].Resource < r[j].Resource
  562. }
  563. func (r sortedGCIgnoredResources) Swap(i, j int) {
  564. r[i], r[j] = r[j], r[i]
  565. }