in pkg/controller/ingress/reconcile/backend/endpoint_resolver.go [81:136]
func (r *defaultEndpointResolver) resolvePodEndpoints(ctx context.Context, svc *corev1.Service, svcPort corev1.ServicePort) ([]PodEndpoint, bool, error) {
epsKey := util.NamespacedName(svc)
eps := &corev1.Endpoints{}
if err := r.k8sClient.Get(ctx, epsKey, eps); err != nil {
if apierrors.IsNotFound(err) {
return nil, false, fmt.Errorf("%w: %v", ErrNotFound, err.Error())
}
return nil, false, err
}
var endpoints []PodEndpoint
containsPotentialReadyEndpoints := false
for _, ep := range eps.Subsets {
var backendPort int
for _, p := range ep.Ports {
if p.Name == svcPort.Name {
backendPort = int(p.Port)
break
}
}
for _, addr := range ep.Addresses {
if addr.TargetRef == nil || addr.TargetRef.Kind != "Pod" {
continue
}
pod, err := r.findPodByReference(ctx, svc.Namespace, *addr.TargetRef)
if err != nil {
return nil, false, err
}
endpoints = append(endpoints, buildPodEndpoint(addr, backendPort, pod))
}
// readiness gates
for _, epAddr := range ep.NotReadyAddresses {
if epAddr.TargetRef == nil || epAddr.TargetRef.Kind != "Pod" {
continue
}
pod, err := r.findPodByReference(ctx, svc.Namespace, *epAddr.TargetRef)
if err != nil {
klog.Errorf("findPodByReference error: %s", err.Error())
return nil, false, err
}
if !k8s.IsPodHasReadinessGate(pod) {
continue
}
if !k8s.IsPodContainersReady(pod) {
containsPotentialReadyEndpoints = true
continue
}
endpoints = append(endpoints, buildPodEndpoint(epAddr, backendPort, pod))
}
}
return endpoints, containsPotentialReadyEndpoints, nil
}