...
1
16
17
18
19
20 package app
21
22 import (
23 "context"
24
25 "k8s.io/client-go/dynamic"
26 "k8s.io/client-go/scale"
27 "k8s.io/controller-manager/controller"
28 "k8s.io/kubernetes/cmd/kube-controller-manager/names"
29 "k8s.io/kubernetes/pkg/controller/podautoscaler"
30 "k8s.io/kubernetes/pkg/controller/podautoscaler/metrics"
31
32 resourceclient "k8s.io/metrics/pkg/client/clientset/versioned/typed/metrics/v1beta1"
33 "k8s.io/metrics/pkg/client/custom_metrics"
34 "k8s.io/metrics/pkg/client/external_metrics"
35 )
36
37 func newHorizontalPodAutoscalerControllerDescriptor() *ControllerDescriptor {
38 return &ControllerDescriptor{
39 name: names.HorizontalPodAutoscalerController,
40 aliases: []string{"horizontalpodautoscaling"},
41 initFunc: startHorizontalPodAutoscalerControllerWithRESTClient,
42 }
43 }
44
45 func startHorizontalPodAutoscalerControllerWithRESTClient(ctx context.Context, controllerContext ControllerContext, controllerName string) (controller.Interface, bool, error) {
46
47 clientConfig := controllerContext.ClientBuilder.ConfigOrDie("horizontal-pod-autoscaler")
48 hpaClient := controllerContext.ClientBuilder.ClientOrDie("horizontal-pod-autoscaler")
49
50 apiVersionsGetter := custom_metrics.NewAvailableAPIsGetter(hpaClient.Discovery())
51
52
53 go custom_metrics.PeriodicallyInvalidate(
54 apiVersionsGetter,
55 controllerContext.ComponentConfig.HPAController.HorizontalPodAutoscalerSyncPeriod.Duration,
56 ctx.Done())
57
58 metricsClient := metrics.NewRESTMetricsClient(
59 resourceclient.NewForConfigOrDie(clientConfig),
60 custom_metrics.NewForConfig(clientConfig, controllerContext.RESTMapper, apiVersionsGetter),
61 external_metrics.NewForConfigOrDie(clientConfig),
62 )
63 return startHPAControllerWithMetricsClient(ctx, controllerContext, metricsClient)
64 }
65
66 func startHPAControllerWithMetricsClient(ctx context.Context, controllerContext ControllerContext, metricsClient metrics.MetricsClient) (controller.Interface, bool, error) {
67
68 hpaClient := controllerContext.ClientBuilder.ClientOrDie("horizontal-pod-autoscaler")
69 hpaClientConfig := controllerContext.ClientBuilder.ConfigOrDie("horizontal-pod-autoscaler")
70
71
72
73 scaleKindResolver := scale.NewDiscoveryScaleKindResolver(hpaClient.Discovery())
74 scaleClient, err := scale.NewForConfig(hpaClientConfig, controllerContext.RESTMapper, dynamic.LegacyAPIPathResolverFunc, scaleKindResolver)
75 if err != nil {
76 return nil, false, err
77 }
78
79 go podautoscaler.NewHorizontalController(
80 ctx,
81 hpaClient.CoreV1(),
82 scaleClient,
83 hpaClient.AutoscalingV2(),
84 controllerContext.RESTMapper,
85 metricsClient,
86 controllerContext.InformerFactory.Autoscaling().V2().HorizontalPodAutoscalers(),
87 controllerContext.InformerFactory.Core().V1().Pods(),
88 controllerContext.ComponentConfig.HPAController.HorizontalPodAutoscalerSyncPeriod.Duration,
89 controllerContext.ComponentConfig.HPAController.HorizontalPodAutoscalerDownscaleStabilizationWindow.Duration,
90 controllerContext.ComponentConfig.HPAController.HorizontalPodAutoscalerTolerance,
91 controllerContext.ComponentConfig.HPAController.HorizontalPodAutoscalerCPUInitializationPeriod.Duration,
92 controllerContext.ComponentConfig.HPAController.HorizontalPodAutoscalerInitialReadinessDelay.Duration,
93 ).Run(ctx, int(controllerContext.ComponentConfig.HPAController.ConcurrentHorizontalPodAutoscalerSyncs))
94 return nil, true, nil
95 }
96
View as plain text