K3S Cluster
Nodes
- Download de Raspberry pi image tool (64bits image RaspianOS)
- image, SSH enabled
- In de raspberry pi builder:
Ctrl+Shift+X 4. password -> wachtwoord wijzigen 5. public key toevoegen (optioneel) - > .ssh/authorized_keys
1 |
|
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 |
|
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 |
|
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 |
|
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