Skip to content

Commit b0a1fd5

Browse files
committed
mark pod with readiness gate as healthy when deleting TGB
1 parent 694a0b1 commit b0a1fd5

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed

pkg/targetgroupbinding/resource_manager.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@ func (m *defaultResourceManager) Cleanup(ctx context.Context, tgb *elbv2api.Targ
9898
if err := m.networkingManager.Cleanup(ctx, tgb); err != nil {
9999
return err
100100
}
101+
if err := m.updatePodAsHealthyForDeletedTGB(ctx, tgb); err != nil {
102+
return err
103+
}
101104
return nil
102105
}
103106

@@ -328,6 +331,66 @@ func (m *defaultResourceManager) updateTargetHealthPodConditionForPod(ctx contex
328331
return needFurtherProbe, nil
329332
}
330333

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+
331394
func (m *defaultResourceManager) deregisterTargets(ctx context.Context, tgARN string, targets []TargetInfo) error {
332395
sdkTargets := make([]elbv2sdk.TargetDescription, 0, len(targets))
333396
for _, target := range targets {

0 commit comments

Comments
 (0)