Cómo funciona Tenax¶
Tenax es un operador de Kubernetes. Tú declaras adónde van los respaldos, con qué frecuencia y durante cuánto tiempo, y qué bases de datos; Tenax se encarga del resto.
flowchart LR
subgraph Declared["Declared in git"]
S[BackupStore<br/>bucket + keys]
P[BackupPolicy<br/>schedule, retention, window]
T[BackupTarget<br/>one database]
end
subgraph Created["Created by Tenax or by you"]
B[Backup<br/>one full backup]
R[Restore<br/>to a sandbox, new DB, download, in place]
X[Sandbox<br/>a throwaway database]
end
T --> P --> S
T -. schedule .-> B
R -. sandbox .-> X
| Recurso | Ámbito | Quién lo crea | Qué es |
|---|---|---|---|
BackupStore |
clúster | tú | Un bucket S3, sus credenciales y los destinatarios age para los que se cifra cada objeto. |
BackupPolicy |
namespace | tú (o los presets del chart) | Calendario, ventana de restauración puntual, niveles de retención, límites, protección de carga, verificación, compresión. |
BackupTarget |
namespace, junto a la base de datos | tú | Un servidor de base de datos: motor, endpoint, credenciales, política, comprobaciones, máscaras. |
Backup |
namespace del objetivo | Tenax (calendario, respaldo inmediato, reinicio de cadena) | Una ejecución de respaldo completo. Solo se conservan como objetos los últimos; S3 los guarda todos. |
Restore |
namespace del objetivo | tú, la consola o la CLI | Un plan desde un momento o un ID de respaldo hacia un destino. |
Sandbox |
clúster | un Restore a un sandbox |
Una base de datos privada con TTL, credenciales y una consola de consultas. |
La ruta de los datos¶
flowchart LR
db[(Postgres / MySQL)] -->|pg_basebackup, pg_dump, mysqldump| mover[mover Job]
db -->|WAL receiver, mysqlbinlog| streamer[streamer]
mover --> pipe[zstd → age → SHA-256 → parallel multipart]
streamer --> pipe
pipe --> s3[(S3 bucket<br/>manifest.json written last)]
s3 --> restorer[restorer Job<br/>verify → decrypt → replay → checks]
restorer --> dest[sandbox · new database · in place · download]
- El controlador solo planifica. Los movedores y restauradores son Jobs; cada objetivo con recuperación puntual tiene un Deployment de streamer. Los bytes nunca pasan por el controlador ni por la API.
- Nada se cuelga. Sin montajes, iSCSI, FUSE ni dispositivos de bloque; a las bases de datos solo se llega por red. Cada llamada de E/S tiene un deadline, cada flujo un watchdog de progreso, y las herramientas hijas se ejecutan en su propio grupo de procesos para que mueran con él.
- Crash-only. Cualquier pod puede morir en cualquier momento. El estado vive en CRDs y en S3, y un respaldo solo existe una vez escrito su manifiesto, que va al final, así que un respaldo a medio escribir nunca se confunde con uno completo.
El catálogo y la consola¶
tenax-api lista los manifiestos de cada store al arrancar y mantiene un índice en memoria: objetivos, respaldos,
segmentos de cambios y ventanas de restauración puntual. Los inventarios y las vistas previas enmascaradas se cifran
para una clave adicional de catálogo que puede leerlos pero no descifrar volcados ni WAL
(ADR 0009). La caché es desechable; S3 es la fuente de verdad.