kubernetes/kops · critical
error finding runc asset
Error message
error finding runc asset
What it means
installContainerd searches the nodeup assets for exactly one file matching /runc.(amd64|arm64)$ (the runc binary downloaded from the opencontainers/runc release). The code requires exactly one match; if the count is not 1 — zero (missing asset) or more than one (ambiguous/duplicate assets) — it returns this error at nodeup/pkg/model/containerd.go:143.
Source
Thrown at nodeup/pkg/model/containerd.go:143
f := b.Assets.FindMatches(regexp.MustCompile(`^bin/(containerd|ctr)`))
if len(f) == 0 {
return fmt.Errorf("unable to find any containerd binaries in assets")
}
for k, v := range f {
fileTask := &nodetasks.File{
Path: filepath.Join("/usr/bin", k),
Contents: v,
Type: nodetasks.FileType_File,
Mode: new("0755"),
}
c.AddTask(fileTask)
}
// Add runc binary from https://github.com/opencontainers/runc
// https://github.com/containerd/containerd/issues/6541
f = b.Assets.FindMatches(regexp.MustCompile(`/runc\.(amd64|arm64)$`))
if len(f) != 1 {
return fmt.Errorf("error finding runc asset")
}
for _, v := range f {
fileTask := &nodetasks.File{
Path: "/usr/sbin/runc",
Contents: v,
Type: nodetasks.FileType_File,
Mode: new("0755"),
}
c.AddTask(fileTask)
}
// Add configuration file for easier use of crictl
b.addCrictlConfig(c)
var containerdVersion string
if b.NodeupConfig.ContainerdConfig != nil {
containerdVersion = fi.ValueOf(b.NodeupConfig.ContainerdConfig.Version)
} else {View on GitHub (pinned to 4c8573c808)
Solutions
- Ensure the nodeup assets include exactly one runc.<arch> file for the node's architecture (amd64 or arm64)
- Align the node's OS/arch with the assets actually bundled by `kops create/update cluster`
- If mirroring assets, verify the runc release asset (https://github.com/opencontainers/runc) was included and named as expected (runc.amd64 / runc.arm64)
- Remove duplicate/conflicting runc asset entries if FindMatches yields more than one
Example fix
// asset archive before bin/containerd // asset archive after bin/containerd runc.arm64 # runc binary for the node arch, exactly one
Defensive patterns
Strategy: validation
Validate before calling
tar -tf nodeup-assets.tar.gz | grep -E '/runc\.(amd64|arm64)$' | wc -l # must output exactly 1 before running nodeup
Prevention
- Include exactly one runc.<arch> binary per node architecture in your asset mirror
- Keep runc assets named runc.amd64 / runc.arm64 as kOps expects
- Align kOps and nodeup versions so the expected runc asset path matches
- Avoid injecting custom runc assets that could duplicate the bundled one
When it happens
Trigger: The asset archive lacks a runc binary for the node architecture (regex /runc\.(amd64|arm64)$ matches 0 files), or contains multiple runc files so FindMatches returns >1 entries. Triggered during node bootstrap whenever containerd installation is enabled.
Common situations: Arm64 nodes provisioned with amd64-only assets, mirrored asset stores missing the runc release download, kOps version mismatch where newer nodeup expects runc assets the older cluster config does not carry, or custom asset overrides that add a second runc file.
Related errors
- unable to find any containerd binaries in assets
- unable to locate asset %q
- trying to locate asset %q: %v
- unable to locate asset %q
- unsupported runc version: %q
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/e3159cdfeea8b060.
Report an issue: GitHub.