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
- Check the wrapped serialization error for the offending pod field
- Verify KubeSchedulerConfig resource requests/limits (cpuRequest, memoryRequest, cpuLimit, memoryLimit) are valid quantities
- Rebuild kops/nodeup with consistent k8s.io/api and scheme registration versions
- 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
- Use only valid Kubernetes resource quantities in kubeScheduler config
- Avoid patched kops builds with mismatched k8s.io/api dependency versions
- Render manifests with --dry-run before applying to catch serialization issues
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
- error marshaling pod to yaml: %v
- error marshaling manifest to yaml: %v
- error building kube-scheduler pod: %v
- error building kube-scheduler flags: %v
- building nodeConfig for instanceGroup: %w
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/c3dfdafcbd2c079c.
Report an issue: GitHub.