openimsdk/open-im-server · error

failed to get endpoints for service %s: %v

Error message

failed to get endpoints for service %s: %v

What it means

initializeConns fetches the Endpoints object for a Kubernetes service via the clientset to learn pod addresses. If the API server Get call fails it wraps the error with the service name. This blocks building gRPC connections for that service.

Source

Thrown at pkg/common/discovery/kubernetes/kubernetes.go:65

		namespace:   namespace,
		dialOptions: options,
		connMap:     make(map[string][]*grpc.ClientConn),
	}

	go k.watchEndpoints()

	return k, nil
}

func (k *KubernetesConnManager) initializeConns(serviceName string) error {
	port, err := k.getServicePort(serviceName)
	if err != nil {
		return err
	}

	endpoints, err := k.clientset.CoreV1().Endpoints(k.namespace).Get(context.Background(), serviceName, metav1.GetOptions{})
	if err != nil {
		return fmt.Errorf("failed to get endpoints for service %s: %v", serviceName, err)
	}

	// fmt.Println("Endpoints:", endpoints, "endpoints.Subsets:", endpoints.Subsets)

	var conns []*grpc.ClientConn
	for _, subset := range endpoints.Subsets {
		for _, address := range subset.Addresses {
			target := fmt.Sprintf("%s:%d", address.IP, port)
			// fmt.Println("IP target:", target)
			conn, err := grpc.Dial(target, append(k.dialOptions, grpc.WithTransportCredentials(insecure.NewCredentials()))...)
			if err != nil {
				return fmt.Errorf("failed to dial endpoint %s: %v", target, err)
			}
			conns = append(conns, conn)
		}
	}

	k.mu.Lock()

View on GitHub (pinned to 175a7bb067)

Solutions

  1. Verify serviceName exists in the manager's namespace: kubectl get endpoints <serviceName> -n <namespace>.
  2. Check RBAC: grant the pod's ServiceAccount get permission on endpoints (Core API group).
  3. Confirm the namespace value passed to NewKubernetesConnManager matches where the service is deployed.
  4. Verify the pod can reach the Kubernetes API server (env vars, DNS, network policy).

Example fix

// before
endpoints, err := k.clientset.CoreV1().Endpoints(k.namespace).Get(ctx, serviceName, metav1.GetOptions{})
// after
endpoints, err := k.clientset.CoreV1().Endpoints(k.namespace).Get(ctx, serviceName, metav1.GetOptions{})
if err != nil {
    if apierrors.IsNotFound(err) {
        log.Printf("service %q not found in namespace %q", serviceName, k.namespace)
    }
    return err
}
Defensive patterns

Strategy: retry

Validate before calling

_, err := clientset.CoreV1().Endpoints(ns).Get(ctx, svcName, metav1.GetOptions{})
if err != nil { /* service/endpoints not ready or RBAC missing */ }

Try / catch

conns, err := mgr.GetConns(serviceName)
if err != nil {
    if apierrors.IsNotFound(errors.Unwrap(err)) {
        // check namespace/service name
    }
}

Prevention

When it happens

Trigger: clientset.CoreV1().Endpoints(namespace).Get(ctx, serviceName, ...) returns an error: service does not exist in the namespace, RBAC forbids reading endpoints, or API server is unreachable.

Common situations: Wrong namespace passed to NewKubernetesConnManager; Service name typo or service deployed in another namespace; ServiceAccount lacking get/endpoints RBAC permission; network policy blocking API server access.

Related errors


AI-assisted analysis of openimsdk/open-im-server@175a7bb067 (2026-09-04). Data as JSON: /api/errors/345c288cdc8c67ee. Report an issue: GitHub.