diff --git a/internal/ingress/backend/endpoint.go b/internal/ingress/backend/endpoint.go index d21eb0edf..650b86b59 100644 --- a/internal/ingress/backend/endpoint.go +++ b/internal/ingress/backend/endpoint.go @@ -182,15 +182,10 @@ func (resolver *endpointResolver) resolveIP(ingress *extensions.Ingress, backend continue } - // check if all containers are ready - for _, condition := range pod.Status.Conditions { - if condition.Type == api.ContainersReady { - if condition.Status == api.ConditionTrue { - addresses = append(addresses, epAddr) - } - break - } + if IsPodSuitableAsIPTarget(pod) { + addresses = append(addresses, epAddr) } + } for _, epAddr := range addresses { result = append(result, &elbv2.TargetDescription{ @@ -226,6 +221,17 @@ func IsNodeSuitableAsTrafficProxy(node *corev1.Node) bool { return false } +// IsPodSuitableAsIPTarget check whether pod is suitable as a TargetGroup's target +// (currently tested: are all pod's containers ready?). +func IsPodSuitableAsIPTarget(pod *corev1.Pod) bool { + for _, condition := range pod.Status.Conditions { + if condition.Type == api.ContainersReady { + return condition.Status == api.ConditionTrue + } + } + return false +} + // findServiceAndPort returns the service & servicePort by name func findServiceAndPort(store store.Storer, namespace string, serviceName string, servicePort intstr.IntOrString) (*corev1.Service, *corev1.ServicePort, error) { serviceKey := namespace + "/" + serviceName diff --git a/internal/ingress/controller/handlers/pod.go b/internal/ingress/controller/handlers/pod.go index 2deb2d2be..176f97ed6 100644 --- a/internal/ingress/controller/handlers/pod.go +++ b/internal/ingress/controller/handlers/pod.go @@ -2,11 +2,11 @@ package handlers import ( "context" - "reflect" "github.com/golang/glog" "github.com/kubernetes-sigs/aws-alb-ingress-controller/internal/alb/tg" "github.com/kubernetes-sigs/aws-alb-ingress-controller/internal/ingress/annotations/class" + "github.com/kubernetes-sigs/aws-alb-ingress-controller/internal/ingress/backend" corev1 "k8s.io/api/core/v1" extensions "k8s.io/api/extensions/v1beta1" "k8s.io/apimachinery/pkg/types" @@ -27,14 +27,17 @@ type EnqueueRequestsForPodsEvent struct { // Create is called in response to an create event - e.g. Pod Creation. func (h *EnqueueRequestsForPodsEvent) Create(e event.CreateEvent, queue workqueue.RateLimitingInterface) { - h.enqueueImpactedIngresses(e.Object.(*corev1.Pod), queue) } // Update is called in response to an update event - e.g. Pod Updated. func (h *EnqueueRequestsForPodsEvent) Update(e event.UpdateEvent, queue workqueue.RateLimitingInterface) { podOld := e.ObjectOld.(*corev1.Pod) podNew := e.ObjectNew.(*corev1.Pod) - if !reflect.DeepEqual(podOld, podNew) { + + // we only enqueue reconcile events for pods whose containers changed state + // (ContainersReady vs not ContainersReady). + if backend.IsPodSuitableAsIPTarget(podNew) != backend.IsPodSuitableAsIPTarget(podOld) { + // ... and only for pods referenced by an endpoint backing an ingress: h.enqueueImpactedIngresses(podNew, queue) } } @@ -96,6 +99,7 @@ func (h *EnqueueRequestsForPodsEvent) enqueueImpactedIngresses(pod *corev1.Pod, Name: ingress.Name, }, }) + break } } }