Two layers, one version
OpenTofu lays the foundations once. Flux keeps the catalog in step with the signed artifact from then on. One version number moves both.
How it fits togethersocle_version = "0.1.0"the only line an upgrade touchesFoundationsapplied onceNetwork, cluster, identities and the bootstrap, from the OpenTofu modules.
Catalogreconciled continuously16 modules à la carte, from the signed Flux artifact.
One file per cluster
Under kube, list only what differs from the catalog defaults.
# clusters/prod.tfvars
socle_version = "0.1.0" # the only line an upgrade touches
aws = {
region = "eu-west-3"
cluster_name = "acme-prod"
kubernetes_version = "1.34"
}
kube = {
argocd = { domain = "argocd.acme.example" }
monitoring = { traces = { enabled = true } }
}- One applyA single OpenTofu root creates the cluster, installs Flux and hands the catalog over. Then OpenTofu steps away.
- One version
socle_versionpins the OpenTofu modules and the Flux artifact together. An upgrade is one line in your tfvars. - Signed end to endBoth artifacts are signed keyless with cosign, and Flux checks the signature on every reconciliation.
- Mistakes fail at planA misspelt module or attribute is rejected by
tofu plan, with the allowed values listed. - No out-of-band scriptsA module that needs cloud access declares its own IAM through Crossplane. The foundations never change.
- Your values winEvery module takes any chart value in
values. Secrets go invalues_secret, never in the state.
Pick your cloud
The catalog
16 modules, 7 of them on by default. Each one is a line under kube: turn it on, give it your values, turn it off.
- on by defaultargocdgitopsArgoCD, the GitOps layer you ship your applications with, served on the private Gateway when you set a domain.Every cloud
- off by defaultargocd-image-updatergitopsNew image tags in your registry reach your ArgoCD applications, without a commit per release.Every cloud · needs argocd; needs crossplane on aws, gcp
- off by defaultexternal-dnsnetworkingPublishes DNS records for your Services, Ingresses and HTTPRoutes into your cloud's zone.Every cloud
- on by defaultgateway-apinetworkingGateway API CRDs, the cilium GatewayClass and the shared public and private Gateways — on GKE's own classes on gcp.aws, azure, gcp, scaleway
- off by defaultkyvernosecurityThe Kyverno admission engine, with no policy, failing open and never judging the socle's namespaces.Every cloud
- off by defaultkyverno-policiessecurityThe socle's baseline Pod Security and image policies, in Audit, any of them enforceable natively.Every cloud · needs kyverno
- off by defaultexternal-secretssecretsKubernetes Secrets read from your cloud's secret manager, kept in step when they rotate.Every cloud
- off by defaultreloadersecretsRolls a workload when a ConfigMap or Secret it reads changes, opt-in per workload.Every cloud
- off by defaultkedaautoscalingEvent-driven autoscaling down to zero, with optional read-only access to your aws queues or gcp Pub/Sub subscriptions.Every cloud · needs crossplane on aws, gcp
- on by defaultmetrics-serverobservabilityThe resource metrics API behind kubectl top and every HorizontalPodAutoscaler on CPU or memory, on EKS.aws only
- on by defaultmonitoringobservabilityThe monitoring stack in one release: metrics, logs and traces storage, the cluster scraped, Grafana, and kube-prometheus-stack's alert rules.Every cloud
- on by defaultotel-agentobservabilityNode-level OpenTelemetry collector: every container's log, with its pod's metadata, to VictoriaLogs.Every cloud
- on by defaultotel-gatewayobservabilityCluster-level OpenTelemetry collector: your applications' OTLP metrics, logs and traces, and the Kubernetes events.Every cloud
- off by defaultvelerobackupBackup and restore of your applications' volumes and objects, chosen by two labels.aws, gcp · needs crossplane on aws, gcp
- off by defaultcrossplaneplatformThe tooling each module uses to declare its own cloud access: Crossplane and its providers (aws and gcp).Every cloud
- on by defaulthelloplatformpodinfo, a smoke test that your socle renders, converges and garbage-collects.Every cloud