kubernetes/kops · error

unknown arch: %q

Error message

unknown arch: %q

What it means

The release URL template is architecture-specific (amd64 vs arm64). If findContainerdVersionUrl receives any other architecture it cannot construct a download URL and returns this error. It is a defensive default branch that surfaces unsupported architectures early instead of producing a broken URL.

Source

Thrown at pkg/nodemodel/wellknownassets/containerd.go:89

}

func findContainerdVersionUrl(arch architectures.Architecture, version string) (*url.URL, error) {
	sv, err := semver.ParseTolerant(version)
	if err != nil {
		return nil, fmt.Errorf("unable to parse version string: %q", version)
	}
	if sv.LT(semver.MustParse("2.1.0")) {
		return nil, fmt.Errorf("unsupported legacy containerd version: %q", version)
	}

	var u string
	switch arch {
	case architectures.ArchitectureAmd64:
		u = fmt.Sprintf(containerdReleaseUrlAmd64, version, version)
	case architectures.ArchitectureArm64:
		u = fmt.Sprintf(containerdReleaseUrlArm64, version, version)
	default:
		return nil, fmt.Errorf("unknown arch: %q", arch)
	}

	return url.Parse(u)
}

func buildFileAsset(assetBuilder *assets.AssetBuilder, canonicalURL string, knownHashString string) (*assets.FileAsset, error) {
	u, err := url.Parse(canonicalURL)
	if err != nil {
		return nil, fmt.Errorf("unable to parse asset URL %q: %w", canonicalURL, err)
	}

	var knownHash *hashing.Hash
	if knownHashString != "" {
		h, err := hashing.FromString(knownHashString)
		if err != nil {
			return nil, fmt.Errorf("unable to parse asset hash %q: %w", knownHashString, err)
		}
		knownHash = h

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Set the instance group machine type to an amd64 or arm64 instance so the resolved arch is supported
  2. Fix programmatic callers to pass architectures.ArchitectureAmd64 or ArchitectureArm64
  3. If another arch is truly needed, host containerd binaries yourself and use the Packages/canonical URL path instead of version-based resolution

Example fix

// before
FindContainerdAsset(ig, b, "armhf")
// after
FindContainerdAsset(ig, b, architectures.ArchitectureArm64)
Defensive patterns

Strategy: validation

Validate before calling

switch arch {
case architectures.ArchitectureAmd64, architectures.ArchitectureArm64:
    // ok
default:
    return fmt.Errorf("arch %q not supported for containerd assets; use amd64 or arm64", arch)
}

Try / catch

asset, err := wellknownassets.FindContainerdAsset(ig, assetBuilder, arch)
if err != nil && strings.Contains(err.Error(), "unknown arch") {
    return fmt.Errorf("instance group architecture is not supported for containerd assets: %w", err)
}

Prevention

When it happens

Trigger: FindContainerdAsset is invoked with an arch value outside architectures.ArchitectureAmd64 / ArchitectureArm64 — e.g. an unsupported/typo'd arch on the instance group or a wrong enum passed by a caller.

Common situations: Provisioning for a niche CPU (ppc64le, s390x, riscv64) that kOps containerd assets do not cover; programmatic callers passing an uninitialized or custom arch value; test code passing an invalid architecture.

Related errors


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