Manual backups aren't enough for production. This episode covers `velero schedule create` with cron expressions, setting `--ttl` for auto-expiry, the fundamental differences between a schedule and a manual backup, and retention strategies that match your RPO needs.

The manual backup in episode 4 is good for practice, but for production you need backups that run themselves — every day, every hour, without being reminded. In episode 6 we build that professional habit: automatic schedules with TTL to clean up old backups.
Think of it like your archiving habit: manual means "saving when you remember" (unreliable), while scheduled means "archives come in every day at 02.00, automatically discarded after 30 days". Which one can your business rely on?
velero schedule create daily \
--schedule="0 2 * * *" \
--include-namespaces prod \
--ttl 720h \
--storage-location defaultAnatomy of the command:
daily — the schedule name (a Schedule CRD object).--schedule="0 2 * * *" — a standard cron expression: minute, hour, day-of-month, month, day-of-week. 0 2 * * * means every day at 02:00.--include-namespaces prod — the scope is the same as a manual backup.--ttl 720h — every backup born from this schedule automatically expires after 720 hours (30 days).--storage-location — the target BSL (optional; defaults if there's only one).Some commonly used examples:
| Need | Cron | Meaning |
|---|---|---|
| Every day at 02:00 | 0 2 * * * | daily |
| Every hour | 0 * * * * | hourly, 1 hour RPO |
| Every Monday at 03:30 | 30 3 * * 1 | weekly |
| On the 1st of each month at 04:00 | 0 4 1 * * | monthly |
velero schedule create hourly \
--schedule="0 * * * *" \
--include-namespaces prod \
--ttl 48hvelero schedule get
velero schedule describe daily
velero schedule delete daily --confirmEach schedule creates a Schedule CRD; the server runs the "trigger" — when the time arrives, it creates a new Backup object with the same parameters.
The --ttl flag determines how long a backup is retained. Once it passes, Velero automatically deletes the backup from object storage and updates the CRD status to Expired. The value is written as a duration (e.g. 48h, 720h, 1680h).
velero backup create manual-checkpoint --include-namespaces app --ttl 168h
velero backup getTTL isn't just a cleaner — it's cost and compliance control. Object storage isn't free: backups without TTL pile up, inflate your bill, and slow down backup listing.
A common production strategy combines several schedules with different TTLs:
velero schedule create hourly --schedule="0 * * * *" --include-namespaces prod --ttl 24h
velero schedule create daily --schedule="0 2 * * *" --include-namespaces prod --ttl 720h
velero schedule create weekly --schedule="30 2 * * 0" --include-namespaces prod --ttl 8760hNote
TTL is retention, not immutability. A backup past its TTL can still be deleted earlier manually (velero backup delete). For backups that truly must never be lost (required by compliance), use object lock at the bucket level — we cover this in episode 15.
Understand the fundamental differences:
Backup object directly. Used for specific moments (before a cluster upgrade, migration, risky experiments).Backup each time the cron fires, with the same parameters and TTL.It's not "one is better" — they complement each other: schedules for routine, manual for specific points in time (a checkpoint before the migration in episode 11).
Key takeaways:
velero schedule create + a cron expression creates automatic backups; --ttl controls auto-expiry.48h, 720h (30 days), 8760h (1 year).In episode 7 next, we'll refine backup control: labels, selectors, and annotations — selecting resources by label, marking include/exclude via the velero.io annotation, and setting up --snapshot-volumes and pre/post hooks.