@@ -2,7 +2,6 @@ package targetgroupbinding
22
33import  (
44"context" 
5- "encoding/json" 
65"fmt" 
76"net/netip" 
87"time" 
@@ -17,9 +16,7 @@ import (
1716corev1 "k8s.io/api/core/v1" 
1817apierrors "k8s.io/apimachinery/pkg/api/errors" 
1918metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 
20- "k8s.io/apimachinery/pkg/types" 
2119"k8s.io/apimachinery/pkg/util/sets" 
22- "k8s.io/apimachinery/pkg/util/strategicpatch" 
2320elbv2api "sigs.k8s.io/aws-load-balancer-controller/apis/elbv2/v1beta1" 
2421"sigs.k8s.io/aws-load-balancer-controller/pkg/aws/services" 
2522"sigs.k8s.io/aws-load-balancer-controller/pkg/backend" 
@@ -290,9 +287,9 @@ func (m *defaultResourceManager) updateTargetHealthPodConditionForPod(ctx contex
290287}
291288needFurtherProbe  :=  targetHealthCondStatus  !=  corev1 .ConditionTrue 
292289
293- existingTargetHealthCond , exists  :=  pod .GetPodCondition (targetHealthCondType )
290+ existingTargetHealthCond , hasExistingTargetHealthCond  :=  pod .GetPodCondition (targetHealthCondType )
294291// we skip patch pod if it matches current computed status/reason/message. 
295- if  exists  && 
292+ if  hasExistingTargetHealthCond  && 
296293existingTargetHealthCond .Status  ==  targetHealthCondStatus  && 
297294existingTargetHealthCond .Reason  ==  reason  && 
298295existingTargetHealthCond .Message  ==  message  {
@@ -305,22 +302,30 @@ func (m *defaultResourceManager) updateTargetHealthPodConditionForPod(ctx contex
305302Reason : reason ,
306303Message : message ,
307304}
308- if  ! exists  ||  existingTargetHealthCond .Status  !=  targetHealthCondStatus  {
305+ if  ! hasExistingTargetHealthCond  ||  existingTargetHealthCond .Status  !=  targetHealthCondStatus  {
309306newTargetHealthCond .LastTransitionTime  =  metav1 .Now ()
307+ } else  {
308+ newTargetHealthCond .LastTransitionTime  =  existingTargetHealthCond .LastTransitionTime 
310309}
311310
312- patch , err  :=  buildPodConditionPatch (pod , newTargetHealthCond )
313- if  err  !=  nil  {
314- return  false , err 
315- }
316- k8sPod  :=  & corev1.Pod {
311+ podPatchSource  :=  & corev1.Pod {
317312ObjectMeta : metav1.ObjectMeta {
318313Namespace : pod .Key .Namespace ,
319314Name : pod .Key .Name ,
320- UID : pod .UID ,
315+ },
316+ Status : corev1.PodStatus {
317+ Conditions : []corev1.PodCondition {},
321318},
322319}
323- if  err  :=  m .k8sClient .Status ().Patch (ctx , k8sPod , patch ); err  !=  nil  {
320+ if  hasExistingTargetHealthCond  {
321+ podPatchSource .Status .Conditions  =  []corev1.PodCondition {existingTargetHealthCond }
322+ }
323+ 
324+ podPatchTarget  :=  podPatchSource .DeepCopy ()
325+ podPatchTarget .UID  =  pod .UID  // only put the uid in the new object to ensure it appears in the patch as a precondition 
326+ podPatchTarget .Status .Conditions  =  []corev1.PodCondition {newTargetHealthCond }
327+ 
328+ if  err  :=  m .k8sClient .Status ().Patch (ctx , podPatchTarget , client .StrategicMergeFrom (podPatchSource )); err  !=  nil  {
324329if  apierrors .IsNotFound (err ) {
325330return  false , nil 
326331}
@@ -512,31 +517,6 @@ func matchNodePortEndpointWithTargets(endpoints []backend.NodePortEndpoint, targ
512517return  matchedEndpointAndTargets , unmatchedEndpoints , unmatchedTargets 
513518}
514519
515- func  buildPodConditionPatch (pod  k8s.PodInfo , condition  corev1.PodCondition ) (client.Patch , error ) {
516- oldData , err  :=  json .Marshal (corev1.Pod {
517- Status : corev1.PodStatus {
518- Conditions : nil ,
519- },
520- })
521- if  err  !=  nil  {
522- return  nil , err 
523- }
524- newData , err  :=  json .Marshal (corev1.Pod {
525- ObjectMeta : metav1.ObjectMeta {UID : pod .UID }, // only put the uid in the new object to ensure it appears in the patch as a precondition 
526- Status : corev1.PodStatus {
527- Conditions : []corev1.PodCondition {condition },
528- },
529- })
530- if  err  !=  nil  {
531- return  nil , err 
532- }
533- patchBytes , err  :=  strategicpatch .CreateTwoWayMergePatch (oldData , newData , corev1.Pod {})
534- if  err  !=  nil  {
535- return  nil , err 
536- }
537- return  client .RawPatch (types .StrategicMergePatchType , patchBytes ), nil 
538- }
539- 
540520func  isELBV2TargetGroupNotFoundError (err  error ) bool  {
541521var  awsErr  awserr.Error 
542522if  errors .As (err , & awsErr ) {
0 commit comments