Kubexa

work in progressThis site is being written now: pages appear and change as the cluster does. The AI layer is the most incomplete part.

timeline

How this cluster got built

Every date here comes from the repository log, with the commit beside it. Two entries carry fire because they took the platform down. The rest are steps, plus the wins that changed how everything after them works.

  1. The repository starts

    A handful of virtual machines on one host, Talos installed by hand, and a journal written next to the manifests.

    taloskubernetesac900836
  2. Rook and a single-node Ceph

    The Rook charts were copied into the repository so a one-node cluster could run storage before anything else existed.

    cephkubernetes539137e5
  3. Gitea and Argo CD

    The forge and the first reconciler arrived in the same commit. Six days later the cluster deployed its first workload from git.

    giteaargo3cda697e
  4. breakthrough

    Cilium becomes the CNI

    Installed from Terraform. Every later network decision, from Gateway API to KubeSpan, builds on this layer.

    cilium509e31e8
  5. Tailscale joins the sites

    Remote access stopped being a port forward, and a second site became practical.

    tailscaled68c688d
  6. outage

    A cluster ruined and rebuilt

    The KubeSpan rollout destroyed the cluster and I rebuilt it. Recreating Ceph took the storage classes with it, and two volumes came back empty.

    taloscilium13235e0e
  7. Oracle joins as a second site

    The first node outside the house, provisioned by hand-written OCI Terraform.

    opentofukubernetes2d93b31e
  8. Multi-site routing

    One entry point served three sites: Oracle, worker-infra and worker-svt.

    kubernetescilium5df84cec
  9. breakthrough

    Native routing with KubeSpan

    Cilium dropped VXLAN and Talos carried WireGuard. The two only coexist with bpf.hostLegacyRouting set, which is why the cluster died the first time.

    ciliumtalosroutingMode: nativebpf.hostLegacyRouting: truee28c795c
  10. breakthrough

    DNS follows the objects

    external-dns wrote Cloudflare records from Gateway and HTTPRoute objects. The last chore I had been doing outside git disappeared.

    cloudflareaa17aa59
  11. breakthrough

    Argo CD out, Flux in

    Three layers, one dependency graph, one opinionated layout. Velocity and consistency both improved that week.

    fluxkubernetesapps/infrastructure/clusters/2b236920
  12. outage

    One line deleted every namespace

    The configs Kustomization listed the application namespaces, so force-deleting it pruned them and Kubernetes removed everything inside. The rules about namespace ownership date from this week.

    kubernetesfluxinfrastructure/configs5302803c
  13. breakthrough

    Terraform moves into the cluster

    The Flux OpenTofu controller replaced fourteen PaC-fired apply pipelines. Credentials stopped leaving the cluster and drift correction became automatic.

    opentofufluxinfra.contrib.fluxcd.iotofu-systemad9d1af1
  14. The site renders from the same repository

    A Rust server reads the documentation and quotes the manifests it documents, so a page cannot cite a file that is not there.

    rustkubernetesb00f04ab

Why the stack stays this small: price efficiency decides what runs here. The GPUs reindex every repository push and run photogrammetry, and a hosted API covers the model work for 10 EUR a month. The arithmetic is on the about page.

view source .md