Concepts
A short vocabulary that the rest of the documentation assumes.
Observer of reported state
pgConsole renders claims, not verified facts. Everything it shows comes from one of three origins, and every claim keeps its origin from the Kubernetes adapter all the way to the rendered page:
- operator-reported — what CloudNativePG wrote to a resource's status.
- Kubernetes-observed — what the API server reports about pods, events, and resource existence.
- repository-evidence — what the optional ObjectStoreViewer sidecar publishes about the backup destination (never read by pgConsole itself).
A backup shown as completed is an operator claim. The console never says
a backup is "verified", "restorable", or "safe to restore" — that language
is deliberately absent.
Snapshots and staleness
Each observed resource kind has a collector that seeds from a list, follows a watch, and publishes an immutable snapshot. Rendering reads snapshots, not the API — so API latency never becomes page latency. When a collector loses contact it marks its snapshot stale and keeps the last-good data; it never blanks the section or invents a healthy state. Each section carries its own staleness independently.
Two honest values you will see:
unknown— the console has no observation (a missing optional permission, an absent resource kind, or no snapshot yet).- stale — contact was lost; the shown data is the last good observation, and the section says so.
Bounds and truncation
Every collection the console renders is bounded, so a large or hostile cluster can never turn a page into an unbounded document. When a bound is hit the section shows an explicit truncated state rather than silently dropping rows — truncation is a visible fact, never a lie of omission.
The backup catalog is the one with concrete numbers worth knowing. It
selects only resources whose spec.cluster.name matches the target cluster
exactly, then renders newest-first, at most 500 Backup and 200
ScheduledBackup rows; the traversal that seeds those lists is itself
capped at 2,000 Backup and 1,000 ScheduledBackup candidates. Reach
either ceiling and the panel says so. Events and pods are bounded the same
way, each with its own limit and its own truncation marker.
Levels and route admission
pgConsole authenticates nobody. A trusted proxy forwards two headers:
X-Forwarded-User— the verified identity, for display and audit only.X-PgToolBox-Level— a coarse authorization level:view,poweruser, ordba.
The console maps the level onto an ordered ladder and gates route admission — never widening its own ServiceAccount authority. A missing, empty, or unrecognized level reaches only the read-only baseline. See Authorization.
The closed request-time exceptions
The rule is that handlers render from snapshots and make no API calls. The exceptions are a closed, enumerated list:
- the log tail — one bounded, on-demand fetch for a membership-verified pod;
- readiness — a lightweight probe behind
/readyz; - day-2 operations — one pinned write per enumerated operation;
- the access-request decision — one status-subresource write.
Everything else is snapshot plus template.
The trust boundary
pgConsole performs no authentication and terminates no TLS. Its trust boundary is the proxy plus the operator-managed network path: a default-deny NetworkPolicy admits only the proxy to the console's port. The forwarded headers are trustworthy only because of that confinement — a directly reachable console would let anyone assert any level. The channel, not the console, is what makes the headers trustworthy.