@@ -98,6 +98,9 @@ func (m *defaultResourceManager) Cleanup(ctx context.Context, tgb *elbv2api.Targ
98
98
if err := m .networkingManager .Cleanup (ctx , tgb ); err != nil {
99
99
return err
100
100
}
101
+ if err := m .updatePodAsHealthyForDeletedTGB (ctx , tgb ); err != nil {
102
+ return err
103
+ }
101
104
return nil
102
105
}
103
106
@@ -328,6 +331,66 @@ func (m *defaultResourceManager) updateTargetHealthPodConditionForPod(ctx contex
328
331
return needFurtherProbe , nil
329
332
}
330
333
334
+ // updatePodAsHealthyForDeletedTGB updates pod's targetHealth condition as healthy when deleting a TGB
335
+ // if the pod has readiness Gate.
336
+ func (m * defaultResourceManager ) updatePodAsHealthyForDeletedTGB (ctx context.Context , tgb * elbv2api.TargetGroupBinding ) error {
337
+ svcKey := buildServiceReferenceKey (tgb , tgb .Spec .ServiceRef )
338
+ targetHealthCondType := BuildTargetHealthPodConditionType (tgb )
339
+ resolveOpts := []backend.EndpointResolveOption {
340
+ backend .WithPodReadinessGate (targetHealthCondType ),
341
+ }
342
+
343
+ var endpoints []backend.PodEndpoint
344
+ var err error
345
+
346
+ // Decide whether to use Endpoints or EndpointSlices based on config flag
347
+ if m .enableEndpointSlices {
348
+ endpoints , _ , err = m .endpointResolver .ResolvePodEndpointsFromSlices (ctx , svcKey , tgb .Spec .ServiceRef .Port , resolveOpts ... )
349
+ } else {
350
+ endpoints , _ , err = m .endpointResolver .ResolvePodEndpoints (ctx , svcKey , tgb .Spec .ServiceRef .Port , resolveOpts ... )
351
+ }
352
+ if err != nil {
353
+ if errors .Is (err , backend .ErrNotFound ) {
354
+ m .eventRecorder .Event (tgb , corev1 .EventTypeWarning , k8s .TargetGroupBindingEventReasonBackendNotFound , err .Error ())
355
+ return m .Cleanup (ctx , tgb )
356
+ }
357
+ return err
358
+ }
359
+
360
+ tgARN := tgb .Spec .TargetGroupARN
361
+ targets , err := m .targetsManager .ListTargets (ctx , tgARN )
362
+ if err != nil {
363
+ return err
364
+ }
365
+ notDrainingTargets , _ := partitionTargetsByDrainingStatus (targets )
366
+ matchedEndpointAndTargets , unmatchedEndpointAndTargets , _ := matchPodEndpointWithTargets (endpoints , notDrainingTargets )
367
+
368
+ var podsToUpdate []k8s.PodInfo
369
+ for _ , endpointAndTarget := range matchedEndpointAndTargets {
370
+ pod := endpointAndTarget .endpoint .Pod
371
+ if pod .HasAnyOfReadinessGates ([]corev1.PodConditionType {targetHealthCondType }) {
372
+ podsToUpdate = append (podsToUpdate , pod )
373
+ }
374
+ }
375
+ for _ , endpoint := range unmatchedEndpointAndTargets {
376
+ pod := endpoint .Pod
377
+ if pod .HasAnyOfReadinessGates ([]corev1.PodConditionType {targetHealthCondType }) {
378
+ podsToUpdate = append (podsToUpdate , pod )
379
+ }
380
+ }
381
+ for _ , pod := range podsToUpdate {
382
+ targetHealth := & elbv2sdk.TargetHealth {
383
+ State : awssdk .String (elbv2sdk .TargetHealthStateEnumHealthy ),
384
+ Description : awssdk .String ("Target Group Binding is deleted" ),
385
+ }
386
+ _ , err := m .updateTargetHealthPodConditionForPod (ctx , pod , targetHealth , targetHealthCondType )
387
+ if err != nil {
388
+ return err
389
+ }
390
+ }
391
+ return nil
392
+ }
393
+
331
394
func (m * defaultResourceManager ) deregisterTargets (ctx context.Context , tgARN string , targets []TargetInfo ) error {
332
395
sdkTargets := make ([]elbv2sdk.TargetDescription , 0 , len (targets ))
333
396
for _ , target := range targets {
0 commit comments