Skip to content

blissful-infra cluster

A tenant can own a local Kubernetes cluster. cluster provisions it with Terraform: a kind cluster running ArgoCD, Argo Rollouts and Gitea.

Terminal window
blissful-infra cluster up
Terminal window
brew install kind kubectl hashicorp/tap/terraform argoproj/tap/kubectl-argo-rollouts

Plus Docker Desktop, running. These are only needed for the kubernetes runtime. The default compose runtime needs none of them.

CommandWhat it does
cluster up [tenant]Provision the cluster with ArgoCD, Argo Rollouts and Gitea
cluster down [tenant]Destroy the cluster (terraform destroy)
cluster status [tenant]Show cluster status and platform pods

The tenant resolves from your use context when omitted.

Terminal window
blissful-infra cluster up

Expect 3-5 minutes on the first run: Terraform downloads providers and Helm pulls the ArgoCD, Argo Rollouts and Gitea charts. Subsequent runs are much faster.

When it finishes it prints the ArgoCD and Gitea URLs and their credentials. The cluster is named blissful-<tenant>, and the Terraform workspace lives at ~/.blissful-infra/tenants/<tenant>/cluster/.

ComponentRole
kindThe cluster itself, one Docker container per node
ArgoCDWatches the Gitea repo and syncs manifests into the cluster
Argo RolloutsRuns the canary rollout: traffic weights, pauses, promotion
GiteaThe in-cluster git server holding the gitops repo

Gitea is what makes the GitOps loop real rather than simulated: deploy pushes rendered manifests as a commit, and ArgoCD syncs from that commit. Every deploy is an auditable commit you can inspect or revert.

Terminal window
blissful-infra cluster status

Shows whether the cluster is up and lists the platform pods, so you can tell an ArgoCD problem from an application problem.

Terminal window
blissful-infra cluster down

Runs terraform destroy. The kind cluster and everything in it goes away, including the Gitea repo and its deploy history. The tenant’s compose-side infrastructure is untouched.

Cluster ports come from the tenant’s block. The first tenant gets:

ComponentPort
Gitea3300
Kubernetes API6550
ArgoCD8440

These bases were chosen clear of every other range in use, and of Docker Desktop’s own 6443.