Iniziamo con capire che cos’è K3D e non confondiamolo con K3S
K3D
K3D è un “wrapper” che come scrive Wikipedia “è un’avvolgitore, un modulo software che ne “riveste” un altro” Si la traduzione dall’inglese non è felicissima, in questo caso specifico consente di eseguire K3S, che è la distribuzione minimale di Kubernetes sviluppata da Rancher Labs, all’interno di Docker.
In altre parole, K3D semplifica la creazione e la gestione di cluster Kubernetes leggeri e portatili che utilizzano K3S, rendendo il processo più agevole, specialmente per coloro che sviluppano in locale utilizzando tecnologie Kubernetes.
È importante notare che K3D è un progetto guidato dalla community, non è un prodotto ufficiale di Rancher (SUSE) che ha creato e mantiene K3S. Tuttavia, K3D offre un’opzione comoda e flessibile per coloro che desiderano utilizzare K3S all’interno di container Docker.
Prerequisiti
- avere a disposizione un server o una VM con distribuzione linux (si può installare anche su Windows o Mac ma non lo tratteremo quì)
- accesso alla rete per scaricare files
- curl e/o wget installati
- avere docker installato, per installarlo vi ricordo un precedente articolo QUI
Procedura
Per installare K3D sostanzialmente si tratterà semplicemente di scaricare uno script bash che si occuperà in totale autonomia dell’installazione, abbiamo due alternative, utilizzare curl oppure wget, c’è da dire che lo script utilizzerà curl per scaricare i files quindi curl dovete installarlo comunque.
sudo apt install curl -y
sudo wget -q -O - https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash
oppure tramite curl
sudo curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash
Attendete che lo script completi e poi verificatene il risultato con
k3d version
k3d version v5.6.0
k3s version v1.27.4-k3s1 (default)
Ora che K3D è installato possiamo provare a creare il nostro primo cluster Kubernetes (K3S) eseguendo questo comando
sudo k3d cluster create mycluster
Attendete il completamento, nel mio caso ha completato in poco più di 30 secondi
INFO[0000] Prep: Network
INFO[0000] Created network 'k3d-mycluster'
INFO[0000] Created image volume k3d-mycluster-images
INFO[0000] Starting new tools node...
INFO[0001] Creating node 'k3d-mycluster-server-0'
INFO[0001] Pulling image 'ghcr.io/k3d-io/k3d-tools:5.6.0'
INFO[0003] Pulling image 'docker.io/rancher/k3s:v1.27.4-k3s1'
INFO[0003] Starting Node 'k3d-mycluster-tools'
INFO[0011] Creating LoadBalancer 'k3d-mycluster-serverlb'
INFO[0012] Pulling image 'ghcr.io/k3d-io/k3d-proxy:5.6.0'
INFO[0017] Using the k3d-tools node to gather environment information
INFO[0017] HostIP: using network gateway 172.18.0.1 address
INFO[0017] Starting cluster 'mycluster'
INFO[0017] Starting servers...
INFO[0017] Starting Node 'k3d-mycluster-server-0'
INFO[0022] All agents already running.
INFO[0022] Starting helpers...
INFO[0022] Starting Node 'k3d-mycluster-serverlb'
INFO[0028] Injecting records for hostAliases (incl. host.k3d.internal) and for 2 network members into CoreDNS configmap...
INFO[0030] Cluster 'mycluster' created successfully!
INFO[0030] You can now use it like this:
kubectl cluster-info
Ora come suggerisce l’ultima riga dell’output, per interagire con il cluster dobbiamo utilizzare kubectl, installiamolo quindi
sudo curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo chmod +x kubectl
sudo mv kubectl /usr/local/bin
Dobbiamo fare in modo che kubectl conosca il file di configurazione del cluster
sudo k3d kubeconfig merge mycluster --kubeconfig-switch-context
Adesso siamo pronti per interagire con il cluster
sudo kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k3d-mycluster-server-0 Ready control-plane,master 12m v1.27.4+k3s1 172.18.0.2 <none> K3s dev 5.15.0-91-generic containerd://1.7.1-k3s1
Come potrete notare il cluster è composto da un unico nodo K3S, ma questo sarà comunque sufficiente per eseguire tutti i test e le esigenze di sviluppo.
Sia comunque ben chiaro che questo è solo un esempio, K3D tramite ulteriori opzioni e file di configurazione vi permette di creare cluster con più nodi. QUI la documentazione ufficiale.
Continuando a curiosare potete vedere cosa ha installato K3D
sudo kubectl get svc -A
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 20m
kube-system kube-dns ClusterIP 10.43.0.10 <none> 53/UDP,53/TCP,9153/TCP 20m
kube-system metrics-server ClusterIP 10.43.151.46 <none> 443/TCP 20m
kube-system traefik LoadBalancer 10.43.61.96 172.18.0.2 80:32526/TCP,443:32411/TCP 19m
sudo kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system local-path-provisioner-957fdf8bc-g6vsb 1/1 Running 0 20m
kube-system coredns-77ccd57875-h6krb 1/1 Running 0 20m
kube-system metrics-server-648b5df564-nn5kk 1/1 Running 0 20m
kube-system helm-install-traefik-crd-52bfs 0/1 Completed 0 20m
kube-system helm-install-traefik-nzmhv 0/1 Completed 1 20m
kube-system svclb-traefik-caab8633-t7m98 2/2 Running 0 19m
kube-system traefik-64f55bb67d-gnvf8 1/1 Running 0 19m
Personalmente conosco anche un altra alternativa per creare velocemente un cluster kubernetes, forse scriverò un prossimo articolo, l’alternativa cmq è kind
Aggiornamento Ho scritto un’articolo specifico su Kind QUI
