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
- Verify serviceName exists in the manager's namespace: kubectl get endpoints <serviceName> -n <namespace>.
- Check RBAC: grant the pod's ServiceAccount get permission on endpoints (Core API group).
- Confirm the namespace value passed to NewKubernetesConnManager matches where the service is deployed.
- 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
- Grant the ServiceAccount get on endpoints via RBAC
- Confirm namespace matches deployment before connecting
- Check kubectl get endpoints <svc> resolves before app startup
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
- failed to dial endpoint %s: %v
- failed to get service %s: %v
- prometheus listen %d error %w
- failed to create in-cluster config: %v
- failed to create clientset: %v
AI-assisted analysis of openimsdk/open-im-server@175a7bb067 (2026-09-04).
Data as JSON: /api/errors/345c288cdc8c67ee.
Report an issue: GitHub.