kubernetes/kops · error

error marshaling pod to yaml: %v

Error message

error marshaling pod to yaml: %v

What it means

After buildPod succeeds, KubeSchedulerBuilder.Build converts the constructed v1.Pod into versioned YAML via k8scodecs.ToVersionedYaml to write /etc/kubernetes/manifests/kube-scheduler.manifest. If the codecs layer cannot serialize the pod (unexpected object shape or API scheme registration issue), the error is wrapped as "error marshaling pod to yaml: %v".

Source

Thrown at nodeup/pkg/model/kube_scheduler.go:83

	if !b.IsMaster {
		return nil
	}

	kubeScheduler := b.NodeupConfig.ControlPlaneConfig.KubeScheduler

	if err := b.writeServerCertificate(c, &kubeScheduler); err != nil {
		return err
	}

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

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

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

	{
		kubeconfig := b.BuildIssuedKubeconfig("kube-scheduler", nodetasks.PKIXName{CommonName: rbac.KubeScheduler}, c)

		c.AddTask(&nodetasks.File{
			Path:     wellknownpaths.KubeSchedulerKubeConfig,
			Contents: kubeconfig,
			Type:     nodetasks.FileType_File,
			Mode:     s("0400"),
		})

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Check the wrapped serialization error for the offending pod field
  2. Verify KubeSchedulerConfig resource requests/limits (cpuRequest, memoryRequest, cpuLimit, memoryLimit) are valid quantities
  3. Rebuild kops/nodeup with consistent k8s.io/api and scheme registration versions
  4. Regenerate manifests via kops update cluster after fixing the config

Example fix

// before (cluster spec)
kubeScheduler:
  cpuLimit: "0.5m"   # invalid quantity
// after
kubeScheduler:
  cpuLimit: "500m"
Defensive patterns

Strategy: validation

Validate before calling

// Ensure scheduler resource fields are valid Kubernetes quantities before nodeup
for name, q := range map[string]string{
	"cpuRequest":    cfg.CPURequest,
	"cpuLimit":      cfg.CPULimit,
	"memoryRequest": cfg.MemoryRequest,
	"memoryLimit":   cfg.MemoryLimit,
} {
	if q != "" {
		if _, err := resource.ParseQuantity(q); err != nil {
			return fmt.Errorf("kubeScheduler.%s %q is not a valid quantity: %w", name, q, err)
		}
	}
}

Try / catch

if err := nodeupBuild(cfg); err != nil {
	if strings.Contains(err.Error(), "error marshaling pod to yaml") {
		log.Errorf("pod serialization failed; check scheduler config quantities/scheme versions: %v", err)
	}
	return err
}

Prevention

When it happens

Trigger: KubeSchedulerBuilder.Build reaching k8scodecs.ToVersionedYaml(pod) with a pod object the scheme cannot version — e.g. pod fields set by buildPod that violate the v1.Pod schema, or a scheme registration problem in the linked Kubernetes libraries.

Common situations: Custom/patched kops builds with mismatched k8s.io/api versions; extremely unusual KubeSchedulerConfig values producing out-of-range resource quantities (e.g. bad CPU/memory limits propagated into the pod spec).

Related errors


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