{"record":{"id":"aa809def4558f505","repo":"kubernetes/kops","slug":"evictionminimumreclaim-w","errorCode":null,"errorMessage":"evictionMinimumReclaim: %w","messagePattern":"evictionMinimumReclaim: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"nodeup/pkg/model/kubelet.go","lineNumber":404,"sourceCode":"\t\tevictionHard, err := parseKeyValueList(*kubeletConfig.EvictionHard, \"<\")\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"evictionHard: %w\", err)\n\t\t}\n\t\tcc.EvictionHard = evictionHard\n\t}\n\tevictionSoft, err := parseKeyValueList(kubeletConfig.EvictionSoft, \"<\")\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"evictionSoft: %w\", err)\n\t}\n\tcc.EvictionSoft = evictionSoft\n\tevictionSoftGracePeriod, err := parseKeyValueList(kubeletConfig.EvictionSoftGracePeriod, \"=\")\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"evictionSoftGracePeriod: %w\", err)\n\t}\n\tcc.EvictionSoftGracePeriod = evictionSoftGracePeriod\n\tevictionMinimumReclaim, err := parseKeyValueList(kubeletConfig.EvictionMinimumReclaim, \"=\")\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"evictionMinimumReclaim: %w\", err)\n\t}\n\tcc.EvictionMinimumReclaim = evictionMinimumReclaim\n\n\tfeatureGates, err := parseFeatureGates(kubeletConfig.FeatureGates)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"featureGates: %w\", err)\n\t}\n\tcc.FeatureGates = featureGates\n\n\tif kubeletConfig.EnforceNodeAllocatable != \"\" {\n\t\tcc.EnforceNodeAllocatable = strings.Split(kubeletConfig.EnforceNodeAllocatable, \",\")\n\t}\n\n\tfor _, t := range kubeletConfig.Taints {\n\t\ttaint, err := parseTaint(t)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"taints: %w\", err)\n\t\t}","sourceCodeStart":386,"sourceCodeEnd":422,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/nodeup/pkg/model/kubelet.go#L386-L422","documentation":"EvictionMinimumReclaim is parsed with parseKeyValueList using '=' as separator (e.g. \"memory.available=0Gi\"). Any comma-separated entry lacking '=' produces this wrapped error during kubelet config assembly.","triggerScenarios":"kubeletConfiguration -> parseKeyValueList(kubeletConfig.EvictionMinimumReclaim, \"=\") fails because an entry has no '=' separator.","commonSituations":"Writing threshold-style '<' pairs into minimum-reclaim; typos dropping the value or separator; confusion between the four eviction fields each with its own separator convention ('<' vs '=').","solutions":["Format each entry as key=value, e.g. memory.available=1Gi","Fix the quoted bad pair from the error message","Keep reclaim values separate from threshold ('<') fields","Validate and re-apply the cluster spec"],"exampleFix":"// before\nkubelet:\n  evictionMinimumReclaim: \"memory.available<1Gi\"\n// after\nkubelet:\n  evictionMinimumReclaim: \"memory.available=1Gi\"","handlingStrategy":"validation","validationCode":"func validMinimumReclaim(s string) bool {\n    if s == \"\" { return true }\n    for _, kv := range strings.Split(s, \",\") {\n        if !strings.Contains(kv, \"=\") { return false }\n    }\n    return true\n}","typeGuard":null,"tryCatchPattern":"if _, err := parseKeyValueList(cfg.EvictionMinimumReclaim, \"=\"); err != nil {\n    return fmt.Errorf(\"evictionMinimumReclaim must be key=value pairs: %w\", err)\n}","preventionTips":["Use key=value (e.g. memory.available=1Gi) for minimum reclaim","Keep thresholds and reclaims in their own fields with their own separators","Pre-validate the CSV string before applying the cluster spec"],"tags":["kubelet","eviction","config-parsing"],"backgroundTag":"kubelet-eviction-config-invalid","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"}