TL;DR
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 :-)
Continue Reading »