kubernetes/kops · error

error reading addon %q manifest: %v

Error message

error reading addon %q manifest: %v

What it means

AddonManifest.Normalize reads the addon's manifest resource into bytes using fi.ResourceAsBytes; this error wraps any failure from that read. It means kOps could not obtain the manifest content (whether embedded bytes, a file, or a fetched URL) for the named addon and cannot proceed to render/remap/hash it.

Source

Thrown at upup/pkg/fi/cloudup/bootstrapchannelbuilder/addonmanifest.go:86

		if isAddonTask(task) {
			continue
		}
		dependencies = append(dependencies, task)
	}
	return dependencies
}

func (a *AddonManifest) Normalize(c *fi.CloudupContext) error {
	if a.addonSpec == nil {
		return fmt.Errorf("addon spec is not configured for %q", fi.ValueOf(a.Name))
	}
	if a.source == nil {
		return fmt.Errorf("addon source is not configured for %q", fi.ValueOf(a.Name))
	}

	manifestBytes, err := fi.ResourceAsBytes(a.source)
	if err != nil {
		return fmt.Errorf("error reading addon %q manifest: %v", fi.ValueOf(a.Name), err)
	}

	if !a.skipRender && a.addonRenderer != nil {
		manifestBytes, err = a.addonRenderer.RenderTemplate(fi.ValueOf(a.Location), manifestBytes, tasksVisibleToAddons(c.AllTasks()))
		if err != nil {
			return fmt.Errorf("error rendering addon %q template: %w", fi.ValueOf(a.Name), err)
		}
	}

	if !a.skipRemap {
		manifestBytes, err = addonmanifests.RemapAddonManifest(a.addonSpec, a.modelContext, a.assetBuilder, manifestBytes, a.serviceAccounts)
		if err != nil {
			klog.Infof("invalid manifest: %s", string(manifestBytes))
			return fmt.Errorf("error remapping manifest %s: %v", fi.ValueOf(a.Location), err)
		}
	}

	manifestBytes = []byte(strings.TrimSpace(string(manifestBytes)))

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Read the wrapped inner error (%v) in the message to see the underlying cause (404, file not found, connection error)
  2. If the source is a URL, verify it is reachable (curl it) and that the channel addon's manifest/version path is correct
  3. If it is a local file path, confirm the file exists in your kOps checkout / image-bundle and the path matches the repo layout
  4. If offline, pre-populate the manifest in your image bundle or vendor the file before running kOps
  5. Retry after fixing network issues if the cause was transient connectivity

Example fix

// before (bad channel entry)
manifest: https://example.invalid/addons/coredns/v1.2.3.yaml
// after
manifest: https://storage.googleapis.com/kubernetes-addons/manifests/coredns/v1.2.3.yaml
Defensive patterns

Strategy: try-catch

Validate before calling

if src, ok := a.source.(fi.HasContents); ok {
    if _, err := src.Contents(); err != nil {
        return fmt.Errorf("addon source unavailable: %w", err)
    }
}

Try / catch

err := task.Normalize(ctx)
if err != nil && strings.Contains(err.Error(), "error reading addon") {
    // check network / channel URL, then retry or fix the manifest path
    log.Printf("addon manifest unreadable: %v", err)
}

Prevention

When it happens

Trigger: Normalize runs with addonSpec and source set, but fi.ResourceAsBytes(a.source) returns an error — e.g. a URL resource that fails to download, a file resource whose path does not exist, or a reader-based resource that errors — and the error is wrapped via fmt.Errorf with the addon name.

Common situations: The addon manifest URL in the channel is unreachable (offline build, bad network, deleted upstream release tag); a custom channel points at a typo'd or 404 path; an image-bundle/file path changed after a kOps version bump; the manifest file was moved in the repo.

Related errors


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