GoogleContainerTools/skaffold · critical

getting Kubernetes client: %w

Error message

getting Kubernetes client: %w

What it means

Inside createAndRunJob, Skaffold builds a Kubernetes clientset via `kubernetesclient.Client(v.kubectl.KubeContext)` and wraps any failure with 'getting Kubernetes client'. This means client construction itself failed — typically kubeconfig loading, context resolution, or REST config creation — before any API request is sent.

Source

Thrown at pkg/skaffold/verify/k8sjob/verify.go:182

			defer wg.Done()
			s.Go(func() error {
				// TODO(aaron-prindle) i think we are using image tag for uniqueness?
				// - should be container name?
				return v.createAndRunJob(ctx, testcase)
			})
		}(nTC)
	}
	v.TrackBuildArtifacts(builds)
	wg.Wait()
	return s.Wait()
}

func (v *Verifier) createAndRunJob(ctx context.Context, tc latest.VerifyTestCase) error {
	// TODO(aaron-prindle) look for and delete existing job w/ same name?
	// - must be done before logger starts or else confusing output
	clientset, err := kubernetesclient.Client(v.kubectl.KubeContext)
	if err != nil {
		return fmt.Errorf("getting Kubernetes client: %w", err)
	}

	var job *batchv1.Job
	if tc.ExecutionMode.KubernetesClusterExecutionMode.JobManifestPath != "" {
		job, err = v.createJobFromManifestPath(tc.Name, tc.Container, tc.ExecutionMode.KubernetesClusterExecutionMode.JobManifestPath)
		if err != nil {
			return err
		}
	} else {
		job = v.createJob(tc.Name, tc.Container)
	}
	if tc.ExecutionMode.KubernetesClusterExecutionMode.Overrides != "" {
		obj, err := k8sjobutil.ApplyOverrides(job, tc.ExecutionMode.KubernetesClusterExecutionMode.Overrides)
		if err != nil {
			return err
		}
		job = obj.(*batchv1.Job)
	}

View on GitHub (pinned to a1189de023)

Solutions

  1. Run `kubectl config get-contexts` to confirm the context exists and is valid
  2. Fix or regenerate kubeconfig (e.g. `gcloud container clusters get-credentials`, `aws eks update-kubeconfig`)
  3. Check KUBECONFIG env var and file permissions
  4. If using client certs, verify cert/key paths in the kubeconfig exist and are readable
  5. Pass the correct --kube-context to skaffold instead of relying on defaults

Example fix

// before
skaffold verify --kube-context nonexistent-context  # getting Kubernetes client: ...
// after
kubectl config get-contexts   # confirm real context name
skaffold verify --kube-context my-cluster
Defensive patterns

Strategy: validation

Validate before calling

raw, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(
    clientcmd.NewDefaultClientConfigLoadingRules(),
    &clientcmd.ConfigOverrides{CurrentContext: kubeContext}).RawConfig()
if err != nil { return fmt.Errorf("kubeconfig unusable: %w", err) }
if _, ok := raw.Contexts[kubeContext]; !ok {
    return fmt.Errorf("context %q not found in kubeconfig", kubeContext)
}

Type guard

func kubeContextValid(path, name string) bool {
    data, err := os.ReadFile(path)
    if err != nil { return false }
    var kc struct{ Contexts map[string]json.RawMessage `json:"contexts"` }
    if json.Unmarshal(data, &kc) != nil { return false }
    _, ok := kc.Contexts[name]
    return ok
}

Try / catch

if err := verifier.Cleanup(ctx, out); err != nil {
    if strings.Contains(err.Error(), "getting Kubernetes client") {
        // log kubeconfig path + context, fall back to manual job deletion
    }
}

Prevention

When it happens

Trigger: createAndRunJob is invoked with a kubeContext that cannot be resolved: missing/invalid kubeconfig file, unknown context name, malformed cluster/user entries, or unreadable client cert/key files referenced by the context.

Common situations: KUBECONFIG pointing to a nonexistent file; context renamed or deleted in ~/.kube/config; malformed kubeconfig after manual editing; unreadable certificate files; running in a container/CI without a mounted kubeconfig.

Related errors


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