Skip to content

Commit dd6bf00

Browse files
committed
🐛 various fixes
modified: controllers/pod_controller.go; modified: controllers/pod_controller_types.go; modified: main.go
1 parent c43099b commit dd6bf00

File tree

3 files changed

+24
-18
lines changed

3 files changed

+24
-18
lines changed

controllers/pod_controller.go

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,13 @@ import (
3535

3636
const (
3737
operatorAnnotation = "auto.request.operator/optimize"
38-
// cacheKeyFunc defines the key function required in TTLStore.
39-
cacheTTL = 60 * time.Second
4038
)
4139

4240
func cacheKeyFunc(obj interface{}) (string, error) {
4341
return obj.(PodRequests).Name, nil
4442
}
4543

46-
var cacheStore = cache.NewTTLStore(cacheKeyFunc, cacheTTL)
44+
var cacheStore = cache.NewStore(cacheKeyFunc)
4745

4846
// Reconcile handles a reconciliation request for a Pod.
4947
// If the Pod has the podHasAnnotation annotation, then Reconcile
@@ -75,7 +73,6 @@ func (r *PodReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.R
7573
}
7674

7775
if (!r.EnableAnnotation) || (r.EnableAnnotation && annotation) {
78-
log.Info("Checking Pod: " + pod.Name + " in namespace " + pod.Namespace)
7976

8077
data, err := r.ClientSet.RESTClient().Get().AbsPath(fmt.Sprintf("apis/metrics.k8s.io/v1beta1/namespaces/%v/pods/%v", pod.Namespace, pod.Name)).DoRaw(ctx)
8178

@@ -94,14 +91,18 @@ func (r *PodReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.R
9491
SumPodRequest.Sample = 0
9592
SumPodRequest.TimeSinceFirstSample = 0
9693
SumPodRequest.Timestamp = time.Now()
94+
log.Info(fmt.Sprint("Adding cache sample ", SumPodRequest.Sample))
9795
addToCache(cacheStore, SumPodRequest)
9896
} else {
9997
if err != nil {
10098
log.Error(err, err.Error())
10199
} else {
102100
SumPodRequest.Sample = LatestPodRequest.Sample + 1
103-
SumPodRequest.TimeSinceFirstSample = int(time.Since(LatestPodRequest.Timestamp).Seconds())
101+
log.Info(fmt.Sprint(time.Now(), LatestPodRequest.Timestamp))
102+
SumPodRequest.TimeSinceFirstSample = time.Since(LatestPodRequest.Timestamp).Seconds()
104103
SumPodRequest.Timestamp = time.Now()
104+
log.Info(fmt.Sprint("Updating cache sample ", SumPodRequest.Sample))
105+
105106
for _, sumC := range SumPodRequest.ContainerRequests {
106107
for _, latestC := range LatestPodRequest.ContainerRequests {
107108
if latestC.Name == sumC.Name {
@@ -111,6 +112,7 @@ func (r *PodReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.R
111112
}
112113
}
113114
}
115+
114116
err := deleteFromCache(cacheStore, LatestPodRequest)
115117
if err != nil {
116118
log.Error(err, err.Error())
@@ -121,11 +123,12 @@ func (r *PodReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.R
121123
}
122124
}
123125
}
124-
126+
log.Info(fmt.Sprint(SumPodRequest))
127+
log.Info(fmt.Sprint(SumPodRequest.TimeSinceFirstSample, ">", r.MinSecondsBetweenPodRestart))
125128
if (SumPodRequest.Sample >= r.SampleSize) && (SumPodRequest.TimeSinceFirstSample >= r.MinSecondsBetweenPodRestart) {
129+
log.Info("Sample Size and Minimum Time have been reached")
126130
PodChange := false
127131
Requests := []NewContainerRequests{}
128-
log.Info(fmt.Sprint(SumPodRequest))
129132
for _, c := range SumPodRequest.ContainerRequests {
130133
AverageUsageCPU := c.CPU / int64(SumPodRequest.Sample)
131134
AverageUsageMemory := c.Memory / int64(SumPodRequest.Sample)
@@ -135,18 +138,22 @@ func (r *PodReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.R
135138
for i, v := range pod.Spec.Containers {
136139
if v.Name == c.Name {
137140
log.Info(c.Name)
138-
log.Info(fmt.Sprint("Comparing CPU: ", fmt.Sprintf("%dm", AverageUsageCPU), " < ", fmt.Sprintf("%dm", currentC.CPU)))
139-
log.Info(fmt.Sprint("Comparing Memory: ", fmt.Sprintf("%dMi", AverageUsageMemory), " < ", fmt.Sprintf("%dMi", currentC.Memory)))
141+
log.Info(fmt.Sprint("Comparing CPU: ", fmt.Sprintf("%dm", AverageUsageCPU), " <> ", fmt.Sprintf("%dm", currentC.CPU)))
142+
log.Info(fmt.Sprint("Comparing Memory: ", fmt.Sprintf("%dMi", AverageUsageMemory), " <> ", fmt.Sprintf("%dMi", currentC.Memory)))
140143
// if AverageUsageCPU < currentC.CPU {
141144
if AverageUsageCPU > 0 {
142-
pod.Spec.Containers[i].Resources.Requests[v1.ResourceCPU] = resource.MustParse(fmt.Sprintf("%dm", AverageUsageCPU))
143-
PodChange = true
145+
if pod.Spec.Containers[i].Resources.Requests != nil {
146+
pod.Spec.Containers[i].Resources.Requests[v1.ResourceCPU] = resource.MustParse(fmt.Sprintf("%dm", AverageUsageCPU))
147+
PodChange = true
148+
}
144149
}
145150
// }
146151
// if AverageUsageMemory < currentC.Memory {
147152
if AverageUsageMemory > 0 {
148-
pod.Spec.Containers[i].Resources.Requests[v1.ResourceMemory] = resource.MustParse(fmt.Sprintf("%dMi", AverageUsageMemory))
149-
PodChange = true
153+
if pod.Spec.Containers[i].Resources.Requests != nil {
154+
pod.Spec.Containers[i].Resources.Requests[v1.ResourceMemory] = resource.MustParse(fmt.Sprintf("%dMi", AverageUsageMemory))
155+
PodChange = true
156+
}
150157
}
151158
// }
152159
Requests = append(Requests, NewContainerRequests{Name: c.Name, Requests: pod.Spec.Containers[i].Resources})

controllers/pod_controller_types.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ type PodReconciler struct {
1919
ClientSet *kubernetes.Clientset
2020
SampleSize int
2121
EnableAnnotation bool
22-
MinSecondsBetweenPodRestart int
22+
MinSecondsBetweenPodRestart float64
2323
}
2424

2525
type PodRequests struct {
2626
Name string
2727
ContainerRequests []ContainerRequests
2828
Sample int
29-
TimeSinceFirstSample int
29+
TimeSinceFirstSample float64
3030
Timestamp time.Time
3131
}
3232

main.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,11 @@ func main() {
5555
var enableAnnotation bool
5656
var probeAddr string
5757
var sampleSize int
58-
var minSecondsBetweenPodRestart int
58+
var minSecondsBetweenPodRestart float64
5959
flag.StringVar(&metricsAddr, "metrics-bind-address", ":8080", "The address the metric endpoint binds to.")
6060
flag.StringVar(&probeAddr, "health-probe-bind-address", ":8081", "The address the probe endpoint binds to.")
6161
flag.IntVar(&sampleSize, "sample-size", 1, "The sample size to create an average from when reconciling.")
62-
flag.IntVar(&sampleSize, "min-seconds", 1, "Minimum seconds between pod restart. "+
62+
flag.Float64Var(&minSecondsBetweenPodRestart, "min-seconds", 1, "Minimum seconds between pod restart. "+
6363
"This ensures the controller will not restart a pod if the minimum time has not passed since it has started sampling it.")
6464
flag.BoolVar(&enableLeaderElection, "leader-elect", false,
6565
"Enable leader election for controller manager. "+
@@ -75,7 +75,6 @@ func main() {
7575
flag.Parse()
7676

7777
ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts)))
78-
7978
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
8079
Scheme: scheme,
8180
MetricsBindAddress: metricsAddr,

0 commit comments

Comments
 (0)