Ga naar inhoud

K3S Cluster

Nodes

  1. Download de Raspberry pi image tool (64bits image RaspianOS)
  2. image, SSH enabled
  3. In de raspberry pi builder:

Ctrl+Shift+X 4. password -> wachtwoord wijzigen 5. public key toevoegen (optioneel) - > .ssh/authorized_keys

1
ssh-copy-id -i ~/.ssh/id_ras.pub pi@<ip address>

Plaats SD-card in de node en start deze met netwerkconnectiviteit op.

Connect to node

sudo apt update
sudo apt full-upgrade
sudo vcgencmd bootloader_version
sudo rpi-eeprom-update -a
sudo raspi-config (update bootloader)

Voeg variabelen toe aan onderstaande bestanden

/boot/cmdline.txt (einde regel)

    cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1

static IP

Voorkeur is om de toewijzing van IP adressen op basis van DHCP reserveringen uit te delen, mocht er voor gekozen worden een statisch ip toe te kennen kan dit via onderstaande methode.

nano /etc/dhcpcd.conf

interface eth0
static_ip_address=172.16.1.x/26
static routers=172.16.1.1
static domain_name_servers=172.16.1.1

DNS wordt ook door middel van DHCP aangeboden, als hier een statische configuratie gewenst is kan dit via onderstaande methode.

/etc/hosts

IP HOSTNAME (~/.zshrc) = SSH aliassen (optioneel) alias sshhostname='ssh pi@hostname'

Enable iptables

sudo apt-get install -y iptables arptables ebtables

1
2
3
4
sudo su -
sudo iptables -F
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy

reboot na deze wijzigingen de node sudo reboot

SSD in plaats van SD (M.2 shield required)

Ik maak gebruik van SSD in plaats van SD op alle nodes omdat deze disken sneller en betrouwbaarder zijn dan een SD kaartje, door middel van een USB3.0 shield voor de raspberry pi boot ik direct vanaf de SSD. omdat de SSD op het shield wordt gemonteerd en aangesloten is via USB kan je deze op dezelfde manier als een SD voorbereiden zoals bij de voorgaande stappen is beschreven.

Als je een nieuwe raspberry pi gebruikt moet je deze eenmalig met de SD kaart opstarten en de eeprom/bios updaten, hierna kan je de boot order aanpassen naar USB als eerste boot device:

sudo raspi-config 6. Advanced options > A6. Boot order > B2. USB BOOT

1
lsblk

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 111.8G 0 disk ├─sda1 8:1 0 256M 0 part /boot └─sda2 8:2 0 111.5G 0 part /

K3S installatie

Mijn cluster bestaat uit 4 nodes en maakt gebruik van etcd high availability, omdat ik voor het management van het cluster gebruik maak van Rancher installeer ik een specifieke versie die ondersteund is door Rancher. Als je hier geen gebruik van maakt kan je de versie weglaten, K3S wordt dan met de laatste versie geïnstalleerd.

1e node

curl -sfL <https://get.k3s.io> | INSTALL_K3S_VERSION="v1.23.9+k3s1" K3S_KUBECONFIG_MODE="644" K3S_TOKEN=SECRET sh -s - server --cluster-init

2e +n node

Let op! High Availability op een K3S cluster werkt pas vanaf 3 nodes, installatie van de etcd database op alle nodes is voor recovery wel aan te raden maar met minder dan 3 nodes zal het cluster geen automatische failover doen naar een andere node bij uitval.

curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION="v1.23.9+k3s1" K3S_KUBECONFIG_MODE="644" K3S_TOKEN=SECRET sh -s - server --server https://lc-k3s-n3.loevencloud.nl:6443

Cluster configuratie en services

Een aantal zaken moeten geconfigureerd worden op het cluster.

Helm installatie

1
2
3
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

Check of node actief is

  • systemctl enable --now k3s-agent
  • k3s kubectl get node (nodes)
  • kubectl get pods -A (pods)

Voeg de jetstack repository toe

helm repo add jetstack https://charts.jetstack.io

Update de repository lijst

helm repo update

Certificate manager

Om gebruik te maken van LetsEncrypt certificaten in mijn cluster installeer ik certificate manager van jetstack

kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.9.1/cert-manager.crds.yaml

of via helm

helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.9.1

Maak een issuer naar LetsEncrypt aan, ik maak gebruik van de DNS resolver in Azure:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  manager: cert-manager-clusterissuers
  name: letsencrypt-production
spec:
  acme:
    email: <LETSENCRYPT-USERNAME>
    preferredChain: ""
    privateKeySecretRef:
      name: letsencrypt-production-account-ci
    server: https://acme-v02.api.letsencrypt.org/directory
    solvers:
    - dns01:
        azureDNS:
          clientID: <APPREGID>
          clientSecretSecretRef:
            key: client-secret
            name: azuredns-config
          environment: AzurePublicCloud
          hostedZoneName: <DNS zone naam>
          resourceGroupName: <ResourceGroup>
          subscriptionID: <SUBID>
          tenantID: <TENANTID>

Nadat certificate manager geïnstalleerd is kan je door middel van de juiste annotations een certificaat aanmaken:

cert-manager.io/cluster-issuer: letsencrypt-production
kubernetes.io/tls-acme: "true"

Install NFS StorageClass

helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --set nfs.server=<nfsTarget> --set nfs.path=/volume1/k3s/data/PVC

Rancher

helm repo add rancher-latest https://releases.rancher.com/server-charts/latest
kubectl create namespace cattle-system
helm install rancher rancher-latest/rancher --namespace cattle-system --set hostname=cluster.loevencloud.nl --set replicas=4 --set ingress.tls.source=letsEncrypt --set letsEncrypt.email=<LETSENCRYPTUSERNAME>

kubectl -n cattle-system rollout status deploy/rancher

update rancher

helm repo update
helm fetch rancher-latest/rancher
helm get values rancher -n cattle-system > ranchercurrent.yml
helm upgrade rancher rancher-latest/rancher --namespace cattle-system -f .\ranchercurrent.yml

kubectl -n cattle-system rollout status deploy/rancher

Wacht nadat rancher is geugraded minimaal 30 minuten voordat je nodes gaat updaten oid.

Nadat Rancher up to date is kunnen de nodes ook voorzien worden van de laatste kubernetes versie.

Node update via rancher

Ga naar Cluster management > Edit config > Kubernetes version en selecteer de laatst ondersteunde versie. (let op beetje wonky tonkie met etcd config.)

first run

echo https://rancher.domein.local/dashboard/?setup=$(kubectl get secret --namespace cattle-system bootstrap-secret -o go-template='{{.data.bootstrapPassword|base64decode}}')

Cluster update plane

kubectl kustomize build https://github.com/rancher/system-upgrade-controller/blob/master/manifests/system-upgrade-controller.yaml | kubectl apply -f -

Cluster monitoring

prometheus operator

Naar namespace monitoring

kubectl create namespace monitoring

cd
git clone https://github.com/prometheus-operator/prometheus-operator.git
cd prometheus-operator/
# Check current setting for namespaces in bundle.yaml
grep namespace: bundle.yaml
  namespace: default
  namespace: default
  namespace: default
  namespace: default

#We will change that to monitoring:
sed -i 's/namespace: default/namespace: monitoring/g' bundle.yaml

#Check again:
grep namespace: bundle.yaml

  namespace: monitoring
  namespace: monitoring
  namespace: monitoring
  namespace: monitoring

Note

get deploy -n monitoring get pods -n monitoring get svc -n monitoring

[https://rpi4cluster.com/monitoring/k3s-svcmonitors/]

Cluster uitschakelen

op iedere node:

/usr/local/bin/k3s-killall.sh

sudo shutdown now