GoogleContainerTools/skaffold · error

STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR

STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR

Error message

getting Kubernetes client: %w

What it means

monitor.statusCheck obtains both a typed Kubernetes clientset and later a dynamic client to poll deployment status. Failure to build the typed client via kubernetesclient.Client(kubeContext) aborts the status check with status code STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR. Like error 525, root causes are kubeconfig/context/connectivity problems.

Source

Thrown at pkg/skaffold/kubernetes/status/status_check.go:174

	event.StatusCheckEventEnded(errCode, err)
	if err != nil {
		eventV2.TaskFailed(constants.StatusCheck, err)
		return err
	}
	eventV2.TaskSucceeded(constants.StatusCheck)

	output.Default.Fprintln(out, "Deployments stabilized in", timeutil.Humanize(time.Since(start)))
	return nil
}

func (s *monitor) Reset() {
	s.seenResources.Reset()
}

func (s *monitor) statusCheck(ctx context.Context, out io.Writer) (proto.StatusCode, error) {
	client, err := kubernetesclient.Client(s.kubeContext)
	if err != nil {
		return proto.StatusCode_STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR, fmt.Errorf("getting Kubernetes client: %w", err)
	}
	dynClient, err := kubernetesclient.DynamicClient(s.kubeContext)
	if err != nil {
		return proto.StatusCode_STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR, fmt.Errorf("getting Kubernetes client: %w", err)
	}
	resources := make([]*resource.Resource, 0)
	for _, n := range *s.namespaces {
		newDeployments, err := getDeployments(ctx, client, n, s.labeller, getDeadline(s.deadlineSeconds), s.tolerateFailures)
		if err != nil {
			return proto.StatusCode_STATUSCHECK_DEPLOYMENT_FETCH_ERR, fmt.Errorf("could not fetch deployments: %w", err)
		}
		for _, d := range newDeployments {
			if s.seenResources.Contains(d) {
				continue
			}
			resources = append(resources, d)
			s.seenResources.Add(d)
		}

View on GitHub (pinned to a1189de023)

Solutions

  1. Validate with kubectl --context <ctx> cluster-info before running skaffold
  2. Restore or regenerate the kubeconfig for the target cluster
  3. Set the correct kubeContext in skaffold.yaml or via --kube-context flag
  4. Mount/copy a valid kubeconfig into CI containers running skaffold

Example fix

// before
skaffold dev --kube-context kind-old-cluster  # deleted
// after
kubectl config get-contexts
skaffold dev --kube-context kind-my-cluster
Defensive patterns

Strategy: validation

Validate before calling

if out, err := exec.Command("kubectl", "--context", kubeContext, "cluster-info").CombinedOutput(); err != nil {
    return fmt.Errorf("statuscheck will fail, context %q unreachable: %s", kubeContext, out)
}

Try / catch

client, err := kubernetesclient.Client(s.kubeContext)
if err != nil {
    return proto.StatusCode_STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR,
        fmt.Errorf("verify kubeconfig/kube-context %q: %w", s.kubeContext, err)
}

Prevention

When it happens

Trigger: kubernetesclient.Client(s.kubeContext) errors inside statusCheck (called from check) when skaffold dev is verifying deployed resources — missing kubeconfig, unknown kubeContext, or invalid REST config.

Common situations: Context deleted with an ephemeral cluster (kind/minikube stopped); KUBECONFIG unset in CI; kubeconfig file corrupted after a partial write; user switched clusters mid-run.

Related errors


AI-assisted analysis of GoogleContainerTools/skaffold@a1189de023 (2026-09-05). Data as JSON: /api/errors/e924d6c228790d87. Report an issue: GitHub.