MinervaDB · Cloud Native Database Support · 24×7 SRE for PostgreSQL, MySQL, MariaDB, MongoDB, Redis, Cassandra, ClickHouse and Kafka on Kubernetes
Cloud Native Database Support: Stateful Databases on Kubernetes, Engineered for Failover and Recovery
Kubernetes changes how a database is scheduled, stored, promoted and secured. MinervaDB Cloud Native Database Support is the engineering team that makes those changes safe: we design the operator, storage and zone layout, prove failover and point-in-time recovery with timed drills, and answer Severity-1 incidents in 15 minutes around the clock, on self-managed clusters and on EKS, GKE, AKS and OpenShift.
Reference architecture
The reference platform behind our Cloud Native Database Support
A cloud native database is a declarative system: desired state lives in Git, a controller reconciles it continuously, storage attaches through an API, and every network path is a policy decision. This is the topology our Cloud Native Database Support engineers design, review and operate most often, shown for PostgreSQL; the same shape applies to the other engines with their own operators.
Figure 1. Reference architecture for cloud native database support: GitOps, control plane, operator, three zones with separate data and WAL volumes, pooled rw and ro Services, and an archive outside the cluster's blast radius.
Replicas never share a failure domain
In cloud native database support reviews this is the first check: required anti-affinity on topology.kubernetes.io/zone, not preferred and not by node alone. Three instances in one zone is one instance with extra storage cost.
The write endpoint belongs to the operator
With cloud native database support, applications connect to the rw Service or the pooler, never to a pod address, so a promotion is invisible to clients that reconnect correctly.
The archive lives somewhere else
Under cloud native database support, a backup on the same storage class, in the same account, deletable by the same service account, is a copy rather than a backup. The archive gets its own account and object lock.
Cloud Native Database Support is engine-specific in its details. The table below lists the operators we run most often and what we check before we accept one into production. We support the operator you already run; when a client asks for a recommendation, the rubric in the next section decides, not popularity. For ClickHouse on Kubernetes, our sister company ChistaDATA provides the dedicated ClickHouse practice.
| Engine | Operators we support | What we verify before production |
|---|---|---|
| PostgreSQL | CloudNativePG, Percona Operator for PostgreSQL, Crunchy PGO, Zalando postgres-operator | Fence-before-promote, quorum synchronous replication, timestamp PITR, WAL archive age as a condition |
| MySQL, MariaDB | Percona Operator for MySQL (PXC and group replication), MariaDB Operator, Vitess operator | Split-brain protection, GTID continuity through failover, ProxySQL or MaxScale routing on promotion |
| MongoDB | Percona Operator for MongoDB, MongoDB Controllers for Kubernetes | Replica-set member placement by zone, election priorities, oplog window against re-sync time |
| Redis, Valkey | Operator chosen per workload, or a managed service | Persistence mode, Sentinel or cluster-mode failover behaviour, memory limit versus maxmemory |
| Cassandra | K8ssandra (cass-operator) | Rack-to-zone mapping, repair scheduling, bootstrap time for a replaced node |
| Kafka | Strimzi | KRaft controller quorum placement, rack awareness, min.insync.replicas against acks |
Operators
Operators and the reconciliation loop in Cloud Native Database Support
An operator is a controller that encodes database operations as software. It watches a custom resource, compares it with the live cluster and issues the smallest set of actions that closes the gap. Every cloud native database support decision is ultimately expressed through that loop, which is why we read operator release notes the way we read engine release notes.
Figure 2. One pass of the reconciliation loop, with an example spec and a degraded cluster. The ordering of actions is what separates a safe operator from a fast one.
Two consequences follow for cloud native database support. Manual intervention is temporary, because anything changed by hand is reverted unless the resource that describes it changes too. And an operator upgrade is a production change, because the reconciliation logic is what decides whether your primary is fenced correctly. We pin operator versions, rehearse operator upgrades in a staging cluster with the production storage class, and keep them on a separate calendar from engine upgrades. The Kubernetes operator pattern describes the mechanism.
Our operator rubric has five questions. Does it fence before it promotes? Does it restore to a timestamp rather than a segment boundary? Can it roll a minor version without a rebuild? Does it expose replication lag and archive age as status conditions? Is the project openly governed with a published support window? The manifest on the right is the baseline Cloud Native Database Support starts from on CloudNativePG, with quorum synchronous replication, separate WAL storage, required zone anti-affinity and Guaranteed memory.
# CloudNativePG Cluster (operator 1.30.x, Kubernetes 1.37). Example values: size from your own baseline.
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: orders-pg
namespace: db-orders
spec:
instances: 3
imageName: ghcr.io/cloudnative-pg/postgresql:17.6 # pin a digest in production
primaryUpdateStrategy: unsupervised
postgresql:
synchronous:
method: any # quorum: ANY 1 of the standbys must confirm
number: 1
dataDurability: required # refuse writes rather than silently go async
parameters:
shared_buffers: "8GB"
max_connections: "300" # the pooler fans in; backends cost cgroup memory
storage:
storageClass: db-gp3-wffc
size: 400Gi
walStorage:
storageClass: db-gp3-wffc
size: 100Gi
affinity:
enablePodAntiAffinity: true
topologyKey: topology.kubernetes.io/zone
podAntiAffinityType: required
resources:
requests: {cpu: "4", memory: "32Gi"}
limits: {memory: "32Gi"} # memory request = limit; no CPU limit (see throttling)
superuserSecret:
name: orders-pg-superuser # created from your secret manager, never committedStorage
StatefulSets, PVCs and the CSI path every commit travels
Every durability promise a database makes is a claim about what happened when it called fsync. On Kubernetes that call crosses six layers, and each one can change latency or throughput ceilings without the engine noticing. Cloud Native Database Support instruments all six before anyone touches a database parameter.
Figure 3. The fsync path from engine to node, the lever at each layer, and the StorageClass rules cloud native database support enforces for database volumes.
A zonal block volume can attach only to a node in its own zone. If that zone is out of capacity after a node loss, the pod stays Pending rather than moving, so storage topology is part of the availability design. WaitForFirstConsumer makes the scheduler and the provisioner agree on a zone before any volume exists, and reclaimPolicy: Retain keeps a deleted PVC from deleting the data. Since Kubernetes 1.34, VolumeAttributesClass lets us change provisioned IOPS and throughput on a live volume by switching its class, where the CSI driver supports it.
| Symptom | Likely cause | What Cloud Native Database Support changes |
|---|---|---|
| Commit latency spikes every few hours | Burst-credit exhaustion on a baseline-IOPS volume | Provisioned IOPS class sized for throughput, not capacity |
| Checkpoint stalls | Flush against a throughput-capped device | Spread checkpoints, raise throughput, separate WAL volume |
| Pod Pending after node loss | Zonal volume cannot attach in the surviving zone | Zone-aware placement; fail over by replication |
| Slow restore from snapshot | Lazily hydrated blocks read on first access | Pre-warm, or restore from the archive stream |
| Disk full despite retention | Archive failing, WAL retained for safety | Alert on archive age, not only on archive errors |
# StorageClass and VolumeAttributesClass for database volumes (AWS EBS CSI shown; GA since Kubernetes 1.34)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: db-gp3-wffc
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer # scheduler and volume agree on the zone first
allowVolumeExpansion: true
reclaimPolicy: Retain # a deleted PVC must not delete the data
parameters:
type: gp3
csi.storage.k8s.io/fstype: xfs
encrypted: "true"
kmsKeyId: ${KMS_KEY_ARN}
---
apiVersion: storage.k8s.io/v1
kind: VolumeAttributesClass
metadata:
name: db-gp3-12k
driverName: ebs.csi.aws.com
parameters:
iops: "12000"
throughput: "500" # MiB/s; change the PVC's class to re-tier onlineHigh availability
Fence-first failover: the standard Cloud Native Database Support holds every operator to
A promotion that happens before the old writer is fenced produces two primaries and a reconciliation problem no backup can fully undo. Speed without exclusion is worthless, so cloud native database support audits fencing first and promotion time second. The sequence below is the behaviour we require, and the numbers we measure in every drill.
Figure 4. Fence-first failover across five swimlanes. Timings are illustrative; each cluster's real values come from its own drills.
Cloud Native Database Support game days record three numbers that are routinely confused. Detection time is how long the platform takes to believe the primary is gone, and it is set by lease and probe settings. Promotion time runs from a completed fence to the first write accepted on the new primary. Application recovery time runs from the first client error to the first successful transaction, and includes endpoint propagation, pool eviction and retry backoff. The last number is the one your users feel, and the one a vendor datasheet never quotes.
Synchronous quorum replication decides what a failover can lose. With method: any and number: 1, a commit is acknowledged only after one standby confirms it, so the best candidate holds every acknowledged transaction. With dataDurability: required, the primary stops accepting writes rather than silently degrading to asynchronous when no standby is available. That is a deliberate availability-for-durability trade we agree with each client in writing. When an outage is already in progress, our 24/7 emergency DBA coverage takes the call.
Planned switchovers run through a script with a verification step before, a typed confirmation gate, and validation after. Rollback is the same script targeting the previous primary once it is streaming again.
#!/usr/bin/env bash
# Planned switchover with a confirmation gate. Requires the cnpg kubectl plugin matching the operator version.
set -euo pipefail
NS=db-orders; CL=orders-pg; TARGET=${1:?usage: switchover.sh <target-instance>}
# 1. Verify before: topology, lag and archive health, queried on the current primary
PRIMARY=$(kubectl get cluster "$CL" -n "$NS" -o jsonpath='{.status.currentPrimary}')
kubectl cnpg status "$CL" -n "$NS"
kubectl exec -n "$NS" "$PRIMARY" -c postgres -- psql -At -c \
"SELECT application_name, sync_state, pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS lag_bytes FROM pg_stat_replication;"
# 2. Confirmation gate: nothing changes without an explicit, typed answer
read -r -p "Promote ${TARGET} in ${NS}/${CL}? Type the cluster name to continue: " ANSWER
[[ "$ANSWER" == "$CL" ]] || { echo "aborted, no change made"; exit 1; }
# 3. Act
kubectl cnpg promote "$CL" "$TARGET" -n "$NS"
# 4. Validate after: new primary, rw Service endpoint, replicas streaming again
kubectl get cluster "$CL" -n "$NS" -o jsonpath='{.status.currentPrimary}{"\n"}'
kubectl get endpointslices -n "$NS" -l kubernetes.io/service-name="${CL}-rw" -o wide
kubectl cnpg status "$CL" -n "$NS"
# Rollback: run this script again with the previous primary as TARGET once it is streaming.Connections
Service routing, pooling and the client half of every failover
Most tickets that arrive as "the database went down" are connection-layer tickets. The database recovered in seconds; the application took minutes because a pool held dead sockets and a retry policy backed off without a cap. Cloud Native Database Support treats the client path as part of the database.
A Service is not a proxy
Cloud Native Database Support starts here: on failover the rw Service endpoint moves. Existing TCP sessions are not migrated, they are broken, and every client must notice quickly and reconnect.
Pool in front of the database
PgBouncer, ProxySQL or MaxScale absorbs reconnect storms, caps backends and gives one place to pause traffic during a switchover. Cloud Native Database Support requires it above a few hundred client connections.
Connections cost cgroup memory
max_connections is a memory budget, not a capacity plan. Each backend is charged to the same container limit that can OOM-kill the primary.
Separate rw and ro pools
Applications that distinguish read and write endpoints lose only the write path during a promotion. Readers keep serving from healthy replicas.
Bounded retry with jitter
Short socket timeouts, a capped retry budget and a health check that runs a real query, not a TCP dial. Only idempotent statements are retried.
Mesh for mTLS, not retries
Where a service mesh exists we use it for mutual TLS and outlier detection. A mesh that retries a non-idempotent write is a data-integrity hazard.
CPU and memory
Requests, limits, QoS and CPU throttling in Cloud Native Database Support
The most common regression we see in cloud native database support work has nothing to do with the engine. It is CPU throttling from a limit that looked generous on a spreadsheet: a checkpoint that briefly needs six cores is held to the quota of two, and the symptom appears as random latency while average CPU looks idle.
Figure 5. An illustrative model of CFS quota throttling during a checkpoint burst, the metrics that prove it, and the settings cloud native database support applies to stateful pods.
| Setting | What it really does | Our guidance for databases |
|---|---|---|
| CPU request | Scheduling weight and guaranteed share under contention | Size to observed p95, never below it |
| CPU limit | Hard quota per 100 ms period; excess is throttled | Usually omit, or set far above the request, and alert on throttled periods |
| Memory request and limit | Eviction protection and a hard ceiling that kills, not slows | Equal values for Guaranteed QoS; engine cache plus connections plus 25 percent headroom |
| Huge pages | Smaller page tables for large shared memory | Enable for large buffer pools; reserve on the node first |
| PriorityClass and PDB | Eviction order and voluntary disruption budget | High priority; a PDB that never permits quorum loss |
Page cache is charged to the container's cgroup, so a database that leans on the OS cache can be evicted for memory it would happily give back. Cloud Native Database Support sizes the engine cache explicitly and alerts on throttling counters rather than on average CPU. The mechanics are in the Kubernetes resource management guide; since Kubernetes 1.35, in-place pod resize lets us raise CPU without a restart, where the operator supports it.
# Share of CFS periods in which a database container was throttled (cAdvisor metrics)
sum by (namespace, pod, container) (
rate(container_cpu_cfs_throttled_periods_total{namespace=~"db-.*", container="postgres"}[5m])
)
/
sum by (namespace, pod, container) (
rate(container_cpu_cfs_periods_total{namespace=~"db-.*", container="postgres"}[5m])
)
> 0.05 # alert: more than 5% of periods throttled, sustained for 15 minutes
# Working set against the memory limit: the OOM-kill early warning
max by (pod) (container_memory_working_set_bytes{namespace=~"db-.*", container="postgres"})
/
max by (pod) (kube_pod_container_resource_limits{namespace=~"db-.*", container="postgres", resource="memory"})Disaster recovery
Multi-zone, multi-region and point-in-time recovery
Zonal redundancy protects against a data-centre failure and costs little beyond careful placement. Regional redundancy changes your consistency model, latency budget and bill. Cloud Native Database Support helps teams choose deliberately, then proves the choice by restoring from the archive on a schedule.
Figure 6. Three topology patterns and the single recovery path that cloud native database support rehearses for all of them.
Whatever the pattern, a standby region needs its own control plane, credentials, image-registry mirror and archive copy. A standby that depends on the primary region's cluster API, secret store or CI system is a replica with extra latency, not a disaster-recovery site. Recovery objectives are written as numbers, rehearsed quarterly and tied to the retention window the archive can actually satisfy.
Restores go into a new cluster, never over the damaged one, and target a timestamp. The manifest restores from the Barman Cloud plugin's object store to the instant before a bad deployment; the SQL is the verification suite Cloud Native Database Support runs before anyone calls a restore successful.
# Point-in-time restore into a NEW cluster (never over the damaged one), Barman Cloud plugin
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: orders-pg-restore
namespace: db-orders-restore
spec:
instances: 1
storage: {storageClass: db-gp3-wffc, size: 400Gi}
bootstrap:
recovery:
source: origin
recoveryTarget:
targetTime: "2026-09-29 14:05:00+00" # the instant before the bad deployment
externalClusters:
- name: origin
plugin:
name: barman-cloud.cloudnative-pg.io
parameters:
barmanObjectName: orders-archive # ObjectStore resource in a separate account
serverName: orders-pg-- Post-restore verification: run on the restored cluster, compare with the recorded pre-incident baseline
SELECT
now() AS verified_at,
pg_last_xact_replay_timestamp() AS last_replayed_commit,
(SELECT COUNT(*) FROM orders.order_header
WHERE created_at < '2026-09-29 14:05:00+00') AS orders_before_target,
(SELECT MAX(order_id) FROM orders.order_header) AS max_order_id;
-- B-tree and heap consistency for the orders schema (amcheck; read-only, AccessShareLock)
CREATE EXTENSION IF NOT EXISTS amcheck;
SELECT c.relname, bt_index_check(index => c.oid, heapallindexed => true)
FROM pg_class AS c
JOIN pg_namespace AS n ON n.oid = c.relnamespace
JOIN pg_am AS am ON am.oid = c.relam
WHERE c.relkind = 'i' AND am.amname = 'btree' AND n.nspname = 'orders';Security
Hardening RBAC, secrets, mTLS and network policy
Container platforms default to convenience, so security is an explicit workstream in every cloud native database support engagement. Each control below has appeared as a finding in audits we have run, and each hardened target maps to a Kubernetes primitive you can review in Git.
| Control | Common weak default | Hardened target |
|---|---|---|
| Network | Flat pod network | Default-deny NetworkPolicy, explicit allows per port |
| Transport | TLS only at the edge | mTLS end to end, rotated certificates |
| Credentials | Long-lived passwords in a Secret | External secret manager, workload identity, scheduled rotation |
| Cluster RBAC | Broad ClusterRole for the operator | Namespaced roles; pods/exec audited and alerted |
| Pod posture | Writable root, privilege escalation | Restricted Pod Security Standard, seccomp |
| Images | Mutable tags from public registries | Digest-pinned, signed, private mirror |
| Data at rest | Provider default key | Customer-managed keys, separate key custody |
Auditability is a cloud native database support deliverable. Every privileged action, including an interactive shell into a database pod, produces a durable log entry outside the cluster, retained for the period your regulator expects.
# Default-deny for the database namespace, then one explicit allow: pooler -> database on 5432
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
namespace: db-orders
spec:
podSelector: {}
policyTypes: [Ingress, Egress]
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-pooler-to-postgres
namespace: db-orders
spec:
podSelector:
matchLabels: {cnpg.io/cluster: orders-pg}
policyTypes: [Ingress]
ingress:
- from:
- podSelector:
matchLabels: {cnpg.io/poolerName: orders-pg-pooler-rw}
ports:
- {protocol: TCP, port: 5432}
# Replication between instances, operator status checks, DNS and archive egress need their own allows:
# write them before applying default-deny, and test in staging first.FinOps
The real cost model of databases on Kubernetes
Consolidation usually lowers cost, but not for the reason most business cases claim. The saving comes from bin-packing and from removing per-instance idle capacity and licensing, not from the orchestrator. Cloud Native Database Support publishes the arithmetic behind every recommendation so finance and engineering argue about the same numbers.
Levers that work
Right-size requests from observed p95, then bin-pack node pools. Commit or reserve capacity for the steady baseline only. Tier cold archive data. Keep chatty replicas zone-aware to cut cross-zone transfer. Control metric cardinality. Consolidate small clusters into namespaced tenants with quotas.
Levers that look good and hurt
Shrinking memory limits until the buffer pool thrashes. Spot or preemptible nodes for quorum members. Cutting to two replicas and losing the ability to lose one. Removing the pooler to save a pod, then sizing the primary for thousands of backends.
In cloud native database support cost reviews, cross-zone data transfer and the observability pipeline are the two line items that grow silently, so we report both separately. Where a managed service is cheaper or safer for a workload, we say so; our cloud database optimization and FinOps practice runs these reviews as a standalone engagement, with provider-specific design from our AWS, Google Cloud and Microsoft Azure teams.
Failure modes
Failures our Cloud Native Database Support engineers are called in to diagnose
These are the incident patterns that recur across Kubernetes estates, independent of engine, and the ones cloud native database support is most often escalated for. Each correction is something we can verify with a query, a metric or a drill.
| Observed failure | Underlying mechanism | Correction |
|---|---|---|
| Two writers accepted transactions | Promotion before the old primary was fenced or its endpoint removed | Fence-first policy, endpoint gating, timeline or term enforcement |
| Cluster healthy, application timing out | Pool holding sockets to a promoted-away pod | Bounded socket timeouts, eviction on error, real-query health checks |
| Random multi-second latency | CFS throttling during checkpoint or vacuum | Remove or widen the CPU limit, alert on throttled periods |
| OOM kill with free node memory | Cgroup limit reached by page cache and per-connection memory | Explicit cache sizing, Guaranteed QoS, connection cap at the pooler |
| Replica never catches up after node replacement | Archive gap and short retention force a full re-clone | Retention sized to clone time; slots with a WAL size limit |
| Rolling upgrade stalled halfway | PDB blocked eviction while quorum was already degraded | Correct PDB arithmetic; health gate before each roll |
| Restore succeeded, data was wrong | Target set to a segment boundary, not a timestamp | Timestamp PITR and the mandatory verification suite |
| Storage cost doubled, traffic flat | Orphaned PVCs and snapshots from failed reconciles | Reclaim-policy review, lifecycle rules, orphan reports |
Migration
From virtual machines to Kubernetes, with rollback kept cheap
Moving a database onto a container platform changes the operating model, so Cloud Native Database Support plans the migration as seven phases with the legacy primary kept warm as the rollback target until the last one is signed off. We run this path for PostgreSQL, MySQL, MariaDB and MongoDB estates.
Phase 0 · Assess
Inventory
Versions, extensions, SLOs, storage profile, connection topology, compliance scope.
Phase 1 · Design
Blueprint
Operator, storage class, zone layout, sizing, archive, security baseline, rollback criteria.
Phase 2 · Build
From Git
Non-production cluster, real data restored, load tested at production concurrency.
Phase 3 · Rehearse
Game day
Kill a node, fill a disk, throttle a volume, corrupt an archive; measure every RTO.
Phase 4 · Replicate
Side by side
Live replication from the legacy primary; both sides observed together for weeks.
Phase 5 · Cut over
Drain and promote
Pause writers at the pooler, verify zero lag, promote, repoint, keep legacy warm.
Phase 6 · Operate
Hand over
Runbooks, alert tuning, quarterly game days, operator upgrade calendar.
Rule
Rollback stays open
Until Phase 6 is signed off, the legacy primary remains a tested rollback target.
The first four weeks after cutover produce the most useful tuning data of the project, because the same workload has run on both architectures with comparable instrumentation. Cloud Native Database Support keeps that comparison running until the numbers settle. For PostgreSQL-specific operator work, see our PostgreSQL on Kubernetes practice; for streaming platforms, our Kafka consulting team.
FAQ
Questions teams ask before a Cloud Native Database Support engagement
Short answers to the questions platform and data teams raise most often about cloud native database support.
Is running a production database on Kubernetes safe?
Yes. Cloud Native Database Support makes it safe when the operator fences before it promotes, storage is zone-aware, resources avoid CPU throttling and recovery is rehearsed. The platform is rarely the risk; unverified assumptions about failover and restore are. We measure both before signing off a production cutover.
Do we need an operator, or is a StatefulSet enough?
A StatefulSet gives stable identity and storage but no promotion logic, archive management or safe rolling upgrades. Beyond a development cluster we use an operator, chosen against a written rubric.
Which operator do you recommend?
We are vendor-neutral and recommend per workload. The decision turns on fencing behaviour, timestamp point-in-time recovery, upgrade mechanics, how lag and archive age are surfaced, and project governance. We also support the operator you already run.
Should some databases stay on managed cloud services?
Often, yes. Small, low-change workloads without unusual extension needs are frequently cheaper and safer on a managed service. Cloud native database support means choosing the right runtime for each workload, not moving everything onto Kubernetes.
How do you prevent split brain on Kubernetes?
Fencing before promotion, endpoint gating at the Service and pooler, quorum synchronous replication, and a timeline or term marker that makes divergent history unreplayable. We test all four in drills, not only in design reviews.
Should database pods have CPU limits?
Usually not, or only far above the request. A CPU limit is a hard quota per 100 ms period, and checkpoint or vacuum bursts get throttled into latency spikes. We set requests from observed p95, keep memory request equal to limit, and alert on throttled periods.
Can you work alongside our platform team?
That is our most common cloud native database support engagement. We join your platform and SRE engineers as the database specialists, contribute to your Git repositories and runbooks, and stay on the escalation path for Severity-1 incidents.
Which engines and platforms do you cover?
PostgreSQL, MySQL, MariaDB, MongoDB, Redis and Valkey, Cassandra, ClickHouse and Kafka, on self-managed Kubernetes, EKS, GKE, AKS and OpenShift, in single-region, multi-region and hybrid topologies, plus the major managed cloud database services.
How quickly do you respond during an outage?
Under cloud native database support, Severity 1 is acknowledged within 15 minutes, 24×7×365, with an engineer working the incident until service is restored and a written root-cause analysis afterwards. If you are in an incident now, use our emergency DBA channel.
Put database engineers behind your Kubernetes platform
Start with a platform review: operator, storage, failover and recovery measured in one week, with findings ranked by risk. Cloud Native Database Support for active incidents is available through the same page, 24×7.