K3s multi-node cluster

Deze keer een Kubernetes Cluster met Raspberry PI’s, model 4B, bestaande uit 3 nodes bestaande uit één Master en twee Workers. 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 Master 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_VERSION=v1.19.3+k3s1 sh -

Zodra de installatie gereed is kan de node opgevraagd worden:

$ sudo kubectl get nodes
NAME    STATUS   ROLES                  AGE   VERSION
rpi-1   Ready    control-plane,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 workers-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 worker nodes

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

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

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

$ curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.19.3+k3s1 K3S_URL=${K3S_URL} K3S_TOKEN=${K3S_TOKEN} sh -

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


Op de master-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,master   10m   v1.19.3+k3s1
 rpi-2   Ready    <none>                 2m    v1.19.3+k3s1
 rpi-3   Ready    <none>                 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

Om op de master-node (rpi-1) geen workloads te laten schedulen, kan een ’taint’ gezet worden waardoor nieuwe workloads alleen op de worker-nodes terecht komen, tenzij een ’toleration’ gebruikt wordt.

$ kubectl taint node rpi-1 node-role.kubernetes.io/master=true:NoSchedule

Een bestaand cluster kan ook toegevoegd worden aan Rancher!

That’s all folks!