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 err

View on GitHub (pinned to 175a7bb067)

Solutions

  1. Verify the error text from %v — it names the underlying clientset creation problem (e.g. 'unable to load in-cluster configuration').
  2. Ensure the pod's service account token and ca.crt are mounted and readable at /var/run/secrets/kubernetes.io/serviceaccount/.
  3. Confirm KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT env vars are set when running in-cluster.
  4. 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

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


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