Skip to content

Kubernetes reference architecture ​

This page describes the Kubernetes deployment the platform is being built toward and what exists today. It is a target architecture for a first customer of roughly 800 to 1,000 users, starting without high availability and with a deliberate path to multi-node HA. It is not a production qualification: the manifests are checked statically and against isolated PostgreSQL, and the whole topology has been run only as a single-node simulation. Read Status before relying on any row.

The endpoint stays the enforcement point. Moving the server to Kubernetes changes where the control plane runs, not where detection happens.

Topology ​

Kubernetes reference topologyAgents and the console enter through separate gateways. Ingest and the Management API are separate workloads over PostgreSQL, with an EDM Matcher, Device Issuer and Analysis service as internal workloads.AgentsConsole usersCustomer DNS, load balancer / WAF, Kubernetes Gateway :443Namespace: restricted Pod Security, default-deny networkDashboardstatic consoleManagement APIconsole, enrolment, policyIngestevents, data planeEDM Matcherkey releaseWorkersgeneral + reportsDevice Issuercustomer PKI / HSMAnalysisno DB, no egressDiscoveryopt-in workerPostgreSQLtenants, policy, events, queue, audit; a login per serviceagent client mTLSExternal: customer PKI / HSM, KMS or Vault Transit (wraps EDM keys), S3-compatible evidence store

Workload roles ​

One binary runs in several modes, so each role gets only the network paths, database privileges and secrets it needs.

RoleResponsibilityNotable boundary
Management APIConsole and integration routes, enrolment, policyCannot update or delete the audit chain; cannot change endpoint events except linking to an incident
IngestAgent event intakeRequires the gateway-verified device identity on signed routes; one-time enrolment is the only certificate-free exception
General workerNormalise, correlate, retain, deliverRetention deletions go through bounded database functions, not table-wide DELETE
Reports workerScheduled reports and analyticsOwns its schedule and delivery tables
EDM MatcherFingerprints imported datasets and releases keys to agentsHolds the only path to plaintext EDM keys; keys wrapped by the customer KEK
Device IssuerIssues device certificatesBacked by the customer's PKI or HSM
AnalysisFingerprints protected documents an operator uploadsNo database, no EDM key, no storage, no egress
Discovery workerScans mounted shares and remote sourcesOpt-in; empty tenant scope by default; read-only source volume
DashboardStatic console
Migration jobApplies schemaThe only schema writer; runtime pods wait for their image's migrations

Data stores ​

  • PostgreSQL holds everything transactional, including the event queue. A dedicated VM or managed PostgreSQL is the leading option for the first customer. The database operating model is an owner decision that is not yet made.
  • Object storage is S3-compatible and holds sealed evidence. It is optional and tenant-owned.
  • No message broker, no search index. Direct ingestion into PostgreSQL was measured, and the cost is per request, not per event; a broker would defer the same signature, nonce and WAL work and add a component to run. The trigger to revisit is a measured p99 above one second at a rate below the capacity figures.

Security boundaries ​

BoundaryControl
Agent to clusterDevice-key-signed requests; client mTLS at the agent gateway; the API validates the device URI in the forwarded certificate
Between servicesWorkload mTLS with separate client identities per caller
Pod admissionNamespace enforces the Pod Security restricted profile
NetworkA NetworkPolicy per role; default deny between roles
DatabaseA separate login per runtime service, column-level grants, fail-closed startup checks that refuse unexpected privileges
EDM keysWrapped by the customer KEK; unwrapped only in the Matcher; the API holds no Vault credential
SecretsA placeholder secret template is not applied by a directory apply
Tenantstenant_id in every lookup and composite foreign keys in the schema

Sizing ​

The measured single-host figures are in Capacity: 3,385 events/s ingestion-only and 2,622 events/s with every event matching a policy, as floors. PostgreSQL write-ahead-log storage dominates; on Kubernetes put pg_wal on local NVMe rather than network-attached storage, and keep agent batches at the default of 100 events.

Status ​

ItemState
Split roles, per-role NetworkPolicies, Pod Security labelsImplemented in manifests; static checks pass
Per-service database roles and grantsImplemented; tested against isolated PostgreSQL 16
Analysis service and EDM Matcher as separate workloadsImplemented in source; images not yet built and deployed in a cluster
Agent gateway mTLS contractA template exists; it depends on the customer's PKI and gateway CRDs
NetworkPolicy enforcementNot yet proven on a live CNI
Wrapped EDM keys for existing datasetsA dry-run-first rewrap tool exists; existing keys have not been rewrapped against a customer database
Management API privilege minimisationIncomplete: it still holds broad grants on some application tables
High availabilityNot built. First deployment is single-replica for PostgreSQL
Production topologyNot qualified. A single-node cluster on one VM is a service simulation, not a capacity or security qualification

Operational steps for the manifests that exist are in Server deployment.

Statements here describe what is built and tested; planned work is marked as planned.