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
- Validate kubeconfig with `kubectl config view` and ensure the context exists
- Correct the KUBECONFIG/kube-context value passed to Skaffold
- 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
- Keep one valid kubeconfig for deploy steps that use unstructured manifests
- Run `kubectl get ns` as a preflight to confirm both config and connectivity
- Avoid empty kubeContext unless running in-cluster
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
- getting Kubernetes client: %w
- unable to connect to Kubernetes: %w
- error getting Kubernetes dynamic client: %w
- error getting Kubernetes client: %w
- resolving namespace: %w
AI-assisted analysis of GoogleContainerTools/skaffold@a1189de023 (2026-09-05).
Data as JSON: /api/errors/9aaa62c7ee2e9dc2.
Report an issue: GitHub.