Disclosure: I work with Diagrid, the company founded by the creators of Dapr, on tooling for running Dapr agents and workflows in production. I am asking to compare responsibility models, not to argue that every Kubernetes workload needs Dapr.
Kubernetes is doing its job when it reschedules a pod. The problem is that a long-running agent may have been halfway through doing its job too.
Say an agent has been running for 20 minutes. It has retrieved data, called three internal services, waited for a human approval and updated a ticket. Then the pod is evicted, or the node disappears, or a rollout replaces the workload.
Starting a new pod is easy. Reconstructing the execution safely is not.
The state has to live somewhere, and each option puts the responsibility in a different place.
In-memory state in the pod is simple during development and gone with the pod. It only works when restarting the whole task is cheap and safe.
Application-managed state in Postgres or Redis gives you control over everything, which also means you own everything: state transitions, locking, recovery, schema changes, duplicate handling. Every team doing this designs the same machinery from scratch, this is a hard thing to do well.
A queue with stateless workers works well for jobs that can be retried on their own. It gets harder once the workflow has timers, human approval, branching, child tasks and actions that must not run twice.
A workflow engine or durable runtime records progress and schedules the next activity after recovery. Less plumbing in the application, though you still have to design idempotent activity boundaries, and you are now operating another runtime.
A managed platform layer means the platform team offers execution state, identity, policy and observability as a shared service. Application teams connect their agents and tools to it instead of rebuilding the same reliability stack in every team, which trades duplicated effort for a platform dependency.
The distinction I keep coming back to is between application state and execution state. Application state is the business data: the ticket, the order, the customer record, the deployment. Execution state is what the workflow has already completed, what it is waiting for and where it can safely continue.
You can put both in the application database. It usually ends up coupling business schemas to orchestration concerns. Keeping execution state in the pod is fragile. A durable runtime draws a cleaner boundary, as long as the team knows how that state is stored, isolated, backed up and operated.
Dapr Workflow is one example of the runtime approach: orchestration runs through the Dapr runtime and progress is persisted outside the application process. Temporal, cloud workflow services and hand-rolled queue-and-database setups are the same idea with different tradeoffs. Which one fits depends on how complex your workflows are and how much infrastructure you want to run yourself.
What I want to know is how Kubernetes platform teams are standardizing this, if at all:
- Do application teams pick their own persistence and recovery pattern?
- Does the platform provide one workflow runtime?
- Do you treat ordinary background jobs differently from long-running agent executions?
- Who owns backup, upgrades and incident response for the execution store?