kubernetes/kops · error

error marshaling manifest to yaml: %v

Error message

error marshaling manifest to yaml: %v

What it means

After KubeProxyBuilder.Build successfully builds the kube-proxy pod, it serializes it with k8scodecs.ToVersionedYaml before writing /etc/kubernetes/manifests/kube-proxy.manifest. Failure of that serialization is wrapped as 'error marshaling manifest to yaml'. Like the controller-manager equivalent, it means the pod object could not be converted to versioned YAML.

Source

Thrown at nodeup/pkg/model/kube_proxy.go:58

// Build is responsible for building the kube-proxy manifest
// @TODO we should probably change this to a daemonset in the future and follow the kubeadm path
func (b *KubeProxyBuilder) Build(c *fi.NodeupModelBuilderContext) error {
	if b.NodeupConfig.KubeProxy == nil {
		klog.V(2).Infof("Kube-proxy is disabled, will not create configuration for it.")
		return nil
	}

	{
		pod, err := b.buildPod()
		if err != nil {
			return fmt.Errorf("error building kube-proxy manifest: %v", err)
		}

		pod.ObjectMeta.Labels["kubernetes.io/managed-by"] = "nodeup"

		manifest, err := k8scodecs.ToVersionedYaml(pod)
		if err != nil {
			return fmt.Errorf("error marshaling manifest to yaml: %v", err)
		}

		c.AddTask(&nodetasks.File{
			Path:     "/etc/kubernetes/manifests/kube-proxy.manifest",
			Contents: fi.NewBytesResource(manifest),
			Type:     nodetasks.FileType_File,
		})
	}

	{
		var kubeconfig fi.Resource
		var err error

		if b.HasAPIServer {
			kubeconfig = b.BuildIssuedKubeconfig("kube-proxy", nodetasks.PKIXName{CommonName: rbac.KubeProxy}, c)
		} else {
			kubeconfig, err = b.BuildBootstrapKubeconfig("kube-proxy", c)
			if err != nil {

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Check the wrapped %v detail to identify the failing pod field
  2. Align nodeup and kops versions (rebuild/re-deploy nodeup from the same release as kops)
  3. Regenerate the node's NodeupConfig via `kops update cluster --yes`
  4. Reproduce with `kops export kubecfg`/cluster inspection to find invalid kubeProxy values; file a kops issue if the config is valid

Example fix

// before (mixed versions)
kops==1.28, nodeup binary from 1.26
// after
kops replace cluster ... ; kops update cluster --yes  # with a single kops version
# rolling update replaces nodeup with the matching version
Defensive patterns

Strategy: try-catch

Validate before calling

if pod == nil || pod.ObjectMeta.Labels == nil || len(pod.Spec.Containers) == 0 {
    return fmt.Errorf("kube-proxy pod incomplete before yaml marshal")
}

Type guard

func isManifestMarshalErr(err error) bool {
    return err != nil && strings.Contains(err.Error(), "error marshaling manifest to yaml")
}

Try / catch

manifest, err := k8scodecs.ToVersionedYaml(pod)
if err != nil {
    return fmt.Errorf("error marshaling manifest to yaml: %v", err)
}
// caller: if isManifestMarshalErr(err), dump the pod struct and check version skew

Prevention

When it happens

Trigger: k8scodecs.ToVersionedYaml(pod) returns an error — non-convertible fields on the pod object, nil required sub-objects (e.g. missing labels/containers populated incorrectly), or codec scheme issues in the nodeup build.

Common situations: kops/nodeup version skew causing pod fields not representable in the target manifest version; corrupted NodeupConfig values injected into the kube-proxy pod; nodeup bugs after upstream API bumps.

Related errors


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