GoogleContainerTools/skaffold · error

error getting Kubernetes client: %w

Error message

error getting Kubernetes client: %w

What it means

After obtaining the dynamic client, Apply() fetches a standard typed Kubernetes clientset via kubernetesclient.Client(kubeContext) to access Discovery(). This error wraps that client construction failure. Like the dynamic client, it fails when a RESTConfig cannot be built for the given kubeContext.

Source

Thrown at pkg/skaffold/deploy/label/labels.go:59

	tries     = 3
	sleeptime = 300 * time.Millisecond
)

// Apply applies all provided labels to the created Kubernetes resources
func Apply(ctx context.Context, labels map[string]string, results []deploy.Artifact, kubeContext string) error {
	if len(labels) == 0 {
		return nil
	}

	// use the kubectl client to update all k8s objects with a skaffold watermark
	dynClient, err := kubernetesclient.DynamicClient(kubeContext)
	if err != nil {
		return fmt.Errorf("error getting Kubernetes dynamic client: %w", err)
	}

	client, err := kubernetesclient.Client(kubeContext)
	if err != nil {
		return fmt.Errorf("error getting Kubernetes client: %w", err)
	}

	for _, res := range results {
		err = nil
		for i := 0; i < tries; i++ {
			if err = updateRuntimeObject(ctx, dynClient, client.Discovery(), labels, res, kubeContext); err == nil {
				break
			}
			time.Sleep(sleeptime)
		}
		if err != nil {
			log.Entry(ctx).Warnf("error adding label to runtime object: %s", err.Error())
		}
	}

	return nil
}

View on GitHub (pinned to a1189de023)

Solutions

  1. Run `kubectl config current-context` and confirm the target context resolves
  2. Fix or regenerate the kubeconfig file referenced by KUBECONFIG or the --kubeconfig flag
  3. Ensure referenced certificate-authority/client-certificate files in the kubeconfig exist on disk
  4. Re-authenticate with the cluster provider if tokens/certs expired

Example fix

// before
deploy:
  kubeContext: nonexistent-context
// after
deploy:
  kubeContext: minikube
Defensive patterns

Strategy: validation

Validate before calling

cfg, err := clientcmd.LoadFromFile(kubeconfigPath)
if err != nil {
    return fmt.Errorf("kubeconfig unreadable: %w", err)
}
if _, ok := cfg.Contexts[kubeContext]; !ok {
    return fmt.Errorf("context %q missing", kubeContext)
}

Try / catch

client, err := kubernetesclient.Client(kubeContext)
if err != nil {
    return fmt.Errorf("k8s client init failed for %q: %w", kubeContext, err)
}

Prevention

When it happens

Trigger: Apply() runs with an unresolvable kubeContext or unreadable/invalid kubeconfig, causing clientcmd's ClientConfig/RESTConfig creation to fail inside kubernetesclient.Client.

Common situations: Same as client-init failures: missing kubeconfig in CI, typo'd --kubeconfig flag, context removed between deploy steps, invalid credentials/certificate paths in kubeconfig.

Related errors


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