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
- Confirm the context and connectivity: kubectl config get-contexts; kubectl cluster-info --context <ctx>.
- Start or recreate the local cluster (minikube start / kind create cluster) if it is stopped or deleted.
- 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
- Start kind/minikube in CI before skaffold steps
- Run kubectl cluster-info as a preflight gate
- Keep cloud credentials refreshed (token expiry) for remote clusters
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
- action %v not found for k8s execution mode
- c.Message (pod status condition message)
- unable to lookup minikube executable. Please add it to PATH
- rs.ae.Message (actionable error message from status check)
- no valid Kubernetes objects decoded
AI-assisted analysis of GoogleContainerTools/skaffold@a1189de023 (2026-09-05).
Data as JSON: /api/errors/babe8fef88163338.
Report an issue: GitHub.