{"record":{"id":"9aaa62c7ee2e9dc2","repo":"GoogleContainerTools/skaffold","slug":"getting-client-config-for-dynamic-client-w","errorCode":null,"errorMessage":"getting client config for dynamic client: %w","messagePattern":"getting client config for dynamic client: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/skaffold/kubernetes/client/client.go","lineNumber":47,"sourceCode":"// for tests\nvar (\n\tClient        = getClientset\n\tDynamicClient = getDynamicClient\n\tDefaultClient = getDefaultClientset\n)\n\nfunc getClientset(kubeContext string) (kubernetes.Interface, error) {\n\tconfig, err := context.GetRestClientConfig(kubeContext)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"getting client config for Kubernetes client: %w\", err)\n\t}\n\treturn kubernetes.NewForConfig(config)\n}\n\nfunc getDynamicClient(kubeContext string) (dynamic.Interface, error) {\n\tconfig, err := context.GetRestClientConfig(kubeContext)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"getting client config for dynamic client: %w\", err)\n\t}\n\treturn dynamic.NewForConfig(config)\n}\n\nfunc getDefaultClientset() (kubernetes.Interface, error) {\n\tconfig, err := context.GetDefaultRestClientConfig()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"getting client config for Kubernetes client: %w\", err)\n\t}\n\treturn kubernetes.NewForConfig(config)\n}\n","sourceCodeStart":29,"sourceCodeEnd":59,"githubUrl":"https://github.com/GoogleContainerTools/skaffold/blob/a1189de023efc32d4b8e11f395acc678aa555011/pkg/skaffold/kubernetes/client/client.go#L29-L59","documentation":"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.","triggerScenarios":"GetDynamicClient(kubeContext) when kubeconfig loading fails, the kubeContext is unknown, or the empty-context in-cluster fallback (InClusterConfig) errors outside a cluster.","commonSituations":"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.","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"],"exampleFix":"// before: dynamic client built from a context that no longer exists\n// after\nkubectl config use-context my-cluster  # or pass a valid --kube-context","handlingStrategy":"validation","validationCode":"raw, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(\n    clientcmd.NewDefaultClientConfigLoadingRules(), nil).RawConfig()\nif err != nil {\n    return fmt.Errorf(\"cannot read kubeconfig: %w\", err)\n}\nif _, ok := raw.Contexts[kubeContext]; !ok {\n    return fmt.Errorf(\"context %q missing from kubeconfig\", kubeContext)\n}","typeGuard":"func canBuildDynamicClient(kubeContext string) bool {\n    _, err := client.GetDynamicClient(kubeContext)\n    return err == nil\n}","tryCatchPattern":"dyn, err := client.GetDynamicClient(kubeContext)\nif err != nil {\n    return fmt.Errorf(\"dynamic client setup failed; verify kubeconfig for %q: %w\", kubeContext, err)\n}","preventionTips":["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"],"tags":["kubernetes","kubeconfig","dynamic-client"],"backgroundTag":"invalid-kubeconfig","analyzedSha":"a1189de023efc32d4b8e11f395acc678aa555011","analyzedAt":"2026-09-05T12:09:27.064Z","contentChangedAt":"2026-09-05T12:09:27.064Z","schemaVersion":2},"datasetVersion":"2026-09-12T17:17:11.597Z"}