{"record":{"id":"e3159cdfeea8b060","repo":"kubernetes/kops","slug":"error-finding-runc-asset","errorCode":null,"errorMessage":"error finding runc asset","messagePattern":"error finding runc asset","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"nodeup/pkg/model/containerd.go","lineNumber":143,"sourceCode":"\tf := b.Assets.FindMatches(regexp.MustCompile(`^bin/(containerd|ctr)`))\n\tif len(f) == 0 {\n\t\treturn fmt.Errorf(\"unable to find any containerd binaries in assets\")\n\t}\n\tfor k, v := range f {\n\t\tfileTask := &nodetasks.File{\n\t\t\tPath:     filepath.Join(\"/usr/bin\", k),\n\t\t\tContents: v,\n\t\t\tType:     nodetasks.FileType_File,\n\t\t\tMode:     new(\"0755\"),\n\t\t}\n\t\tc.AddTask(fileTask)\n\t}\n\n\t// Add runc binary from https://github.com/opencontainers/runc\n\t// https://github.com/containerd/containerd/issues/6541\n\tf = b.Assets.FindMatches(regexp.MustCompile(`/runc\\.(amd64|arm64)$`))\n\tif len(f) != 1 {\n\t\treturn fmt.Errorf(\"error finding runc asset\")\n\t}\n\tfor _, v := range f {\n\t\tfileTask := &nodetasks.File{\n\t\t\tPath:     \"/usr/sbin/runc\",\n\t\t\tContents: v,\n\t\t\tType:     nodetasks.FileType_File,\n\t\t\tMode:     new(\"0755\"),\n\t\t}\n\t\tc.AddTask(fileTask)\n\t}\n\n\t// Add configuration file for easier use of crictl\n\tb.addCrictlConfig(c)\n\n\tvar containerdVersion string\n\tif b.NodeupConfig.ContainerdConfig != nil {\n\t\tcontainerdVersion = fi.ValueOf(b.NodeupConfig.ContainerdConfig.Version)\n\t} else {","sourceCodeStart":125,"sourceCodeEnd":161,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/nodeup/pkg/model/containerd.go#L125-L161","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"// asset archive before\nbin/containerd\n// asset archive after\nbin/containerd\nrunc.arm64   # runc binary for the node arch, exactly one","handlingStrategy":"validation","validationCode":"tar -tf nodeup-assets.tar.gz | grep -E '/runc\\.(amd64|arm64)$' | wc -l\n# must output exactly 1 before running nodeup","typeGuard":null,"tryCatchPattern":null,"preventionTips":["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"],"tags":["nodeup","runc","assets"],"backgroundTag":"missing-asset-in-bundle","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T07:17:12.445Z"}