{"record":{"id":"bf2ca6868a1f641f","repo":"kubernetes/kops","slug":"unsupported-legacy-containerd-version-q","errorCode":null,"errorMessage":"unsupported legacy containerd version: %q","messagePattern":"unsupported legacy containerd version: %q","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/nodemodel/wellknownassets/containerd.go","lineNumber":79,"sourceCode":"\t\t}\n\n\t\tassetURL, err := findContainerdVersionUrl(arch, version)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tcanonicalURL = assetURL.String()\n\t}\n\n\treturn buildFileAsset(assetBuilder, canonicalURL, knownHash)\n}\n\nfunc findContainerdVersionUrl(arch architectures.Architecture, version string) (*url.URL, error) {\n\tsv, err := semver.ParseTolerant(version)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"unable to parse version string: %q\", version)\n\t}\n\tif sv.LT(semver.MustParse(\"2.1.0\")) {\n\t\treturn nil, fmt.Errorf(\"unsupported legacy containerd version: %q\", version)\n\t}\n\n\tvar u string\n\tswitch arch {\n\tcase architectures.ArchitectureAmd64:\n\t\tu = fmt.Sprintf(containerdReleaseUrlAmd64, version, version)\n\tcase architectures.ArchitectureArm64:\n\t\tu = fmt.Sprintf(containerdReleaseUrlArm64, version, version)\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unknown arch: %q\", arch)\n\t}\n\n\treturn url.Parse(u)\n}\n\nfunc buildFileAsset(assetBuilder *assets.AssetBuilder, canonicalURL string, knownHashString string) (*assets.FileAsset, error) {\n\tu, err := url.Parse(canonicalURL)\n\tif err != nil {","sourceCodeStart":61,"sourceCodeEnd":97,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/nodemodel/wellknownassets/containerd.go#L61-L97","documentation":"kOps no longer supports containerd versions older than 2.1.0 for release-asset resolution. findContainerdVersionUrl compares the parsed version against 2.1.0 and rejects anything lower with this error. It exists to steer users off end-of-life containerd releases whose URLs/URL patterns kOps no longer maintains.","triggerScenarios":"FindContainerdAsset falls back to version-based URL resolution with containerd.Version set to e.g. '1.7.20', '1.6.9', or any semver below 2.1.0 (and no Packages override supplying a canonicalURL).","commonSituations":"Clusters upgraded from older kOps versions that pinned containerd 1.x; copied cluster specs from templates that still use 1.x; users intentionally wanting an older containerd patch release.","solutions":["Upgrade containerd.version in the cluster spec to 2.1.0 or newer","If an older containerd is mandatory, provide containerd.packages (or equivalent) so a canonicalURL bypasses the version-gate check","Rebuild the cluster spec from a current kOps template with supported containerd versions"],"exampleFix":"// before\ncontainerd:\n  version: \"1.7.20\"\n// after\ncontainerd:\n  version: \"2.1.0\"","handlingStrategy":"validation","validationCode":"sv, err := semver.ParseTolerant(containerdVersion)\nif err == nil && sv.LT(semver.MustParse(\"2.1.0\")) {\n    return fmt.Errorf(\"containerd %s is unsupported; upgrade to >= 2.1.0\", containerdVersion)\n}","typeGuard":null,"tryCatchPattern":"asset, err := wellknownassets.FindContainerdAsset(ig, assetBuilder, arch)\nif err != nil && strings.Contains(err.Error(), \"unsupported legacy containerd version\") {\n    return fmt.Errorf(\"please bump containerd.version to >= 2.1.0: %w\", err)\n}","preventionTips":["Track kOps release notes for supported containerd minimums before upgrades","Avoid pinning legacy 1.x containerd in reused cluster templates","Test cluster spec upgrades in staging with the new containerd version"],"tags":["containerd","version-support","upgrade"],"backgroundTag":"unsupported-version-pinned","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"}