GoogleContainerTools/skaffold · error

getting client config for dynamic client: %w

Error message

getting client config for dynamic client: %w

What it means

getDynamicClient mirrors getClientset but builds a dynamic.Interface for unstructured resources. It wraps errors from context.GetRestClientConfig with this dynamic-client-specific message. Same root causes as the typed client path.

Source

Thrown at pkg/skaffold/kubernetes/client/client.go:47

// for tests
var (
	Client        = getClientset
	DynamicClient = getDynamicClient
	DefaultClient = getDefaultClientset
)

func getClientset(kubeContext string) (kubernetes.Interface, error) {
	config, err := context.GetRestClientConfig(kubeContext)
	if err != nil {
		return nil, fmt.Errorf("getting client config for Kubernetes client: %w", err)
	}
	return kubernetes.NewForConfig(config)
}

func getDynamicClient(kubeContext string) (dynamic.Interface, error) {
	config, err := context.GetRestClientConfig(kubeContext)
	if err != nil {
		return nil, fmt.Errorf("getting client config for dynamic client: %w", err)
	}
	return dynamic.NewForConfig(config)
}

func getDefaultClientset() (kubernetes.Interface, error) {
	config, err := context.GetDefaultRestClientConfig()
	if err != nil {
		return nil, fmt.Errorf("getting client config for Kubernetes client: %w", err)
	}
	return kubernetes.NewForConfig(config)
}

View on GitHub (pinned to a1189de023)

Solutions

  1. Validate kubeconfig with `kubectl config view` and ensure the context exists
  2. Correct the KUBECONFIG/kube-context value passed to Skaffold
  3. For in-cluster use, ensure the pod has a mounted service-account token

Example fix

// before: dynamic client built from a context that no longer exists
// after
kubectl config use-context my-cluster  # or pass a valid --kube-context
Defensive patterns

Strategy: validation

Validate before calling

raw, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(
    clientcmd.NewDefaultClientConfigLoadingRules(), nil).RawConfig()
if err != nil {
    return fmt.Errorf("cannot read kubeconfig: %w", err)
}
if _, ok := raw.Contexts[kubeContext]; !ok {
    return fmt.Errorf("context %q missing from kubeconfig", kubeContext)
}

Type guard

func canBuildDynamicClient(kubeContext string) bool {
    _, err := client.GetDynamicClient(kubeContext)
    return err == nil
}

Try / catch

dyn, err := client.GetDynamicClient(kubeContext)
if err != nil {
    return fmt.Errorf("dynamic client setup failed; verify kubeconfig for %q: %w", kubeContext, err)
}

Prevention

When it happens

Trigger: GetDynamicClient(kubeContext) when kubeconfig loading fails, the kubeContext is unknown, or the empty-context in-cluster fallback (InClusterConfig) errors outside a cluster.

Common situations: Same as 474: missing/malformed kubeconfig, deleted context, running outside a cluster while relying on in-cluster config; notably hit by deploy steps that manipulate unstructured manifests.

Related errors


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