forked from openshift/origin
-
Notifications
You must be signed in to change notification settings - Fork 1
/
autoscaling.go
72 lines (62 loc) · 2.51 KB
/
autoscaling.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package controller
import (
apimeta "k8s.io/apimachinery/pkg/api/meta"
"k8s.io/client-go/discovery"
discocache "k8s.io/client-go/discovery/cached"
"k8s.io/client-go/dynamic"
kubeclientset "k8s.io/client-go/kubernetes"
"k8s.io/client-go/scale"
hpacontroller "k8s.io/kubernetes/pkg/controller/podautoscaler"
hpametrics "k8s.io/kubernetes/pkg/controller/podautoscaler/metrics"
"github.com/openshift/origin/pkg/cmd/server/bootstrappolicy"
)
// NB: this is funky -- it's actually a Kubernetes controller, but we run it as an OpenShift controller in order
// to get a handle on OpenShift clients, so that our delegating scales getter can work.
// TODO this goes away with a truly generic autoscaler
func RunHorizontalPodAutoscalerController(originCtx ControllerContext) (bool, error) {
heapsterNamespace := bootstrappolicy.DefaultOpenShiftInfraNamespace
hpaClientConfig, err := originCtx.ClientBuilder.Config(bootstrappolicy.InfraHorizontalPodAutoscalerControllerServiceAccountName)
if err != nil {
return true, err
}
hpaClient, err := kubeclientset.NewForConfig(hpaClientConfig)
if err != nil {
return false, err
}
metricsClient := hpametrics.NewHeapsterMetricsClient(
hpaClient,
heapsterNamespace,
"https",
"heapster",
"",
)
replicaCalc := hpacontroller.NewReplicaCalculator(
metricsClient,
hpaClient.CoreV1(),
0.1, // this is the default
)
// TODO: we need something like deferred discovery REST mapper that calls invalidate
// on cache misses.
cachedDiscovery := discocache.NewMemCacheClient(hpaClient.Discovery())
restMapper := discovery.NewDeferredDiscoveryRESTMapper(cachedDiscovery, apimeta.InterfacesForUnstructured)
restMapper.Reset()
// we don't use cached discovery because DiscoveryScaleKindResolver does its own caching,
// so we want to re-fetch every time when we actually ask for it
scaleKindResolver := scale.NewDiscoveryScaleKindResolver(hpaClient.Discovery())
scaleClient, err := scale.NewForConfig(hpaClientConfig, restMapper, dynamic.LegacyAPIPathResolverFunc, scaleKindResolver)
if err != nil {
return false, err
}
go hpacontroller.NewHorizontalController(
hpaClient.CoreV1(),
scaleClient,
hpaClient.AutoscalingV1(),
restMapper,
replicaCalc,
originCtx.ExternalKubeInformers.Autoscaling().V1().HorizontalPodAutoscalers(),
originCtx.OpenshiftControllerConfig.HPA.SyncPeriod.Duration,
originCtx.OpenshiftControllerConfig.HPA.UpscaleForbiddenWindow.Duration,
originCtx.OpenshiftControllerConfig.HPA.DownscaleForbiddenWindow.Duration,
).Run(originCtx.Stop)
return true, nil
}