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 = hView on GitHub (pinned to 4c8573c808)
Solutions
- Set the instance group machine type to an amd64 or arm64 instance so the resolved arch is supported
- Fix programmatic callers to pass architectures.ArchitectureAmd64 or ArchitectureArm64
- 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
- Choose instance types that map to amd64/arm64
- Derive the arch from the machine type rather than hardcoding
- Document supported architectures for any internal tooling calling FindContainerdAsset
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
- unknown arch for CNI plugin binaries asset: %s
- unable to find any containerd binaries in assets
- error finding contained version
- error parsing container runtime version %q: %w
- error building containerd flags: %v
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/e813f0cba05bc2e8.
Report an issue: GitHub.