kubernetes/kops · error

error serializing addons

Error message

error serializing addons: %v

What it means

For addons of type 'additionalObjects', Build creates an in-memory manifest location and serializes the objects to YAML via ToYAML(). This error is returned if that serialization fails, blocking generation of the addon source bytes.

Solutions

  1. Inspect the wrapped %v error to find the failing object/field
  2. Fix or regenerate the additionalObjects in the addon channel manifest
  3. Remove the addon entry if the objects are no longer needed
  4. Upgrade kops/addon channel to compatible versions

Example fix

// before (channel yaml)
additionalObjects:
- apiVersion: v1
  kind: ConfigMap
  unknownField: <custom type>
// after: only standard serializable objects
additionalObjects:
- apiVersion: v1
  kind: ConfigMap
  metadata:
    name: my-config
Defensive patterns

Strategy: validation

Validate before calling

// Validate additionalObjects decode as Kubernetes objects first
for _, obj := range addon.Spec.AdditionalObjects {
    if obj.APIVersion == "" || obj.Kind == "" {
        return fmt.Errorf("additionalObject %v missing apiVersion/kind", obj)
    }
}

Try / catch

yamlBytes, err := applyAdditionalObjectsToCluster.ToYAML()
if err != nil {
    return fmt.Errorf("cannot serialize additionalObjects addon: %w", err)
}

Prevention

When it happens

Trigger: Building a cluster whose spec.addons include an addon with additionalObjects (or additionalObjects addons provided externally) where one of the embedded Kubernetes objects cannot be converted to YAML by applyAdditionalObjectsToCluster.ToYAML().

Common situations: additionalObjects entries with fields that fail YAML/JSON marshaling (e.g. raw nested values from a hand-written channel); version skew between kops and the addon channel format.

Related errors


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

Appendix: source

Thrown at upup/pkg/fi/cloudup/bootstrapchannelbuilder/bootstrapchannelbuilder.go:180

				applyAdditionalObjectsToCluster = append(applyAdditionalObjectsToCluster, addon)
			}
		}
	}

	if len(applyAdditionalObjectsToCluster) != 0 {
		key := "cluster-addons.kops.k8s.io"
		location := key + "/default.yaml"

		addon := addons.Add(&channelsapi.AddonSpec{
			Name:     new(key),
			Selector: map[string]string{"k8s-addon": key},
			Manifest: new(location),
		})
		addon.SkipRemap = true

		manifestBytes, err := applyAdditionalObjectsToCluster.ToYAML()
		if err != nil {
			return fmt.Errorf("error serializing addons: %v", err)
		}
		addon.Source = fi.NewBytesResource(manifestBytes)
		addon.SkipRender = true
	}

	preRegisterAddonImages := b.shouldPreRegisterAddonImages()

	var addonTasks []*AddonManifest
	for _, addon := range addons.Items {
		if preRegisterAddonImages {
			if err := addon.CollectImages(b.assetBuilder, b.addonRenderer); err != nil {
				klog.Warningf("unable to pre-register addon images for %q: %v", addonKey(addon.Spec), err)
			}
		}

		task := &AddonManifest{
			Name:      new(b.Cluster.ObjectMeta.Name + "-addons-" + addonKey(addon.Spec)),
			Lifecycle: b.Lifecycle,

View on GitHub (pinned to 4c8573c808)