032-cluster-topology
Cluster topology: N=1 primary, N=3 StatefulSet on Kubernetes, one key set, S3 backups
Lifecycle approvedImplementation completeVerification unknownQualification unknown
What multiplies and what does not. At N=1 nothing changes. At N=3 every replica is identical: a StatefulSet pod running the supervisor, with its own volume, two Raft clusters per replica (rauthy's and the app's), peers discovered by stable pod DNS, one key set injected as a Secret and custodied once, the public origin on an Ingress that terminates TLS and keeps /metrics off it, a CronJob that runs backup --to s3:// against the leader, and a ServiceMonitor example. Rate limiting is per node and says so. A shared volume between Raft members is refused by the manifests themselves. Carries enrahitu://030.
Read the full pinned specification ↗Relationships
depends on
Claimed units
- establishes
{ "kind": "file", "path": "deploy/k8s/kustomization.yaml" } - establishes
{ "kind": "file", "path": "deploy/k8s/configmap.yaml" } - establishes
{ "kind": "file", "path": "deploy/k8s/statefulset.yaml" } - establishes
{ "kind": "file", "path": "deploy/k8s/service.yaml" } - establishes
{ "kind": "file", "path": "deploy/k8s/ingress.yaml" } - establishes
{ "kind": "file", "path": "deploy/k8s/migrate-job.yaml" } - establishes
{ "kind": "file", "path": "deploy/k8s/backup-cronjob.yaml" } - establishes
{ "kind": "file", "path": "deploy/k8s/servicemonitor.yaml" } - establishes
{ "kind": "file", "path": "deploy/k8s/secret.example.yaml" } - establishes
{ "kind": "file", "path": "deploy/n3/" } - establishes
{ "kind": "file", "path": "deploy/README.md" } - establishes
{ "kind": "file", "path": "scripts/k8s-validate.sh" } - establishes
{ "kind": "file", "path": "crates/rahi-store/tests/attach.rs" } - extends
{ "nature": "additive", "spec": "011-store-hiqlite", "unit": { "kind": "file", "path": "crates/rahi-store/src/store.rs" } } - extends
{ "nature": "additive", "spec": "011-store-hiqlite", "unit": { "kind": "file", "path": "crates/rahi-store/src/backup.rs" } } - extends
{ "nature": "additive", "spec": "030-operational-verbs", "unit": { "kind": "file", "path": "crates/rahi-ops/Cargo.toml" } } - extends
{ "nature": "additive", "spec": "030-operational-verbs", "unit": { "kind": "file", "path": "crates/rahi-ops/src/lib.rs" } } - extends
{ "nature": "additive", "spec": "030-operational-verbs", "unit": { "kind": "file", "path": "crates/rahi-ops/src/preflight.rs" } } - extends
{ "nature": "additive", "spec": "030-operational-verbs", "unit": { "kind": "file", "path": "crates/rahi-cli/src/lib.rs" } } - extends
{ "nature": "additive", "spec": "030-operational-verbs", "unit": { "kind": "file", "path": "crates/rahi-cli/src/serve.rs" } } - extends
{ "nature": "additive", "spec": "030-operational-verbs", "unit": { "kind": "file", "path": "crates/rahi-cli/src/verbs.rs" } } - extends
{ "nature": "additive", "spec": "030-operational-verbs", "unit": { "kind": "file", "path": "crates/rahi-cli/tests/cli.rs" } } - extends
{ "nature": "additive", "spec": "031-single-container-packaging", "unit": { "kind": "file", "path": "crates/rahi-ops/src/first_boot.rs" } } - extends
{ "nature": "additive", "spec": "031-single-container-packaging", "unit": { "kind": "file", "path": "crates/rahi-ops/src/rauthy_env.rs" } } - extends
{ "nature": "additive", "spec": "031-single-container-packaging", "unit": { "kind": "file", "path": "crates/rahi-ops/src/supervise.rs" } } - extends
{ "nature": "additive", "spec": "031-single-container-packaging", "unit": { "kind": "file", "path": "crates/rahi-ops/tests/first_boot.rs" } } - extends
{ "nature": "additive", "spec": "039-release-and-out-of-tree-packaging", "unit": { "kind": "file", "path": "crates/rahi-ops/rauthy.env.template" } } - extends
{ "nature": "additive", "spec": "001-agentic-harness", "unit": { "kind": "file", "path": "Makefile" } } - extends
{ "nature": "additive", "spec": "001-agentic-harness", "unit": { "kind": "file", "path": ".github/workflows/govern.yml" } }
Source headings
- 032: Cluster topology
- 1. Purpose
- 2. Territory
- 3. Behavior
- 4. Functional requirements
- 5. Acceptance criteria
- 6. Out of scope
- 7. Resolved decisions
- 8. Status
- Verification
Frozen anchors
No frozen anchors declared.