Skip to content

Commit cceb1bc

Browse files
⚡ improve performance and make it customizable (#19)
1 parent 713b2f8 commit cceb1bc

File tree

7 files changed

+52
-45
lines changed

7 files changed

+52
-45
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ minCPU: 0
4545
cpuFactor: 1
4646
memoryFactor: 1
4747
logLevel: info
48+
concurrentWorkers: 100
4849
```
4950
## Prerequisites
5051
- The metrics server must be deployed in your cluster. Read more about [Metrics Server](https://github.com/kubernetes-sigs/metrics-server). This controller uses the **metrics.k8s.io** extension API group (apis/metrics.k8s.io/v1beta1)
@@ -98,6 +99,9 @@ logLevel: info
9899

99100
--memory-factor float (default 1)
100101
A factor to multiply Memory requests when reconciling.
102+
103+
--concurrent-workers (default 100)
104+
How many pods to sample in parallel. This may affect the controller's stability.
101105
```
102106

103107
### Annotations

charts/kube-reqsizer/Chart.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@ type: application
1313
# This is the chart version. This version number should be incremented each time you make changes
1414
# to the chart and its templates, including the app version.
1515
# Versions are expected to follow Semantic Versioning (https://semver.org/)
16-
version: 0.6.7
16+
version: 0.8.0

charts/kube-reqsizer/templates/deployment.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ spec:
3636
- --min-memory={{.Values.minMemory}}
3737
- --cpu-factor={{.Values.cpuFactor}}
3838
- --memory-factor={{.Values.memoryFactor}}
39+
- --concurrent-workers={{.Values.concurrentWorkers}}
3940
resources:
4041
{{- toYaml .Values.controllerManager.manager.resources | nindent 10 }}
4142
command:

charts/kube-reqsizer/values.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ minCPU: 0
1010
cpuFactor: 1
1111
memoryFactor: 1
1212
logLevel: info
13+
concurrentWorkers: 100
14+
1315

1416
controllerManager:
1517
manager:

controllers/pod_controller.go

Lines changed: 37 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -99,51 +99,47 @@ func (r *PodReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.R
9999
addToCache(cacheStore, SumPodRequest)
100100
log.Info(fmt.Sprint("Items in Cache: ", len(cacheStore.List())))
101101
} else {
102-
if err != nil {
103-
log.Error(err, err.Error())
104-
} else {
105-
SumPodRequest.Sample = LatestPodRequest.Sample + 1
106-
if LatestPodRequest.Sample == 1 {
107-
SumPodRequest.Timestamp = time.Now()
108-
LatestPodRequest.Timestamp = SumPodRequest.Timestamp
109-
}
110-
log.Info(fmt.Sprint(time.Now(), LatestPodRequest.Timestamp))
111-
SumPodRequest.TimeSinceFirstSample = time.Since(LatestPodRequest.Timestamp).Seconds()
112-
113-
log.Info(fmt.Sprint("Updating cache sample ", SumPodRequest.Sample))
114-
115-
for _, sumC := range SumPodRequest.ContainerRequests {
116-
for _, latestC := range LatestPodRequest.ContainerRequests {
117-
if latestC.Name == sumC.Name {
118-
sumCAddr := &sumC
119-
if latestC.CPU > 0 {
120-
sumCAddr.MaxCPU = int64(math.Max(float64(sumCAddr.MaxCPU), float64(latestC.CPU)))
121-
sumCAddr.MinCPU = int64(math.Min(float64(sumCAddr.MinCPU), float64(latestC.CPU)))
122-
} else {
123-
// sumCAddr.MaxCPU = latestC.CPU
124-
sumCAddr.MinCPU = 1
125-
}
126-
if latestC.Memory > 0 {
127-
sumCAddr.MaxMemory = int64(math.Max(float64(sumCAddr.MaxMemory), float64(latestC.Memory)))
128-
sumCAddr.MinMemory = int64(math.Min(float64(sumCAddr.MinMemory), float64(latestC.Memory)))
129-
} else {
130-
// sumCAddr.MaxMemory = latestC.Memory
131-
sumCAddr.MinMemory = 1
132-
}
133-
sumCAddr.CPU += latestC.CPU
134-
sumCAddr.Memory += latestC.Memory
102+
103+
SumPodRequest.Sample = LatestPodRequest.Sample + 1
104+
if LatestPodRequest.Sample == 1 {
105+
SumPodRequest.Timestamp = time.Now()
106+
LatestPodRequest.Timestamp = SumPodRequest.Timestamp
107+
}
108+
log.Info(fmt.Sprint(time.Now(), LatestPodRequest.Timestamp))
109+
SumPodRequest.TimeSinceFirstSample = time.Since(LatestPodRequest.Timestamp).Seconds()
110+
111+
log.Info(fmt.Sprint("Updating cache sample ", SumPodRequest.Sample))
112+
113+
for _, sumC := range SumPodRequest.ContainerRequests {
114+
for _, latestC := range LatestPodRequest.ContainerRequests {
115+
if latestC.Name == sumC.Name {
116+
sumCAddr := &sumC
117+
if latestC.CPU > 0 {
118+
sumCAddr.MaxCPU = int64(math.Max(float64(sumCAddr.MaxCPU), float64(latestC.CPU)))
119+
sumCAddr.MinCPU = int64(math.Min(float64(sumCAddr.MinCPU), float64(latestC.CPU)))
120+
} else {
121+
// sumCAddr.MaxCPU = latestC.CPU
122+
sumCAddr.MinCPU = 1
123+
}
124+
if latestC.Memory > 0 {
125+
sumCAddr.MaxMemory = int64(math.Max(float64(sumCAddr.MaxMemory), float64(latestC.Memory)))
126+
sumCAddr.MinMemory = int64(math.Min(float64(sumCAddr.MinMemory), float64(latestC.Memory)))
127+
} else {
128+
// sumCAddr.MaxMemory = latestC.Memory
129+
sumCAddr.MinMemory = 1
135130
}
131+
sumCAddr.CPU += latestC.CPU
132+
sumCAddr.Memory += latestC.Memory
136133
}
137134
}
135+
}
138136

139-
err := deleteFromCache(cacheStore, LatestPodRequest)
140-
if err != nil {
141-
log.Error(err, err.Error())
142-
}
143-
err = addToCache(cacheStore, SumPodRequest)
144-
if err != nil {
145-
log.Error(err, err.Error())
146-
}
137+
if err := deleteFromCache(cacheStore, LatestPodRequest); err != nil {
138+
log.Error(err, err.Error())
139+
}
140+
141+
if err = addToCache(cacheStore, SumPodRequest); err != nil {
142+
log.Error(err, err.Error())
147143
}
148144
}
149145
log.Info(fmt.Sprint(SumPodRequest))

controllers/pod_controller_functions.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,11 @@ func UpdatePodController(podspec *corev1.PodSpec, Requests []NewContainerRequest
9494
}
9595

9696
// SetupWithManager sets up the controller with the Manager.
97-
func (r *PodReconciler) SetupWithManager(mgr ctrl.Manager) error {
97+
func (r *PodReconciler) SetupWithManager(mgr ctrl.Manager, concurrentWorkers uint) error {
9898
return ctrl.NewControllerManagedBy(mgr).
9999
WithOptions(controller.Options{
100-
MaxConcurrentReconciles: 4,
100+
MaxConcurrentReconciles: int(concurrentWorkers),
101+
RecoverPanic: true,
101102
}).
102103
For(&corev1.Pod{}).
103104
Complete(r)

main.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ func main() {
6262
var maxCPU int64
6363
var minMemory int64
6464
var minCPU int64
65+
var concurrentWorkers uint
6566

6667
var cpuFactor float64
6768
var memoryFactor float64
@@ -73,6 +74,8 @@ func main() {
7374
flag.Float64Var(&cpuFactor, "cpu-factor", 1, "A factor to multiply CPU requests when reconciling. 1 By default.")
7475
flag.Float64Var(&memoryFactor, "memory-factor", 1, "A factor to multiply Memory requests when reconciling. 1 By default.")
7576

77+
flag.UintVar(&concurrentWorkers, "concurrent-workers", 100, "How many pods to sample in parallel. This may affect the controller's stability.")
78+
7679
flag.Int64Var(&minMemory, "min-memory", 0, "Minimum memory in (Mi) that the controller can set a pod request to. 0 is infinite")
7780
flag.Int64Var(&minCPU, "min-cpu", 0, "Minimum CPU in (m) that the controller can set a pod request to. 0 is infinite")
7881

@@ -140,7 +143,7 @@ func main() {
140143
MinCPU: minCPU,
141144
CPUFactor: cpuFactor,
142145
MemoryFactor: memoryFactor,
143-
}).SetupWithManager(mgr); err != nil {
146+
}).SetupWithManager(mgr, concurrentWorkers); err != nil {
144147
setupLog.Error(err, "unable to create controller", "controller", "Pod")
145148
log.Error(err, err.Error())
146149
os.Exit(1)

0 commit comments

Comments
 (0)