func()

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
}