TL;DR
- Question: How to bootstrap bootstrappers? e.g., Argo CD and Crossplane, etc.
Answer: Use K3d (v5.7 and above) with embedded files! Or just use Crossplane Bootstrapper!
My contribution to K3d to support embedded files was one of the smoothest open-source contributions, although I needed to refactor my PR fully! I did that happily, thanks to the fruitful discussion with the K3d creator and maintainer, Thorsten Klein 🙌
Let's dive into that a bit more using the STAR method.
Situation
It has always been challenging to initiate the initiator dilemma (the same as Infinite regress in philosophy). For example, what will monitor the monitoring system? Or What will backup the backup system?
The same applies to Cloud-Native tools that run only on Kubernetes, where you need an initial Kubernetes cluster to run those bootstrapping tools to create your resources (like Argo CD and Crossplane).
Task
I wanted to fix this issue once and for all! (a generic way that works with many tools) I found that the best way to do that is to have a declarative way to setup the initial local cluster, which will create the Cloud resources afterward.
Action
I've reviewed a couple of tools and found the best tool to achieve that is K3d, a wrapper around K3s, a Rancher's lightweight Kubernetes distribution. It's like KIND but way more customizable (e.g., it comes with a built-in Helm controller).
In March 2024, I made a K3d PR that added functionality to embed manifests in the K3d cluster configuration. Now, we can have one file to bootstrap the local cluster with bootstrapping tools ready to provision your Cloud resources.
In July 2024, K3d 5.7.0 was released with my feature, so I can use it to bootstrap Crossplane instead of a bunch of Makefiles.
I also created Crossplane Bootstrapper, which makes that process even easier.
Result
With my new feature, it's possible to have 1 YAML file using 1 tool to bootstrap the initial cluster, which will create the reset of your Cloud resources.
Here is an example from Crossplane Bootstrapper. That solution works with any tool (e.g., Argo CD). It also supports external files, which is better for linting and so on.
--- apiVersion: k3d.io/v1alpha5 kind: Simple metadata: name: crossplane-bootstrapper # Cluster resources. servers: 1 agents: 1 # Auto deployed manifests. files: - description: Setup Crossplane destination: k3s-manifests/crossplane-bootstrapper.yaml nodeFilters: - "server:*" # Source as a file. # source: manifest-crossplane-bootstrapper.yaml # Source as an embedded manifest. source: | --- apiVersion: v1 kind: Namespace metadata: name: crossplane-system --- # Install Crossplane. apiVersion: helm.cattle.io/v1 kind: HelmChart metadata: name: crossplane namespace: crossplane-system spec: repo: https://charts.crossplane.io/stable chart: crossplane targetNamespace: crossplane-system valuesContent: |- provider: packages: # Docs: https://marketplace.upbound.io/providers/upbound/provider-family-gcp - "xpkg.upbound.io/upbound/provider-gcp-gke:v1.0.2" configuration: packages: # Docs: https://marketplace.upbound.io/configurations/upbound/platform-ref-gcp - "xpkg.upbound.io/upbound/platform-ref-gcp:v0.9.0" --- [...]
That's it! Happy DevOpsing :-)