@@ -55,7 +55,7 @@ const (
55
55
DefaultRecommenderName = "default"
56
56
)
57
57
58
- // ClusterStateFeeder can update state of ClusterState object.
58
+ // ClusterStateFeeder can update state of clusterState object.
59
59
type ClusterStateFeeder interface {
60
60
// InitFromHistoryProvider loads historical pod spec into clusterState.
61
61
InitFromHistoryProvider (historyProvider history.HistoryProvider )
@@ -78,7 +78,7 @@ type ClusterStateFeeder interface {
78
78
79
79
// ClusterStateFeederFactory makes instances of ClusterStateFeeder.
80
80
type ClusterStateFeederFactory struct {
81
- ClusterState * model.ClusterState
81
+ ClusterState model.ClusterState
82
82
KubeClient kube_client.Interface
83
83
MetricsClient metrics.MetricsClient
84
84
VpaCheckpointClient vpa_api.VerticalPodAutoscalerCheckpointsGetter
@@ -202,7 +202,7 @@ type clusterStateFeeder struct {
202
202
oomChan <- chan oom.OomInfo
203
203
vpaCheckpointClient vpa_api.VerticalPodAutoscalerCheckpointsGetter
204
204
vpaLister vpa_lister.VerticalPodAutoscalerLister
205
- clusterState * model.ClusterState
205
+ clusterState model.ClusterState
206
206
selectorFetcher target.VpaTargetSelectorFetcher
207
207
memorySaveMode bool
208
208
controllerFetcher controllerfetcher.ControllerFetcher
@@ -244,7 +244,7 @@ func (feeder *clusterStateFeeder) InitFromHistoryProvider(historyProvider histor
244
244
245
245
func (feeder * clusterStateFeeder ) setVpaCheckpoint (checkpoint * vpa_types.VerticalPodAutoscalerCheckpoint ) error {
246
246
vpaID := model.VpaID {Namespace : checkpoint .Namespace , VpaName : checkpoint .Spec .VPAObjectName }
247
- vpa , exists := feeder .clusterState .Vpas [vpaID ]
247
+ vpa , exists := feeder .clusterState .VPAs () [vpaID ]
248
248
if ! exists {
249
249
return fmt .Errorf ("cannot load checkpoint to missing VPA object %s/%s" , vpaID .Namespace , vpaID .VpaName )
250
250
}
@@ -263,7 +263,7 @@ func (feeder *clusterStateFeeder) InitFromCheckpoints() {
263
263
feeder .LoadVPAs (context .TODO ())
264
264
265
265
namespaces := make (map [string ]bool )
266
- for _ , v := range feeder .clusterState .Vpas {
266
+ for _ , v := range feeder .clusterState .VPAs () {
267
267
namespaces [v .ID .Namespace ] = true
268
268
}
269
269
@@ -431,23 +431,23 @@ func (feeder *clusterStateFeeder) LoadVPAs(ctx context.Context) {
431
431
432
432
for _ , condition := range conditions {
433
433
if condition .delete {
434
- delete (feeder .clusterState .Vpas [vpaID ].Conditions , condition .conditionType )
434
+ delete (feeder .clusterState .VPAs () [vpaID ].Conditions , condition .conditionType )
435
435
} else {
436
- feeder .clusterState .Vpas [vpaID ].Conditions .Set (condition .conditionType , true , "" , condition .message )
436
+ feeder .clusterState .VPAs () [vpaID ].Conditions .Set (condition .conditionType , true , "" , condition .message )
437
437
}
438
438
}
439
439
}
440
440
}
441
441
// Delete non-existent VPAs from the model.
442
- for vpaID := range feeder .clusterState .Vpas {
442
+ for vpaID := range feeder .clusterState .VPAs () {
443
443
if _ , exists := vpaKeys [vpaID ]; ! exists {
444
444
klog .V (3 ).InfoS ("Deleting VPA" , "vpa" , klog .KRef (vpaID .Namespace , vpaID .VpaName ))
445
445
if err := feeder .clusterState .DeleteVpa (vpaID ); err != nil {
446
446
klog .ErrorS (err , "Deleting VPA failed" , "vpa" , klog .KRef (vpaID .Namespace , vpaID .VpaName ))
447
447
}
448
448
}
449
449
}
450
- feeder .clusterState .ObservedVpas = vpaCRDs
450
+ feeder .clusterState .SetObservedVPAs ( vpaCRDs )
451
451
}
452
452
453
453
// LoadPods loads pod into the cluster state.
@@ -460,7 +460,7 @@ func (feeder *clusterStateFeeder) LoadPods() {
460
460
for _ , spec := range podSpecs {
461
461
pods [spec .ID ] = spec
462
462
}
463
- for key := range feeder .clusterState .Pods {
463
+ for key := range feeder .clusterState .Pods () {
464
464
if _ , exists := pods [key ]; ! exists {
465
465
klog .V (3 ).InfoS ("Deleting Pod" , "pod" , klog .KRef (key .Namespace , key .PodName ))
466
466
feeder .clusterState .DeletePod (key )
@@ -476,6 +476,11 @@ func (feeder *clusterStateFeeder) LoadPods() {
476
476
klog .V (0 ).InfoS ("Failed to add container" , "container" , container .ID , "error" , err )
477
477
}
478
478
}
479
+ for _ , initContainer := range pod .InitContainers {
480
+ podInitContainers := feeder .clusterState .Pods ()[pod .ID ].InitContainers
481
+ feeder .clusterState .Pods ()[pod .ID ].InitContainers = append (podInitContainers , initContainer .ID .ContainerName )
482
+
483
+ }
479
484
}
480
485
}
481
486
@@ -488,6 +493,12 @@ func (feeder *clusterStateFeeder) LoadRealTimeMetrics() {
488
493
sampleCount := 0
489
494
droppedSampleCount := 0
490
495
for _ , containerMetrics := range containersMetrics {
496
+ podInitContainers := feeder .clusterState .Pods ()[containerMetrics .ID .PodID ].InitContainers
497
+ if slices .Contains (podInitContainers , containerMetrics .ID .ContainerName ) {
498
+ klog .V (3 ).InfoS ("Skipping metric samples for init container" , "pod" , klog .KRef (containerMetrics .ID .PodID .Namespace , containerMetrics .ID .PodID .PodName ), "container" , containerMetrics .ID .ContainerName )
499
+ droppedSampleCount += len (containerMetrics .Usage )
500
+ continue
501
+ }
491
502
for _ , sample := range newContainerUsageSamplesWithKey (containerMetrics ) {
492
503
if err := feeder .clusterState .AddSample (sample ); err != nil {
493
504
// Not all pod states are tracked in memory saver mode
@@ -518,7 +529,7 @@ Loop:
518
529
}
519
530
520
531
func (feeder * clusterStateFeeder ) matchesVPA (pod * spec.BasicPodSpec ) bool {
521
- for vpaKey , vpa := range feeder .clusterState .Vpas {
532
+ for vpaKey , vpa := range feeder .clusterState .VPAs () {
522
533
podLabels := labels .Set (pod .PodLabels )
523
534
if vpaKey .Namespace == pod .ID .Namespace && vpa .PodSelector .Matches (podLabels ) {
524
535
return true
0 commit comments