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!