{"record":{"id":"3690dbcd4f967c57","repo":"kubernetes/kops","slug":"building-node-labels-for-q-w","errorCode":null,"errorMessage":"building node labels for %q: %w","messagePattern":"building node labels for %q: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/template_functions_karpenter.go","lineNumber":407,"sourceCode":"\t}\n\tresolved, err := cloud.ResolveImage(image)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"unable to resolve image %q: %w\", image, err)\n\t}\n\tif resolved == nil {\n\t\treturn \"\", fmt.Errorf(\"unable to resolve image %q: not found\", image)\n\t}\n\trootDeviceName := fi.ValueOf(resolved.RootDeviceName)\n\tif rootDeviceName == \"\" {\n\t\treturn \"\", fmt.Errorf(\"image %q has no root device name\", image)\n\t}\n\treturn rootDeviceName, nil\n}\n\nfunc (tf *TemplateFunctions) buildKarpenterNodePool(ig *kops.InstanceGroup) (*karpenterNodePool, error) {\n\tlabels, err := nodelabels.BuildNodeLabels(tf.Cluster, ig)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"building node labels for %q: %w\", ig.Name, err)\n\t}\n\tlabels = karpenterNodePoolTemplateLabels(labels)\n\n\ttemplate := karpenterNodeClaimTemplate{\n\t\tSpec: karpenterNodeClaimSpec{\n\t\t\tRequirements: tf.karpenterRequirements(ig),\n\t\t\tNodeClassRef: karpenterNodeClassRef{\n\t\t\t\tGroup: karpenterAWSAPIGroup,\n\t\t\t\tKind:  \"EC2NodeClass\",\n\t\t\t\tName:  ig.Name,\n\t\t\t},\n\t\t},\n\t}\n\tif len(labels) != 0 {\n\t\ttemplate.Metadata = &karpenterNodeClaimMetadata{Labels: labels}\n\t}\n\tfor _, taintSpec := range ig.Spec.Taints {\n\t\ttaint, err := kopsutil.ParseTaint(taintSpec)","sourceCodeStart":389,"sourceCodeEnd":425,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/template_functions_karpenter.go#L389-L425","documentation":"buildKarpenterNodePool calls nodelabels.BuildNodeLabels to compute Kubernetes node labels for the InstanceGroup; when that helper fails, the error is wrapped as 'building node labels for %q: %w'. It blocks rendering of the Karpenter NodePool manifest during template expansion.","triggerScenarios":"BuildNodeLabels returns an error while building a NodePool for an InstanceGroup — e.g. an invalid label key/value in the InstanceGroup spec or cluster config that fails validation by the nodelabels package.","commonSituations":"InstanceGroup spec nodeLabels containing characters invalid in Kubernetes label keys/values (uppercase, illegal prefixes, too long), or reserved kops label collisions.","solutions":["Inspect the wrapped inner error for the offending label","Fix nodeLabels in the instance group spec to be valid Kubernetes label key/value pairs (RFC 1123 DNS labels)","Remove or rename labels that conflict with reserved kops/system labels","Re-run `kops update cluster`"],"exampleFix":"// before\nnodeLabels:\n  MyLabel/Env: Production\n// after\nnodeLabels:\n  mylabel/env: production","handlingStrategy":"validation","validationCode":"// validate nodeLabels before update\nfor k, v := range ig.Spec.NodeLabels {\n\tif err := labels.ValidateLabelKey(k); err != nil || err := labels.ValidateLabelValue(k, v); err != nil {\n\t\treturn fmt.Errorf(\"invalid node label %s=%s: %w\", k, v, err)\n\t}\n}","typeGuard":null,"tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"building node labels\") {\n\treturn fmt.Errorf(\"fix nodeLabels for instance group: %w\", err)\n}","preventionTips":["Use lowercase RFC 1123 label keys/values in nodeLabels","Avoid reserved kops/system label prefixes (kops.k8s.io/, kubernetes.io/)","Run `kops validate` or dry-run update before applying"],"tags":["kubernetes","node-labels","karpenter","validation"],"backgroundTag":"invalid-node-label","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"}