Choosing the right workload object
Choose a workload object by asking what the workload needs. If it runs continuously and any copy can serve any request, use a Deployment: this is the large majority of services. If copies must have stable names, ordered startup and their own storage, use a StatefulSet. If you need exactly one copy per node, use a DaemonSet. If the work finishes, use a Job, and a CronJob when it must run on a schedule.
Press the right arrow to reveal each branch. A useful sanity check: if you find yourself wanting a Deployment with a pinned node or a per-replica volume, you probably want a StatefulSet. If you find a Deployment whose containers exit successfully, you want a Job.
Remember that higher-level platforms often hide these objects. Operators (for example for PostgreSQL or Kafka) create StatefulSets for you, and Knative or KEDA ScaledJobs build on Jobs. Knowing the primitives lets you debug them.
Bare Pods are for experiments and debugging only: nothing recreates them if the node dies, and they cannot be rolled out. Even a single-replica service benefits from a Deployment.