{"record":{"id":"f43c60b0bbce756b","repo":"GoogleContainerTools/skaffold","slug":"getting-kubernetes-client-w-f43c60","errorCode":null,"errorMessage":"getting Kubernetes client: %w","messagePattern":"getting Kubernetes client: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"pkg/skaffold/verify/k8sjob/verify.go","lineNumber":182,"sourceCode":"\t\t\tdefer wg.Done()\n\t\t\ts.Go(func() error {\n\t\t\t\t// TODO(aaron-prindle) i think we are using image tag for uniqueness?\n\t\t\t\t// - should be container name?\n\t\t\t\treturn v.createAndRunJob(ctx, testcase)\n\t\t\t})\n\t\t}(nTC)\n\t}\n\tv.TrackBuildArtifacts(builds)\n\twg.Wait()\n\treturn s.Wait()\n}\n\nfunc (v *Verifier) createAndRunJob(ctx context.Context, tc latest.VerifyTestCase) error {\n\t// TODO(aaron-prindle) look for and delete existing job w/ same name?\n\t// - must be done before logger starts or else confusing output\n\tclientset, err := kubernetesclient.Client(v.kubectl.KubeContext)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"getting Kubernetes client: %w\", err)\n\t}\n\n\tvar job *batchv1.Job\n\tif tc.ExecutionMode.KubernetesClusterExecutionMode.JobManifestPath != \"\" {\n\t\tjob, err = v.createJobFromManifestPath(tc.Name, tc.Container, tc.ExecutionMode.KubernetesClusterExecutionMode.JobManifestPath)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t} else {\n\t\tjob = v.createJob(tc.Name, tc.Container)\n\t}\n\tif tc.ExecutionMode.KubernetesClusterExecutionMode.Overrides != \"\" {\n\t\tobj, err := k8sjobutil.ApplyOverrides(job, tc.ExecutionMode.KubernetesClusterExecutionMode.Overrides)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tjob = obj.(*batchv1.Job)\n\t}","sourceCodeStart":164,"sourceCodeEnd":200,"githubUrl":"https://github.com/GoogleContainerTools/skaffold/blob/a1189de023efc32d4b8e11f395acc678aa555011/pkg/skaffold/verify/k8sjob/verify.go#L164-L200","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Run `kubectl config get-contexts` to confirm the context exists and is valid","Fix or regenerate kubeconfig (e.g. `gcloud container clusters get-credentials`, `aws eks update-kubeconfig`)","Check KUBECONFIG env var and file permissions","If using client certs, verify cert/key paths in the kubeconfig exist and are readable","Pass the correct --kube-context to skaffold instead of relying on defaults"],"exampleFix":"// before\nskaffold verify --kube-context nonexistent-context  # getting Kubernetes client: ...\n// after\nkubectl config get-contexts   # confirm real context name\nskaffold verify --kube-context my-cluster","handlingStrategy":"validation","validationCode":"raw, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(\n    clientcmd.NewDefaultClientConfigLoadingRules(),\n    &clientcmd.ConfigOverrides{CurrentContext: kubeContext}).RawConfig()\nif err != nil { return fmt.Errorf(\"kubeconfig unusable: %w\", err) }\nif _, ok := raw.Contexts[kubeContext]; !ok {\n    return fmt.Errorf(\"context %q not found in kubeconfig\", kubeContext)\n}","typeGuard":"func kubeContextValid(path, name string) bool {\n    data, err := os.ReadFile(path)\n    if err != nil { return false }\n    var kc struct{ Contexts map[string]json.RawMessage `json:\"contexts\"` }\n    if json.Unmarshal(data, &kc) != nil { return false }\n    _, ok := kc.Contexts[name]\n    return ok\n}","tryCatchPattern":"if err := verifier.Cleanup(ctx, out); err != nil {\n    if strings.Contains(err.Error(), \"getting Kubernetes client\") {\n        // log kubeconfig path + context, fall back to manual job deletion\n    }\n}","preventionTips":["Ensure KUBECONFIG is set and readable in CI before running skaffold","Never hand-edit kubeconfig without validating via kubectl","Regenerate credentials after they expire","Verify context names with `kubectl config get-contexts` before passing --kube-context"],"tags":["kubernetes","kubeconfig","client-initialization"],"backgroundTag":"kubeconfig-invalid-or-missing","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"}