{"record":{"id":"345c288cdc8c67ee","repo":"openimsdk/open-im-server","slug":"failed-to-get-endpoints-for-service-s-v","errorCode":null,"errorMessage":"failed to get endpoints for service %s: %v","messagePattern":"failed to get endpoints for service (.+?): (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/common/discovery/kubernetes/kubernetes.go","lineNumber":65,"sourceCode":"\t\tnamespace:   namespace,\n\t\tdialOptions: options,\n\t\tconnMap:     make(map[string][]*grpc.ClientConn),\n\t}\n\n\tgo k.watchEndpoints()\n\n\treturn k, nil\n}\n\nfunc (k *KubernetesConnManager) initializeConns(serviceName string) error {\n\tport, err := k.getServicePort(serviceName)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tendpoints, err := k.clientset.CoreV1().Endpoints(k.namespace).Get(context.Background(), serviceName, metav1.GetOptions{})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to get endpoints for service %s: %v\", serviceName, err)\n\t}\n\n\t// fmt.Println(\"Endpoints:\", endpoints, \"endpoints.Subsets:\", endpoints.Subsets)\n\n\tvar conns []*grpc.ClientConn\n\tfor _, subset := range endpoints.Subsets {\n\t\tfor _, address := range subset.Addresses {\n\t\t\ttarget := fmt.Sprintf(\"%s:%d\", address.IP, port)\n\t\t\t// fmt.Println(\"IP target:\", target)\n\t\t\tconn, err := grpc.Dial(target, append(k.dialOptions, grpc.WithTransportCredentials(insecure.NewCredentials()))...)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to dial endpoint %s: %v\", target, err)\n\t\t\t}\n\t\t\tconns = append(conns, conn)\n\t\t}\n\t}\n\n\tk.mu.Lock()","sourceCodeStart":47,"sourceCodeEnd":83,"githubUrl":"https://github.com/openimsdk/open-im-server/blob/175a7bb0673eca18e9d1b10bff4f728da6b1b513/pkg/common/discovery/kubernetes/kubernetes.go#L47-L83","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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)."],"exampleFix":"// before\nendpoints, err := k.clientset.CoreV1().Endpoints(k.namespace).Get(ctx, serviceName, metav1.GetOptions{})\n// after\nendpoints, err := k.clientset.CoreV1().Endpoints(k.namespace).Get(ctx, serviceName, metav1.GetOptions{})\nif err != nil {\n    if apierrors.IsNotFound(err) {\n        log.Printf(\"service %q not found in namespace %q\", serviceName, k.namespace)\n    }\n    return err\n}","handlingStrategy":"retry","validationCode":"_, err := clientset.CoreV1().Endpoints(ns).Get(ctx, svcName, metav1.GetOptions{})\nif err != nil { /* service/endpoints not ready or RBAC missing */ }","typeGuard":null,"tryCatchPattern":"conns, err := mgr.GetConns(serviceName)\nif err != nil {\n    if apierrors.IsNotFound(errors.Unwrap(err)) {\n        // check namespace/service name\n    }\n}","preventionTips":["Grant the ServiceAccount get on endpoints via RBAC","Confirm namespace matches deployment before connecting","Check kubectl get endpoints <svc> resolves before app startup"],"tags":["kubernetes","network","rbac"],"backgroundTag":"kubernetes-endpoints-not-found","analyzedSha":"175a7bb0673eca18e9d1b10bff4f728da6b1b513","analyzedAt":"2026-09-04T16:52:56.821Z","contentChangedAt":"2026-09-04T16:52:56.821Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}