GoogleContainerTools/skaffold · error

unable to connect to Kubernetes: %w

Error message

unable to connect to Kubernetes: %w

What it means

The k8sjob action exec environment first verifies the target Kubernetes cluster is reachable via kubernetes.FailIfClusterIsNotReachable using the configured kubecontext. If the API server cannot be contacted, PrepareActions returns this wrapped error before loading images or creating jobs.

Source

Thrown at pkg/skaffold/actions/k8sjob/exec_env.go:101

	for k, v := range envMap {
		envVars = append(envVars, corev1.EnvVar{Name: k, Value: v})
	}

	return &ExecEnv{
		kubectl:      &kubectl,
		logger:       logger,
		tracker:      tracker,
		namespace:    namespace,
		labeller:     labeller,
		imageLoader:  k8scomponents.NewImageLoader(cfg, kubectl.CLI),
		acsCfgByName: acsCfgByName,
		envVars:      envVars,
	}
}

func (e ExecEnv) PrepareActions(ctx context.Context, out io.Writer, allbuilds, localImgs []graph.Artifact, acsNames []string) ([]actions.Action, error) {
	if err := kubernetes.FailIfClusterIsNotReachable(e.kubectl.KubeContext); err != nil {
		return nil, fmt.Errorf("unable to connect to Kubernetes: %w", err)
	}

	if err := e.imageLoader.LoadImages(ctx, out, localImgs, localImgs, localImgs); err != nil {
		return nil, err
	}

	e.logger.Start(ctx, out)

	return e.createActions(allbuilds, acsNames)
}

func (e ExecEnv) Cleanup(ctx context.Context, out io.Writer) error {
	return nil
}

func (e ExecEnv) Stop() {
	// This is to drain the logs from the succeeded jobs. Failed jobs were already removed from the cluster.
	e.logger.Stop()

View on GitHub (pinned to a1189de023)

Solutions

  1. Confirm the context and connectivity: kubectl config get-contexts; kubectl cluster-info --context <ctx>.
  2. Start or recreate the local cluster (minikube start / kind create cluster) if it is stopped or deleted.
  3. Refresh credentials (re-authenticate with your cloud provider / kubectl oidc-login) if the kubeconfig token expired.

Example fix

// before
skaffold run  # fails: kind cluster stopped
// after
kind create cluster  # or: minikube start
kubectl cluster-info  # verify reachable
skaffold run
Defensive patterns

Strategy: validation

Validate before calling

// Fail fast if the target cluster is not reachable
kubectl cluster-info --context <ctx> > /dev/null || { echo 'cluster unreachable'; exit 1; }

Try / catch

try {
  await skaffold.run(...);
} catch (e) {
  if (/unable to connect to Kubernetes/.test(String(e))) {
    // start local cluster / refresh creds, then retry
    execSync('minikube start');
    await skaffold.run(...);
    return;
  }
  throw e;
}

Prevention

When it happens

Trigger: Running skaffold actions in KubernetesCluster execution mode; FailIfClusterIsNotReachable fails due to no cluster running (kind/minikube stopped), wrong --kube-context, expired credentials, or no network route to the API server.

Common situations: kind cluster deleted or minikube not started; VPN off so the API server IP unreachable; kubeconfig context pointing to a stale cluster after cloud provider rotation; OIDC/token expired.

Related errors


AI-assisted analysis of GoogleContainerTools/skaffold@a1189de023 (2026-09-05). Data as JSON: /api/errors/babe8fef88163338. Report an issue: GitHub.