{"record":{"id":"4c6409f172703e51","repo":"GoogleContainerTools/skaffold","slug":"error-getting-kubernetes-client-w","errorCode":null,"errorMessage":"error getting Kubernetes client: %w","messagePattern":"error getting Kubernetes client: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/skaffold/deploy/label/labels.go","lineNumber":59,"sourceCode":"\ttries     = 3\n\tsleeptime = 300 * time.Millisecond\n)\n\n// Apply applies all provided labels to the created Kubernetes resources\nfunc Apply(ctx context.Context, labels map[string]string, results []deploy.Artifact, kubeContext string) error {\n\tif len(labels) == 0 {\n\t\treturn nil\n\t}\n\n\t// use the kubectl client to update all k8s objects with a skaffold watermark\n\tdynClient, err := kubernetesclient.DynamicClient(kubeContext)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error getting Kubernetes dynamic client: %w\", err)\n\t}\n\n\tclient, err := kubernetesclient.Client(kubeContext)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error getting Kubernetes client: %w\", err)\n\t}\n\n\tfor _, res := range results {\n\t\terr = nil\n\t\tfor i := 0; i < tries; i++ {\n\t\t\tif err = updateRuntimeObject(ctx, dynClient, client.Discovery(), labels, res, kubeContext); err == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\ttime.Sleep(sleeptime)\n\t\t}\n\t\tif err != nil {\n\t\t\tlog.Entry(ctx).Warnf(\"error adding label to runtime object: %s\", err.Error())\n\t\t}\n\t}\n\n\treturn nil\n}\n","sourceCodeStart":41,"sourceCodeEnd":77,"githubUrl":"https://github.com/GoogleContainerTools/skaffold/blob/a1189de023efc32d4b8e11f395acc678aa555011/pkg/skaffold/deploy/label/labels.go#L41-L77","documentation":"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.","triggerScenarios":"Apply() runs with an unresolvable kubeContext or unreadable/invalid kubeconfig, causing clientcmd's ClientConfig/RESTConfig creation to fail inside kubernetesclient.Client.","commonSituations":"Same as client-init failures: missing kubeconfig in CI, typo'd --kubeconfig flag, context removed between deploy steps, invalid credentials/certificate paths in kubeconfig.","solutions":["Run `kubectl config current-context` and confirm the target context resolves","Fix or regenerate the kubeconfig file referenced by KUBECONFIG or the --kubeconfig flag","Ensure referenced certificate-authority/client-certificate files in the kubeconfig exist on disk","Re-authenticate with the cluster provider if tokens/certs expired"],"exampleFix":"// before\ndeploy:\n  kubeContext: nonexistent-context\n// after\ndeploy:\n  kubeContext: minikube","handlingStrategy":"validation","validationCode":"cfg, err := clientcmd.LoadFromFile(kubeconfigPath)\nif err != nil {\n    return fmt.Errorf(\"kubeconfig unreadable: %w\", err)\n}\nif _, ok := cfg.Contexts[kubeContext]; !ok {\n    return fmt.Errorf(\"context %q missing\", kubeContext)\n}","typeGuard":null,"tryCatchPattern":"client, err := kubernetesclient.Client(kubeContext)\nif err != nil {\n    return fmt.Errorf(\"k8s client init failed for %q: %w\", kubeContext, err)\n}","preventionTips":["Sanity-check cluster access with kubectl cluster-info before skaffold runs","Keep certificate paths in kubeconfig absolute and present","Use one canonical KUBECONFIG in CI images","Rotate credentials before expiry"],"tags":["kubernetes","kubeconfig","client-init"],"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"}