GoogleContainerTools/skaffold · error

STATUSCHECK_INTERNAL_ERROR

STATUSCHECK_INTERNAL_ERROR

Error message

%d/%d deployment(s) failed

What it means

After watching all deployments, Skaffold found at least one whose status check failed. It builds this '%d/%d deployment(s) failed' message and returns STATUSCHECK_INTERNAL_ERROR (or a more specific code if one was recorded). This is the definitive 'your deployment is not healthy' signal from the status checker.

Source

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

				}
				r.MarkComplete()
				return
			}
		}
	}
}

func getSkaffoldDeployStatus(ctx context.Context, c *counter, sc proto.StatusCode) (proto.StatusCode, error) {
	if c.total == int(c.cancelled) && c.total > 0 {
		err := fmt.Errorf("%d/%d deployment(s) status check cancelled", c.cancelled, c.total)
		return proto.StatusCode_STATUSCHECK_USER_CANCELLED, err
	}
	// return success if no failures find.
	if c.failed == 0 {
		return proto.StatusCode_STATUSCHECK_SUCCESS, nil
	}
	// construct an error message and return appropriate error code
	err := fmt.Errorf("%d/%d deployment(s) failed", c.failed, c.total)
	if sc == proto.StatusCode_STATUSCHECK_SUCCESS || sc == 0 {
		log.Entry(ctx).Debugf("found statuscode %s. setting skaffold deploy status to STATUSCHECK_INTERNAL_ERROR.", sc)
		return proto.StatusCode_STATUSCHECK_INTERNAL_ERROR, err
	}
	log.Entry(ctx).Debugf("setting skaffold deploy status to %s.", sc)
	return sc, err
}

func getDeadline(d int) time.Duration {
	if d > 0 {
		return time.Duration(d) * time.Second
	}
	return DefaultStatusCheckDeadline
}

func (s *monitor) printStatusCheckSummary(out io.Writer, r *resource.Resource, c counter) {
	ae := r.Status().ActionableError()
	if r.StatusCode() == proto.StatusCode_STATUSCHECK_USER_CANCELLED {

View on GitHub (pinned to a1189de023)

Solutions

  1. Run `kubectl describe deployment <name>` and `kubectl logs` on the pods to find the root cause (crash, probe failure, image pull error)
  2. Fix the manifest causing the unhealthy rollout (correct image tag, resource requests, probe paths, missing secrets/configmaps)
  3. Increase deploy.statusCheckDeadlineSeconds if the deployment is healthy but slower than the deadline
  4. Re-run `skaffold deploy` after fixing and confirm `kubectl rollout status` passes

Example fix

// before (manifest)
readinessProbe:
  httpGet:
    path: /wrongpath
    port: 8080
// after
readinessProbe:
  httpGet:
    path: /healthz
    port: 8080
Defensive patterns

Strategy: try-catch

Validate before calling

// pre-check deployment health before running the status check
out, err := exec.Command("kubectl", "get", "deployments", "-n", ns, "--no-headers").CombinedOutput()
if err != nil || strings.Contains(string(out), "0/1") {
    log.Printf("deployment not ready yet: %s", out)
}

Try / catch

err := runSkaffoldDeploy(ctx)
if err != nil {
    var scErr *skaffold.StatusCodeError
    if errors.As(err, &scErr) && scErr.Code == proto.StatusCode_STATUSCHECK_INTERNAL_ERROR {
        log.Printf("status check failed: %v; inspect pods:", err)
        exec.Command("kubectl", "get", "pods", "-n", ns).Run()
    }
}

Prevention

When it happens

Trigger: `skaffold deploy`/`run`/`dev` completes the deploy step, then during the status check one or more Deployments fail to become Available within the deadline — e.g. CrashLoopBackOff, unschedulable pods, failing readiness probes — so c.failed > 0.

Common situations: Bad image/tag pushed to the cluster; insufficient CPU/memory causing Pending pods; misconfigured liveness/readiness probes; missing ConfigMaps/Secrets crashing containers; imagePullBackOff from registry auth problems.

Related errors


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