Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

ADR-26040: Podman Kube YAML as Deployment Standard


title: Podman Kube YAML as Deployment Standard date: 2026-03-09 tags:


ADR-26040: Podman Kube YAML as Deployment Standard

Date

2026-03-09

Status

Accepted

Context

ADR-26039: pgvector as Ecosystem Database Standard is deployment-agnostic — it decides what database to use but not how to run it. The ecosystem needs a standard way to define, deploy, and manage containerized services (Postgres with pgvector, future agent services, supporting infrastructure).

The ecosystem already runs production services (Forgejo, Traefik, Nextcloud) using Podman with Kubernetes YAML manifests and systemd integration. ADR-26009: Adoption of Ansible for Idempotent Configuration Management decides the orchestration layer (Ansible replacing bash scripts), but the underlying deployment artifact — the Kube YAML manifest — needs to be standardized as the single format for describing containerized workloads.

Three requirements drive this decision:

  1. Portability: manifests should work on any Linux machine with Podman installed, without additional tooling

  2. Lifecycle management: containers must survive reboots and be manageable via standard system tools

  3. Rootless by default: containers run under a non-root user, consistent with the ecosystem’s security posture

Decision

We adopt Kubernetes YAML manifests executed via Podman as the single format for all containerized deployments in the ecosystem.

  1. Kube YAML as the deployment artifact. Each containerized service is defined as a standard Kubernetes Pod manifest (apiVersion v1, kind Pod). Template variables are rendered by the orchestration layer (ADR-26009) before deployment. The manifest is the version-controlled, reviewable artifact — the orchestrator is a separate concern.

  2. podman-kube@.service for lifecycle management. Podman’s built-in systemd template unit maps a Kube YAML file path to a systemd service. This provides boot persistence, restart-on-failure, and journalctl logging via systemctl --user — rootless by default. This replaces the legacy podman generate systemd approach (deprecated in Podman 5+).

  3. Named volumes for persistent data. Stateful services (databases, configuration) use Podman named volumes referenced via PersistentVolumeClaim in the manifest. Volume creation and pre-population are the orchestrator’s responsibility, not the manifest’s.

Consequences

Positive

Negative / Risks

Alternatives

References

Participants

  1. Vadim Rudakov

  2. Claude Opus 4.6