kubernetes/kops · error

marshaling Karpenter resource for %q: %w

Error message

marshaling Karpenter resource for %q: %w

What it means

Returned by marshalKarpenterResource when yaml.Marshal fails to serialize a Karpenter resource (EC2NodeClass or NodePool) for the given instance group. This indicates the in-memory Karpenter object contains a value the YAML encoder cannot represent (e.g. cyclic references, unsupported types, or a custom marshaler error). The instance group name is included for identification.

Source

Thrown at upup/pkg/fi/cloudup/template_functions_karpenter.go:209

	nodeClass, err := tf.buildKarpenterEC2NodeClass(ig)
	if err != nil {
		return "", err
	}
	return marshalKarpenterResource(ig, nodeClass)
}

func (tf *TemplateFunctions) KarpenterNodePool(ig *kops.InstanceGroup) (string, error) {
	nodePool, err := tf.buildKarpenterNodePool(ig)
	if err != nil {
		return "", err
	}
	return marshalKarpenterResource(ig, nodePool)
}

func marshalKarpenterResource(ig *kops.InstanceGroup, object interface{}) (string, error) {
	data, err := yaml.Marshal(object)
	if err != nil {
		return "", fmt.Errorf("marshaling Karpenter resource for %q: %w", ig.Name, err)
	}
	return strings.TrimSpace(string(data)), nil
}

func (tf *TemplateFunctions) buildKarpenterEC2NodeClass(ig *kops.InstanceGroup) (*karpenterEC2NodeClass, error) {
	amiSelectorTerms, err := buildKarpenterAMITerms(ig.Spec.Image)
	if err != nil {
		return nil, fmt.Errorf("building amiSelectorTerms for %q: %w", ig.Name, err)
	}

	instanceProfile, err := tf.LinkToIAMInstanceProfile(ig)
	if err != nil {
		return nil, fmt.Errorf("building instance profile for %q: %w", ig.Name, err)
	}

	tags, err := tf.CloudTagsForInstanceGroup(ig)
	if err != nil {
		return nil, fmt.Errorf("building tags for %q: %w", ig.Name, err)

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Read the wrapped yaml.Marshal error to find the failing field
  2. Inspect karpenterEC2NodeClass/nodePool fields populated for the named instance group
  3. Ensure new fields are YAML-serializable types (strings, ints, maps, slices)
  4. Add or fix custom MarshalYAML implementations if needed

Example fix

// before: field with unsupported type
status any // holds arbitrary runtime values
// after
status string // or a struct of YAML-friendly typed fields
Defensive patterns

Strategy: try-catch

Validate before calling

if _, err := yaml.Marshal(object); err != nil {
	return fmt.Errorf("karpenter resource for %q not YAML-serializable: %w", ig.Name, err)
}

Type guard

func isYAMLEncodable(v interface{}) bool { _, err := yaml.Marshal(v); return err == nil }

Try / catch

out, err := karpenterFn(ig)
if err != nil {
	return fmt.Errorf("karpenter resource for %q: %w", ig.Name, err)
}

Prevention

When it happens

Trigger: Calling KarpenterEC2NodeClass or KarpenterNodePool for an instance group where the built karpenterEC2NodeClass/nodePool struct contains unmarshalable data passed to yaml.Marshal.

Common situations: A newly added field on the Karpenter structs has a type go-yaml cannot encode; a custom MarshalYAML returns an error; non-primitive runtime values leaked into a field.

Related errors


AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05). Data as JSON: /api/errors/3fe1ec2a5d35c145. Report an issue: GitHub.