@@ -48,7 +48,8 @@ func NewDefaultResourceManager(k8sClient client.Client, elbv2Client services.ELB
4848podInfoRepo k8s.PodInfoRepo , networkingManager networking.NetworkingManager ,
4949vpcInfoProvider networking.VPCInfoProvider , multiClusterManager MultiClusterManager , metricsCollector lbcmetrics.MetricCollector ,
5050vpcID string , failOpenEnabled bool , endpointSliceEnabled bool ,
51- eventRecorder record.EventRecorder , logger logr.Logger ) * defaultResourceManager {
51+ eventRecorder record.EventRecorder , logger logr.Logger , maxTargetsPerInstance int ) * defaultResourceManager {
52+
5253targetsManager := NewCachedTargetsManager (elbv2Client , logger )
5354endpointResolver := backend .NewDefaultEndpointResolver (k8sClient , podInfoRepo , failOpenEnabled , endpointSliceEnabled , logger )
5455return & defaultResourceManager {
@@ -61,6 +62,7 @@ func NewDefaultResourceManager(k8sClient client.Client, elbv2Client services.ELB
6162vpcID : vpcID ,
6263vpcInfoProvider : vpcInfoProvider ,
6364podInfoRepo : podInfoRepo ,
65+ maxTargetsPerInstance : maxTargetsPerInstance ,
6466multiClusterManager : multiClusterManager ,
6567metricsCollector : metricsCollector ,
6668
@@ -83,6 +85,7 @@ type defaultResourceManager struct {
8385logger logr.Logger
8486vpcInfoProvider networking.VPCInfoProvider
8587podInfoRepo k8s.PodInfoRepo
88+ maxTargetsPerInstance int
8689multiClusterManager MultiClusterManager
8790metricsCollector lbcmetrics.MetricCollector
8891vpcID string
@@ -180,6 +183,7 @@ func (m *defaultResourceManager) reconcileWithIPTargetType(ctx context.Context,
180183if err != nil {
181184return "" , "" , false , ctrlerrors .NewErrorWithMetrics (controllerName , "list_targets_error" , err , m .metricsCollector )
182185}
186+ totalTargets := len (targets )
183187
184188notDrainingTargets , _ := partitionTargetsByDrainingStatus (targets )
185189matchedEndpointAndTargets , unmatchedEndpoints , unmatchedTargets := matchPodEndpointWithTargets (endpoints , notDrainingTargets )
@@ -240,6 +244,23 @@ func (m *defaultResourceManager) reconcileWithIPTargetType(ctx context.Context,
240244return "" , "" , false , ctrlerrors .NewErrorWithMetrics (controllerName , "update_tracked_ip_targets_error" , err , m .metricsCollector )
241245}
242246
247+ // Log that we're witholding target additions to prevent exceeding max-targets-per-instance
248+ var limitedUnmatchedEndpoints []backend.PodEndpoint
249+
250+ if m .maxTargetsPerInstance > 0 && len (unmatchedEndpoints ) + totalTargets > m .maxTargetsPerInstance {
251+ maxAdditions := m .maxTargetsPerInstance - totalTargets
252+ if maxAdditions > 0 {
253+ limitedUnmatchedEndpoints = unmatchedEndpoints [:maxAdditions ]
254+ }
255+ tgbScopedLogger .Info ("Limiting target additions due to max-targets-per-instance configuration" ,
256+ "currentTargets" , totalTargets ,
257+ "maxTargetsPerInstance" , m .maxTargetsPerInstance ,
258+ "proposedAdditions" , len (unmatchedEndpoints ),
259+ "numberOmitted" , len (unmatchedEndpoints ) - len (limitedUnmatchedEndpoints ))
260+
261+ unmatchedEndpoints = limitedUnmatchedEndpoints
262+ }
263+
243264if err := m .registerPodEndpoints (ctx , tgb , unmatchedEndpoints ); err != nil {
244265return "" , "" , false , ctrlerrors .NewErrorWithMetrics (controllerName , "register_pod_endpoint_error" , err , m .metricsCollector )
245266}
@@ -307,6 +328,7 @@ func (m *defaultResourceManager) reconcileWithInstanceTargetType(ctx context.Con
307328if err != nil {
308329return "" , "" , false , ctrlerrors .NewErrorWithMetrics (controllerName , "list_targets_error" , err , m .metricsCollector )
309330}
331+ totalTargets := len (targets )
310332
311333notDrainingTargets , _ := partitionTargetsByDrainingStatus (targets )
312334
@@ -341,6 +363,22 @@ func (m *defaultResourceManager) reconcileWithInstanceTargetType(ctx context.Con
341363return "" , "" , false , ctrlerrors .NewErrorWithMetrics (controllerName , "update_tracked_instance_targets_error" , err , m .metricsCollector )
342364}
343365
366+ var limitedUnmatchedEndpoints []backend.NodePortEndpoint
367+
368+ if m .maxTargetsPerInstance > 0 && len (unmatchedEndpoints ) + totalTargets > m .maxTargetsPerInstance {
369+ maxAdditions := m .maxTargetsPerInstance - totalTargets
370+ if maxAdditions > 0 {
371+ limitedUnmatchedEndpoints = unmatchedEndpoints [:maxAdditions ]
372+ }
373+ tgbScopedLogger .Info ("Limiting target additions due to max-targets-per-instance configuration" ,
374+ "currentTargets" , totalTargets ,
375+ "maxTargetsPerInstance" , m .maxTargetsPerInstance ,
376+ "proposedAdditions" , len (unmatchedEndpoints ),
377+ "numberOmitted" , len (unmatchedEndpoints ) - len (limitedUnmatchedEndpoints ))
378+
379+ unmatchedEndpoints = limitedUnmatchedEndpoints
380+ }
381+
344382if err := m .registerNodePortEndpoints (ctx , tgb , unmatchedEndpoints ); err != nil {
345383return "" , "" , false , ctrlerrors .NewErrorWithMetrics (controllerName , "update_node_port_endpoints_error" , err , m .metricsCollector )
346384}
0 commit comments