CertGrid CertGrid
Troubleshooting·Podman

Podman Kubernetes YAML Replica Behavior

A Deployment asking for three replicas gets a warning and one pod. Service and StatefulSet are refused by name. Memory limits, CPU and liveness probes, on the other hand, are honoured exactly.

Pods Guide 15 of 47 Advanced

Written against the versions above. Podman follows the distribution here rather than a vendor repository, so the version you get is the one Ubuntu shipped. The commands are stable across 5.x.

Every command on this page ran on podman01.
Server NameIP AddressOSRolesCPURAMHDD
PODMAN01192.168.0.24Ubuntu 26.04 LTSPrimary Container Host2 Core4 GB50 GB

Before you start

  1. A Deployment asking for three

    A perfectly ordinary Deployment: replicas: 3, a selector, a pod template. Play it.

    level=warning msg="Limiting replica count to 1, more than one replica is not
    supported by Podman"

    One pod, named fanout-pod - the Deployment's name with -pod appended.

    This is the most important limit on the whole path, and the warning states it plainly: Podman is not a scheduler. Replicas exist so a controller can spread copies across nodes and replace the ones that die. There is one node here and no controller, so the number has nowhere to go.

    Note that it warns rather than refusing. Your manifest ran, and it did not do what it says. That is the failure mode to watch for - not an error you cannot miss, but a warning above output that otherwise looks like success.

    bash Example session
    podman kube play dep.yamltime="2026-08-22T11:09:34Z" level=warning msg="Limiting replica count to 1, more than one replica is not supported by Podman"Pod:c01315c6a04eb89312c3d4f034f7d842df4f12eb26d0b9aa5c7447a0f5cfe1e0Container:bd394b71b07744a35a8bad14b7c7fd7f394804cd44e743cb588046b67c98bac0podman pod psPOD ID        NAME        STATUS      CREATED        INFRA ID      # OF CONTAINERSc01315c6a04e  fanout-pod  Running     5 seconds ago  28c7cb9a0b0c  2podman kube down dep.yamltime="2026-08-22T11:09:40Z" level=warning msg="Limiting replica count to 1, more than one replica is not supported by Podman"time="2026-08-22T11:09:50Z" level=warning msg="StopSignal SIGTERM failed to stop container fanout-pod-app in 10 seconds, resorting to SIGKILL"Pods stopped:Error: stopping container 28c7cb9a0b0cae85158116ef0856226b8d54a9397afa81fcfbe68c2aab8630af: removing container 28c7cb9a0b0cae85158116ef0856226b8d54a9397afa81fcfbe68c2aab8630af network: 1 error occurred:	* rootless netns: kill network process: permission denied 

    Expected resultThe replica warning, one pod named fanout-pod with two containers.

    Success conditionYou have seen a manifest run successfully and quietly ignore a field.

  2. Two kinds it will not pretend to support

    A Service of type LoadBalancer, and a StatefulSet. Both are valid Kubernetes. Both get the same answer:

    Error: YAML document does not contain any supported kube kind

    Exit 125, nothing created.

    This is the better failure mode, and the contrast with step 1 is the lesson. A Service is a cluster-wide virtual IP with a controller behind it; a StatefulSet is stable identity and ordered rollout across nodes. Podman cannot approximate either, so it declines rather than producing something that looks like it worked.

    The supported set is small and worth memorising: Pod, Deployment, DaemonSet, Job, PersistentVolumeClaim, ConfigMap and Secret. Everything else is this error.

    A practical consequence for anyone testing manifests locally: a file containing a Deployment *and* its Service will fail on the Service, so split it or accept that local play covers only half your deployment.

    bash Example session
    podman kube play svc.yamlError: YAML document does not contain any supported kube kind[exit 125]podman kube play ss.yamlError: YAML document does not contain any supported kube kind[exit 125]

    Expected resultdoes not contain any supported kube kind and exit 125, twice.

    Success conditionYou can name what kube play supports without guessing.

  3. What it does honour, exactly

    Now the other direction, because the limits above make it easy to underestimate this. A Pod with resource limits and a liveness probe:

    mem=67108864 cpu=200000000 health=set
    • memory: "64Mi" became 67108864 bytes. That is 64 x 1024 x 1024 exactly - it parsed the Kubernetes suffix correctly rather than treating Mi as a megabyte.
    • cpu: "200m" became 200000000 NanoCpus. 200 millicores, converted faithfully.
    • The livenessProbe became a Podman healthcheck, which is why podman ps reports Up 1 second (starting) - a state that only exists because something is being checked.

    So the boundary is not "Podman does the easy half". It is specifically about cluster-scoped behaviour: anything needing a scheduler, a virtual IP or coordination between nodes is out, and anything that is a property of one container on one host is in - and implemented properly.

    That makes kube play genuinely useful for what it is good at: checking that a container starts, that its probe passes, that its limits are what you meant, and that the image and command line are right, before any of it reaches a cluster.

    bash Example session
    podman kube play probe.yamlPod:c0fceca7e8bc24e3c27a88bba2c2de45a4f12f74731920dd2af8c313aa3dc614Container:2d2f489672b349382dff3b55c673d4e00890aab805b92e2ff8bfef9946901e2epodman ps --format 'table {{.Names}} {{.Status}}'NAMES               STATUSc0fceca7e8bc-infra  Up 1 secondprobed-web          Up 1 second (starting)podman inspect probed-web --format 'mem={{.HostConfig.Memory}} cpu={{.HostConfig.NanoCpus}} health={{if .Config.Healthcheck}}set{{else}}none{{end}}'mem=67108864 cpu=200000000 health=setpodman kube down probe.yamlPods stopped:Error: stopping container 78824f07de2676baf19fc43e9ffa465abeb2901eeeafdef926dc0af34c1ab987: removing container 78824f07de2676baf19fc43e9ffa465abeb2901eeeafdef926dc0af34c1ab987 network: 1 error occurred:	* rootless netns: kill network process: permission denied  Pods removed:

    Expected resultmem=67108864 cpu=200000000 health=set, and a container reported as (starting).

    Success conditionYou can state the rule for what survives the translation and what does not.

Troubleshooting

Official sources