kubernetes/kops · error

unable to find manifest %s

Error message

unable to find manifest %s

What it means

During BootstrapChannelBuilder.Build, each addon spec that lacks an inline Source is resolved from the embedded addon templates via b.templates.Find("addons/<manifest>"). If the template file is not found (nil), the build aborts because the addon cannot be rendered or copied into the channel.

Source

Thrown at upup/pkg/fi/cloudup/bootstrapchannelbuilder/bootstrapchannelbuilder.go:126

	}
}

// Build is responsible for adding the addons to the channel.
func (b *BootstrapChannelBuilder) Build(c *fi.CloudupModelBuilderContext) error {
	addons, serviceAccounts, err := b.buildAddons(c)
	if err != nil {
		return err
	}

	for _, addon := range addons.Items {
		// Addons with a preset source do not have a template.
		if addon.Source != nil {
			continue
		}
		manifestPath := "addons/" + *addon.Spec.Manifest
		manifestResource := b.templates.Find(manifestPath)
		if manifestResource == nil {
			return fmt.Errorf("unable to find manifest %s", manifestPath)
		}
		addon.Source = manifestResource
		addon.SkipRender = !b.templates.IsTemplate(manifestPath)
	}

	if featureflag.UseAddonOperators.Enabled() {
		ob := &wellknownoperators.Builder{
			VFSContext: vfs.Context,
			Cluster:    b.Cluster,
		}

		addonPackages, clusterAddons, err := ob.Build(b.ClusterAddons)
		if err != nil {
			return fmt.Errorf("error building well-known operators: %v", err)
		}
		b.ClusterAddons = clusterAddons

		for _, pkg := range addonPackages {

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Check the manifest path exists: the error names the missing 'addons/...' path
  2. Align the addon version in the cluster spec with the kops binary version
  3. Fix typos in spec.addons[*].manifest
  4. Upgrade or downgrade kops so the embedded template set matches the channel
  5. Remove the stale addon entry from the cluster spec

Example fix

// before (cluster.yaml)
addons:
- manifest: addons/dns-controller/1.99.0.yaml
// after: use a version bundled with your kops build
addons:
- manifest: addons/dns-controller/1.28.0.yaml
Defensive patterns

Strategy: validation

Validate before calling

// Ensure the manifest exists in embedded templates before building
path := "addons/" + *addon.Spec.Manifest
if b.templates.Find(path) == nil {
    return fmt.Errorf("addon manifest %s not present in this kops version", path)
}

Try / catch

if err := bcb.Build(addons); err != nil {
    var missing string
    if _, scanErr := fmt.Sscanf(err.Error(), "unable to find manifest %s", &missing); scanErr == nil {
        // fix or remove the addon referencing `missing`
    }
    return err
}

Prevention

When it happens

Trigger: An addon entry in Cluster.Spec.Addons (or channel addons) references a Spec.Manifest path that does not exist under 'addons/' in the kops embedded templates; building with a kops version where the addon was removed or renamed.

Common situations: Pinning a cluster manifest to a newer kops addon version than the binary ships; typos in the manifest path; using externally-provided addon channels whose manifest files were deleted; downgrading kops so embedded manifests vanish.

Related errors


AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05). Data as JSON: /api/errors/eb8c798f2824a67f. Report an issue: GitHub.