istio/istio · error

failed to wait for resource: %v

Error message

failed to wait for resource: %v

What it means

After applying a component's manifests, WaitForResources (skipped only when SkipWait is set) failed within i.WaitTimeout and the installer wraps it as "failed to wait for resource" and reports it to the progress logger. The underlying wait error identifies resources that never reached ready, such as deployments whose pods stay pending.

Source

Thrown at operator/pkg/install/install.go:185

	manifests := manifestSet.Manifests

	plog := i.ProgressLogger.NewComponent(cname)

	for _, obj := range manifests {
		obj, err := i.applyLabelsAndAnnotations(obj, cname)
		if err != nil {
			return err
		}
		if err := i.serverSideApply(obj); err != nil {
			plog.ReportError(err.Error())
			return err
		}
		plog.ReportProgress()
	}

	if !i.SkipWait {
		if err := WaitForResources(manifests, i.Kube, i.WaitTimeout, i.DryRun, plog); err != nil {
			werr := fmt.Errorf("failed to wait for resource: %v", err)
			plog.ReportError(werr.Error())
			return werr
		}
	}
	plog.ReportFinished()
	return nil
}

// serverSideApply creates or updates an object in the API server depending on whether it already exists.
func (i Installer) serverSideApply(obj manifest.Manifest) error {
	const fieldOwnerOperator = "istio-operator"
	dc, err := i.Kube.DynamicClientFor(obj.GroupVersionKind(), obj.Unstructured, "")
	if err != nil {
		return err
	}
	objectStr := fmt.Sprintf("%s/%s/%s", obj.GetKind(), obj.GetNamespace(), obj.GetName())
	var dryRun []string
	// TODO: can we do this a server-side dry run? it doesn't work well if the namespace is not already created

View on GitHub (pinned to 8dc789c5cf)

Solutions

  1. Inspect the unready resources from the error and their pods' events with kubectl describe
  2. Fix the root cause: quotas, image refs, tolerations, resource requests
  3. Increase the wait timeout for slow clusters
  4. Re-run the install after remediation
Defensive patterns

Strategy: retry

Try / catch

for attempt := 0; attempt < 2; attempt++ {
	err := installer.InstallManifests(manifestSets)
	if err == nil {
		break
	}
	if !strings.Contains(err.Error(), "failed to wait for resource") {
		return err
	}
	// inspect pods, fix quota/image/scheduling, then retry with a longer timeout
	installer.WaitTimeout *= 2
}

Prevention

When it happens

Trigger: Pods unschedulable (insufficient CPU/memory, taints), image pull failures, crashlooping containers, or a WaitTimeout shorter than the cluster needs to roll everything out.

Common situations: Resource-constrained clusters; wrong image registry or credentials; slow CI clusters against default timeouts.

Related errors


AI-assisted analysis of istio/istio@8dc789c5cf (2026-08-15). Data as JSON: /api/errors/14f41d03ce33f894. Report an issue: GitHub.