K3s multi-node HA cluster (RPi)

Deze keer een Kubernetes Cluster met Raspberry PI’s, model 4B, bestaande uit 3 nodes bestaande uit drie nodes met alle roles, dus zowel master als worker. Als database voor Kubernetes wordt etcd3 gebruikt in plaats van de default SQLLite3. De RPI’s krijgen hun spanning via USB-C connectors, aangesloten op een USB Power Hub. Via ethernetkabels zijn ze allen aangesloten op een netwerk-switch (Gigabit). Een SD card voorziet in het Linux OS. (Ubuntu)

Voorbereiding

Eerst dienen op alle Raspberry Pi’s de cgroup instellingen voor memory toegevoegd te worden aan /boot/cmdline.txt (Raspbian) of /boot/firmware/cmdline.txt (Ubuntu). Hierdoor kan systemd gebruikt worden voor K3s. Voeg hier het volgende aan toe, op dezelfde regel:

cgroup_enable=memory cgroup_memory=1

Nadat de hostname en de timezone gezet zijn is een herstart noodzakelijk om deze instellingen te gebruiken. (waarbij rpi-x rpi-1 t/m rpi-3 is)

$ sudo hostnamectl set-hostname rpi-x
$ sudo timedatectl set-timezone Europe/Amsterdam
$ sudo reboot

K3s werkt met iptables en nieuwere versies van Debian gebruiken nftables. Dit is aan te passen met:

$ sudo iptables -F
$ sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
$ sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
$ sudo reboot

De 1e node

K3s wordt via een script uitgevoerd met het volgende commando op rpi-1: (de versie is optioneel)

$ curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--write-kubeconfig-mode 644 server --cluster-init" sh -s –

Zodra de installatie gereed is kan de node opgevraagd worden:

$ sudo kubectl get nodes
NAME    STATUS   ROLES                       AGE   VERSION
rpi-1   Ready    control-plane,etcd,master   4m    v1.19.3+k3s1

De pods die in de ‘kube-system’ namespace draaien zijn:

$ sudo kubectl get po -n kube-system
NAME                                      READY   STATUS    RESTARTS   AGE
coredns-6488c6fcc6-qt4ct                  1/1     Running   0          4m
helm-install-traefik-swt4s                0/1     Completed 0       4m       
local-path-provisioner-5ff76fc89d-gwn4n   1/1     Running   0          4m
metrics-server-86cbb8457f-k8w4q           1/1     Running   0          4m
svclb-traefik-mf2xn                       2/2     Running   0          67s
traefik-6f9cbd9bd4-kkzdx                  1/1     Running   0          69s

Om de overige nodes te kunnen koppelen is een zogenaamde join-token nodig en die haal je hier op:

$ sudo cat /var/lib/rancher/k3s/server/token

De extra nodes

Allereerst maken we de vereiste variabelen aan op de 2e node (rpi-2):

$ K3S_URL="https://<IP ADRES VAN 1e NODE of LB>:6443" 
$ K3S_TOKEN="<JOIN-TOKEN UIT VORIGE STAP>"

K3s wordt vervolgens ook met het (remote) script uitgevoerd, nu echter met een verwijzing naar de cluster URL en het token: (de versie is optioneel)

$ curl -sfL https://get.k3s.io | sh -s - server --token=${K3S_TOKEN} --server=${K3S_URL}

Op de 3e node (rpi-3) dient uiteraard hetzelfde gedaan te worden.


Op de 1e node (rpi-1 in deze configuratie) kan ‘kubectl‘ uitgevoerd worden.

$ ssh ubuntu@rpi-1

$ sudo k3s kubectl get nodes --sort-by=.metadata.name
 NAME    STATUS   ROLES                       AGE   VERSION
 rpi-1   Ready    control-plane,etcd,master   10m   v1.19.3+k3s1
 rpi-2   Ready    control-plane,etcd,master    2m   v1.19.3+k3s1
 rpi-3   Ready    control-plane,etcd,master    2m   v1.19.3+k3s1

De KubeConfig file voor dit cluster is te vinden met het volgende commando:

$ sudo cat /etc/rancher/k3s/k3s.yaml

Deze kan gekopieerd worden naar een lokaal werkstation om hiermee het cluster te managen, mits daar uiteraard ‘kubectl’ op is geïnstalleerd. Als voorbeeld een bestand met de naam ‘rpi’ (met de inhoud uit de KubeConfig):

$ export KUBECONFIG=~/.kube/rpi

Een bestaand cluster kan ook toegevoegd worden aan Rancher!

That’s all folks!