vps cluster docs

0003. Tenant model: the cluster repo registers tenants, tenant repos own their deployment config

Context

One workload on this cluster is not the owner’s: a third-party team’s application, which ships its own Helm chart in its own repositories and whose images are built by its own CI. There is also real student data in one of its databases.

How the deployment config is split decides three things: who can change what the tenant runs, who the public cluster repository is allowed to describe, and who can rotate the tenant’s credentials without asking the owner.

The state this replaces was inconsistent rather than chosen: the tenant’s chart lived in the tenant’s repo, its images were pinned by a bot writing .argocd-source-*.yaml into that repo, but its environment values and plaintext secrets lived in the cluster owner’s repo, and one of its NetworkPolicies lived in a third place (frontend-manifests). One deploy state, three repositories, and the tenant could not rotate its own credentials.

Decision

The cluster repository owns the platform and a thin, cluster-specific registration per tenant. The tenant’s repository owns the deployable artifact and the tenant’s environment configuration.

Cluster repo owns:

Tenant repo owns:

Rule of thumb for future apps: if another party owns the application repo and it ships its own chart or its own secrets, it is a tenant — app repo owns chart + values + SOPS secrets, cluster repo owns only the registration. Otherwise it is a cluster-owned app under apps/.

Alternatives rejected

Consequences

Evidence

The migration plan’s Repository Ownership Model (private, not published — the options and the evidence for them), k8s/argocd/applications/vcap/*.yaml (registration as it exists today), k8s/argocd/projects/vcap.yaml, and clusters/vps/tenants/vcap/README.md (the tenant contract, once the restructure lands).