k3d - first contact

While it’s very convenient to develop locally with docker compose there is often this gap to Kubernetes production deployment we want to close.

This post describes how we prepared to move from a small docker-compose setup for development closer to K8s with k3d.

K3s - Lightweight Kubernetes

k3d - is a lightweight wrapper to run k3s (Rancher Lab’s minimal Kubernetes distribution) in docker

If you already have Docker Desktop up and running you might want to check Eventually - Taking Kubernetes for a Spin.

Install k3d with home-brew

Lucky us a Homebrew Formulae k3d exists…check Installation for other options.

$ brew install k3d
…
🍺  /usr/local/Cellar/k3d/4.4.4: 9 files, 16.8MB

You can easily verify the installation with k3d version:

k3d version v4.4.4
k3s version latest (default)

Sandbox cluster

We need a cluster with access to our internal Docker registry for maximum fun!

  • port 9051 exposed (the actual application) and
  • a local directory to configure access to the internal Docker registry.
k3d cluster create \
    --volume "$(PWD)/registries.yml:/etc/rancher/k3s/registries.yaml" \
    --port 9051:9051@loadbalancer sandbox
…
INFO[0020] Pulling image 'docker.io/rancher/k3d-proxy:v4.4.4'
INFO[0025] Starting cluster ‘sandbox’
…
INFO[0036] You can now use it like this:
kubectl config use-context k3d-sandbox
kubectl cluster-info

Get up to speed with

k3d kubeconfig get k3d-sandbox > kube_config_cluster.yml
export KUBECONFIG=$(PWD)/kube_config_cluster.yml

Tip: Check ShellHacks - Kubectl: Switch Context - Kubernetes for more context fun…

By now you should be ready to enter the sandbox - just a quick check 😇

kubectl config current-context
k3d-sandbox

Looks good, let’s run the famous hello-world:

cat << EOF | kubectl apply -f -
apiVersion: batch/v1
kind: Job
metadata:
  name: hello-world
spec:
  template:
    spec:
      containers:
        - name: hello-world
          image: hello-world
      restartPolicy: Never
EOF

Run kubectl logs --tail 30 --selector=job-name=hello-world to check the output. Nice

Just grabbing some toys (Lens, a Spring Boot App, Gradle, jib, Jenkins, … ). I’ll keep you in the loop…

(bonus) The internal docker registry configuration

Just because it took me so long to get the subtleties right

mirrors:
  sandbox.internal:
    endpoint:
      - "https://sandbox.internal"
configs:
  sandbox.internal:
    tls:
      ca_file: "/etc/ssl/certs/sandbox.pem"
    auth:
      username: registry
      password: ********

Please make sure you use the same keys in mirrors and configs (sandbox.internal in our case)!

Meanwhile - happy kubernauting 🤖…


Photo by Timelab Pro on Unsplash