K3s HA-cluster

Ter lering ende vermaeck ga ik een Kubernetes HA-Cluster maken met Raspberry PI’s, model 4B, bestaande uit 3 nodes met alle roles, dus Control Plane, ETCD en Worker. 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)

Eerst dient er de cgroup instellingen voor memory toegevoegd te worden aan /boot/firmware/cmdline.txt. Voeg hier het volgende aan toe, op dezelfde regel:

cgroup_enable=memory cgroup_memory=1

Een herstart is noodzakelijk om deze instellingen te gebruiken. Hierna is alleen nog ‘containerd‘ nodig:

$ sudo apt update && sudo apt install containerd

Het HA-Cluster met 3 nodes

Eén van de verschillen met de single-node installatie is dat een K3S-HA-Cluster met (embedded) etcd werkt als datastore. Als alternatief kan een externe database gebruikt worden zoals mySQL, MariaDB of PostgeSQL. Voor nu de etcd-datastore:

Installatie K3s 1e node (master,etcd,worker)

De installatie wordt met een script uitgevoerd. Door de parameter --cluster-init mee te geven wordt etcd als datastore ingesteld.

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

Na de installatie kan de controle uitgevoerd worden met

$ k3s check-config

Indien dan de status ‘pass‘ is kan de master-node gecontroleerd worden met:

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

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

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

Installatie K3s overige nodes (master,etcd,worker)

Maak verbinding met de worker node(s)

$ ssh rpi-2

En voer de volgende commando’s uit:

$ export K3S_URL="https://<IP ADRES VAN MASTER NODE>:6443"
$ export K3S_TOKEN="<JOIN-TOKEN UIT STAP 2>"
$ curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--write-kubeconfig-mode 644 server --token ${K3S_TOKEN} --server ${K3S_URL}" sh -

Herhaal deze stappen voor alle toe te voegen nodes.

KubeConfig ophalen

Om kubectl op je werkstation te kunnen gebruiken heb je de KUBECONFIG yaml file nodig, die vind je op de master-node:

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

Kopieer deze op je lokale werkstation naar ~/.kube/config of naar een ander bestand waar je een verwijzing mee maakt via ‘export KUBECONFIG=<bestand>

Wijzig het localhost-adres van de master-node in dit bestand naar het externe IP adres van de master-node.

$ export KUBECONFIG=~/.kube/rpi 
$ kubectl get nodes
NAME    STATUS   ROLES                       AGE   VERSION
rpi-1   Ready    control-plane,etcd,master   10m   v1.19.4+k3s1
rpi-2   Ready    control-plane,etcd,master   10m   v1.19.4+k3s1
rpi-3   Ready    control-plane,etcd,master   11m   v1.19.4+k3s1

$ kubectl label node rpi-1 rpi-2 rpi-3 node-role.kubernetes.io/worker=true

$ kubectl get nodes
NAME    STATUS   ROLES                              AGE   VERSION
rpi-1   Ready    control-plane,etcd,master,worker   11m   v1.19.4+k3s1
rpi-2   Ready    control-plane,etcd,master,worker   11m   v1.19.4+k3s1
rpi-3   Ready    control-plane,etcd,master,worker   12m   v1.19.4+k3s1


Het voordeel van K3S is dat de metrics-server automatisch toegevoegd wordt en je dus het ‘kubectl top’ commando kunt gebruiken.

Ook wordt ‘traefik‘ geïnstalleerd waardoor je load-balancers kunt aanmaken en benaderen met ‘ingress’, out-of-the-box!

De K3S-cluster kan nu ook toegevoegd worden aan een bestaande Rancher Manager en daarmee krijg je een GUI om je workloads te beheren.

Hiermee kan dan ook ‘Continuous Delivery‘ gebruikt worden om applicaties vanuit GitRepo’s te deployen. Zie hiervoor de pagina ‘CI/CD met Rancher 2.5

That’s all! Have fun 😉