openimsdk/open-im-server · critical
failed to create clientset: %v
Error message
failed to create clientset: %v
What it means
NewKubernetesConnManager builds an in-cluster Kubernetes client. After loading the in-cluster config, it calls kubernetes.NewForConfig to create a clientset; if that fails (bad config, missing REST mapper setup, invalid host/CA data) it wraps the error with this message. The manager cannot do any service discovery without a clientset.
Source
Thrown at pkg/common/discovery/kubernetes/kubernetes.go:42
dialOptions []grpc.DialOption
rpcTargets map[string]string
selfTarget string
mu sync.RWMutex
connMap map[string][]*grpc.ClientConn
}
// NewKubernetesConnManager creates a new connection manager that uses Kubernetes services for service discovery.
func NewKubernetesConnManager(namespace string, options ...grpc.DialOption) (*KubernetesConnManager, error) {
config, err := rest.InClusterConfig()
if err != nil {
return nil, fmt.Errorf("failed to create in-cluster config: %v", err)
}
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
return nil, fmt.Errorf("failed to create clientset: %v", err)
}
k := &KubernetesConnManager{
clientset: clientset,
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 errView on GitHub (pinned to 175a7bb067)
Solutions
- Verify the error text from %v — it names the underlying clientset creation problem (e.g. 'unable to load in-cluster configuration').
- Ensure the pod's service account token and ca.crt are mounted and readable at /var/run/secrets/kubernetes.io/serviceaccount/.
- Confirm KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT env vars are set when running in-cluster.
- If running outside the cluster, use kubeconfig-based (clientcmd) config instead of in-cluster config.
Example fix
// before
config, err := rest.InClusterConfig()
// after
config, err := rest.InClusterConfig()
if err != nil {
config, err = clientcmd.BuildConfigFromFlags("", os.Getenv("KUBECONFIG"))
} Defensive patterns
Strategy: try-catch
Validate before calling
if _, err := os.Stat("/var/run/secrets/kubernetes.io/serviceaccount/token"); err != nil {
log.Fatal("not running in-cluster; use kubeconfig")
} Try / catch
mgr, err := NewKubernetesConnManager(ctx, namespace)
if err != nil {
return fmt.Errorf("k8s conn manager init: %w", err)
} Prevention
- Verify service account token and ca.crt are mounted before starting
- Fall back to kubeconfig when KUBERNETES_SERVICE_HOST is unset
- Smoke-test clientset access with a trivial API call at startup
When it happens
Trigger: kubernetes.NewForConfig(config) returns an error inside NewKubernetesConnManager — e.g. malformed in-cluster config, unreadable service account token/CA files, or an invalid host URL in the config.
Common situations: Running outside a Kubernetes pod with a stale/hand-crafted in-cluster config; missing or corrupted /var/run/secrets/kubernetes.io service account files; wrong kubeconfig mounted.
Related errors
- failed to create in-cluster config: %v
- service %s has no ports defined
- config field %s %s not found
- no command to run
- standalone api port is 0
AI-assisted analysis of openimsdk/open-im-server@175a7bb067 (2026-09-04).
Data as JSON: /api/errors/6c3f210440f6e95e.
Report an issue: GitHub.