{"record":{"id":"7c9f5bad2fbd054e","repo":"GoogleContainerTools/skaffold","slug":"unable-to-connect-to-kubernetes-w-7c9f5b","errorCode":null,"errorMessage":"unable to connect to Kubernetes: %w","messagePattern":"unable to connect to Kubernetes: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/skaffold/deploy/helm/helm.go","lineNumber":251,"sourceCode":"\th.localImages = images\n}\n\nfunc (h *Deployer) TrackBuildArtifacts(builds, deployedImages []graph.Artifact) {\n\tdeployutil.AddTagsToPodSelector(builds, deployedImages, h.podSelector)\n\th.logger.RegisterArtifacts(builds)\n}\n\n// Deploy deploys the build results to the Kubernetes cluster\nfunc (h *Deployer) Deploy(ctx context.Context, out io.Writer, builds []graph.Artifact, _ manifest.ManifestListByConfig) error {\n\tctx, endTrace := instrumentation.StartTrace(ctx, \"Deploy\", map[string]string{\n\t\t\"DeployerType\": \"helm\",\n\t})\n\tdefer endTrace()\n\n\t// Check that the cluster is reachable.\n\t// This gives a better error message when the cluster can't be reached.\n\tif err := kubernetes.FailIfClusterIsNotReachable(h.kubeContext); err != nil {\n\t\treturn fmt.Errorf(\"unable to connect to Kubernetes: %w\", err)\n\t}\n\n\tchildCtx, endTrace := instrumentation.StartTrace(ctx, \"Deploy_LoadImages\")\n\tif err := h.imageLoader.LoadImages(childCtx, out, h.localImages, h.originalImages, builds); err != nil {\n\t\tendTrace(instrumentation.TraceEndError(err))\n\t\treturn err\n\t}\n\tendTrace()\n\n\tolog.Entry(ctx).Infof(\"Deploying with helm v%s ...\", h.helmVersion)\n\n\tdependencyGraph, err := NewDependencyGraph(h.Releases)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"unable to create dependency graph: %w\", err)\n\t}\n\n\tlevelByLevelReleases, err := dependencyGraph.GetReleasesByLevel()\n\tif err != nil {","sourceCodeStart":233,"sourceCodeEnd":269,"githubUrl":"https://github.com/GoogleContainerTools/skaffold/blob/a1189de023efc32d4b8e11f395acc678aa555011/pkg/skaffold/deploy/helm/helm.go#L233-L269","documentation":"Wraps the failure from kubernetes.FailIfClusterIsNotReachable during Deploy. Skaffold pre-checks cluster reachability before deploying so the user gets a clear 'unable to connect to Kubernetes' message instead of a confusing helm/kubectl error later in the deploy pipeline. The wrapped error carries the underlying cause (DNS, auth, context).","triggerScenarios":"Calling Deployer.Deploy when the kubeconfig context points to an unreachable API server, credentials are expired/missing, or the kubeContext name does not exist.","commonSituations":"VPN not connected to a private cluster, KIND/minikube cluster stopped, GKE/EKS token expired, typo in kubectl context name, ~/.kube/config absent in CI containers.","solutions":["Run `kubectl cluster-info --context <kubeContext>` to verify the cluster is reachable with the same kubeconfig","Start or reconnect the cluster (minikube start, kind cluster create, connect VPN)","Check the `kube-context` value in skaffold.yaml matches `kubectl config get-contexts`","Refresh credentials (gcloud container clusters get-credentials / aws eks update-kubeconfig)"],"exampleFix":"// before\n.deploy:\n  script: skaffold run\n// after\n.deploy:\n  script:\n    - kubectl config use-context $KUBE_CONTEXT\n    - kubectl cluster-info   # fail fast if unreachable\n    - skaffold run","handlingStrategy":"try-catch","validationCode":"import (\n  \"k8s.io/client-go/kubernetes\"\n  \"k8s.io/client-go/tools/clientcmd\"\n)\nfunc validateCluster(kubeContext string) error {\n  cfg, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(\n    clientcmd.NewDefaultClientConfigLoadingRules(),\n    &clientcmd.ConfigOverrides{CurrentContext: kubeContext}).ClientConfig()\n  if err != nil { return err }\n  _, err = kubernetes.NewForConfig(cfg).Discovery().ServerVersion()\n  return err\n}","typeGuard":null,"tryCatchPattern":"err := deployer.Deploy(ctx, out)\nvar connErr error\nif errors.As(err, &connErr) && strings.Contains(err.Error(), \"unable to connect to Kubernetes\") {\n  // check kubeconfig, VPN, credentials, then retry once\n}","preventionTips":["Run `kubectl cluster-info` in preflight before deploying","Pin kubeContext in skaffold.yaml and verify it exists via `kubectl config get-contexts`","Refresh cloud credentials in CI before each deploy","Alert on API-server reachability in the deploy environment"],"tags":["kubernetes","connectivity","deploy"],"backgroundTag":"kubernetes-cluster-unreachable","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"}