Je eigen K3S thuiscluster opzetten 

In 2021 heeft onze voormalige collega Bas Bremer de componenten voor zijn Kubernetes cluster thuis ontvangen. In deze blog deelt hij hoe hij zijn K3S thuiscluster heeft opgezet, omdat hij veel moeite had met het vinden van één artikel met een duidelijke Kubernetes thuisopstelling. 

home cluster k3s

Hoe ik ben begonnen 

Ik heb 3 HP ProDesk 600 G2 computers geselecteerd als de nodes. Eén van de nodes is de control plane node, de andere twee zijn worker nodes.

Ik heb voor mini computers gekozen in plaats van Raspberry PI's vanwege de processor architectuur (x86 in plaats van ARM) en de mogelijkheid om resources uit te breiden. Ik werd geïnspireerd door het Tiny Mini Micro project.

In eerste instantie installeerde ik Ubuntu 20.04 LTS als besturingssysteem en Kubernetes 1.21 erop (met behulp van Kubeadm). Het doel was om me voor te bereiden op mijn CKA examen (wat ik heb gehaald).

Na het halen van het examen wilde ik een andere opstelling, bestaande uit de volgende componenten: 

  • K3S als Kubernetes distributie
  • MetalLB als load balancer
  • Rancher als cluster management
  • Traefik als ingress controller
  • Cert-Manager als certificate manager 

Tijdens het proces vond ik veel artikelen, maar veel waren niet erg duidelijk (vooral voor K3S). Ik hoop een duidelijke gids te bieden voor andere engineers met dezelfde uitdaging. 

K3S installatie 

Om k3s te installeren koos ik voor shell scripting, omdat ik niet veel opties nodig heb voor de installatie (alleen Traefik installatie uitsluiten). Zoals eerder vermeld, heb ik een cluster met 3 nodes met één control plane en 2 workers. Tijdens de volgende stappen moet de node token worden opgehaald van de control plane node, om de worker nodes toe te voegen.

De gebruikte scripts worden hieronder getoond. 

Installeer k3s server 

SSH naar de control plane server en voer het onderstaande script uit. 

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC=”server --disable traefik 
--disable servicelb” sh -


Token ophalen 

Haal de node token op van de control plane, die later in het proces nodig is om de worker nodes toe te voegen. 

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

Certificaat ophalen 

Haal het certificaat op om met het cluster te kunnen communiceren. Sla dit op je lokale machine op in ~/.kube/<je config bestand>. 


cat /etc/rancher/k3s/k3s.yaml


Worker node toevoegen 

SSH naar je worker node(s) en pas het onderstaande script toe. Dit zal de node als worker node aan het cluster toevoegen. 


curl -sfL https://get.k3s.io | K3S_URL=https://<Contol Plane IP>:6443 
K3S_TOKEN=<YourToken> sh -
 

Certificaat laden 

Zodra de voorgaande stappen zijn toegepast, kun je het volgende script uitvoeren om de Kubernetes config te laden. 


export KUBECONFIG=/.kube/<your config file>

Nu zou je het cluster moeten kunnen gebruiken.

Controleer dit door het volgende commando uit te voeren. 


kubectl get nodes

Het resultaat is een lijst met de beschikbare nodes. 

MetalLB installatie

Omdat ik alle toepassingen die op het cluster draaien via één eindpunt wilde benaderen, heb ik MetalLB aan het cluster toegevoegd. Om het toe te voegen heb ik de standaard manifests gebruikt voor versie 0.11. Hiervoor heb ik de standaard installatiescripts. Voor de configuratie heb ik de layer 2 configuratie scripts gebruikt. Selecteer een reeks IP-adressen die niet al in gebruik is. 

Rancher installatie 

De rancher installatie was rechttoe rechtaan. Ik heb Helm templates gebruikt om Rancher te installeren. Als je de opties in het helm values bestand wilt gebruiken, kijk dan op deze website. 

Helm install

Voeg repository toe 


helm repo add rancher-latest https://releases.rancher.com/
server- charts/latest


Installeer helm chart 

helm install rancher rancher-latest/rancher \
 --namespace cattle-system \
 --set hostname=<Your Domain Name>
 --set bootstrapPassword=<Your password>


Als het klaar is, zou je moeten zien dat alle deployments in de cattle-system namespace (wat de standaard namespace van Rancher is) draaien. Daarna kun je het dashboard benaderen met de eerder opgegeven hostname. Als je geen hostname hebt opgegeven, kun je het benaderen door een port forward op te zetten met het volgende commando. 


kubectl port-forward svc/rancher 8443:443 -n cattle-system

Traefik installatie 

De Traefik installatie was ook vrij eenvoudig. Ik heb de helm template gebruikt met een aanvullend values bestand. Deze waarden zijn nodig om toegang te krijgen tot het dashboard. 

Helm install

Voeg repository toe 

helm repo add traefik https://helm.traefik.io/traefik
 

Maak het values bestand met de volgende inhoud. 


dashboard:
enabled: true
domain: traefik.<Your Domain Name>
rbac:
enabled: true

Installeer de helm chart in de traefik namespace met de configuratie uit het values bestand. Als de namespace niet bestaat, maak deze dan aan. 


helm install traefik traefik/traefik -n traefik -f values.yaml

Als het klaar is, zou je moeten zien dat alle deployments in de traefik namespace (die ik heb gemaakt als de Traefik namespace) draaien. Daarna kun je het dashboard benaderen met de eerder opgegeven hostname. Als je geen hostname hebt opgegeven, kun je het benaderen door een port forward op te zetten met het volgende commando. 


kubectl port-forward deploy/traefik 9000 -n traefik

Cert-Manager

Omdat ik automatische certificaatvernieuwing wilde, had ik een certificaatbeheerder nodig. Cert-Manager is de standaard certificaatbeheerder voor Kubernetes. Ik heb Cert-Manager geïnstalleerd met behulp van helm templates. Om het te installeren heb ik de commando's gebruikt die je hieronder vindt. 

Installeer Cert-Manager 

Voeg helm repository toe 


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

 

Installeer cert manager met het volgende script. 


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

 

Wanneer Cert-Manager is geïnstalleerd, is een ClusterIssuer of Issuer nodig om te helpen bij het verstrekken van certificaten. Om dit te doen met zelfondertekende certificaten, moet een eenvoudig yaml-bestand worden toegepast (dat hieronder wordt getoond).


apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
 name: selfsigned
spec:
 selfSigned: {}
 

Als je CA-ondertekende certificaten wilt gebruiken, moet de ClusterIssuer of Issuer anders worden geconfigureerd.

Test applicatie


Om te testen of de omgeving werkt, heb ik een eenvoudige testdeployment gemaakt. Deze testdeployment bestaat uit: 

  • Namespace
  • Deployment
  • Service
  • Ingress
  • Certificate

Hieronder staan de yaml-bestanden die ik heb gebruikt. 

Namespace


apiVersion: v1
kind: Namespace
metadata:
 name: test
 

Deployment


apiVersion: apps/v1
kind: Deployment
metadata:
 name: nginx
 namespace: test
spec:
 replicas: 1
 selector:
   matchLabels:
     # manage pods with the label app: nginx
     app: nginx
 template:
   metadata:
     labels:
       app: nginx
   spec:
     containers:
     - name: nginx
       image: nginx
       ports:
       - containerPort: 80

Service


apiVersion: v1
kind: Service
metadata:
 name: nginx-svc
 namespace: test
spec:
 ports:
 - name: http
   port: 80
   targetPort: 80
 - name: https
   port: 443
   targetPort: https
 selector:
   app: nginx
 

Ingress


apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
 name: nginx-ingress
 namespace: test
 annotations:
   kubernetes.io/ingress.class: traefik
   cert-manager.io/cluster-issuer: selfsigned
   traefik.ingress.kubernetes.io/router.tls: "true"
spec:
 rules:
 - host: test.<Your Domain Name>
   http:
     paths:
     - path: /
       pathType: Prefix
       backend:
         service:
           name: nginx-svc
           port:
             number: 80
 tls:
 - hosts:
   - test.<Your Domain Name>
   secretName: test.<Your Domain Name>
 

Certificate


apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
 name: test.<Your Domain Name>
 namespace: test
spec:
 commonName: test.<Your Domain Name>
 secretName: test.<Your Domain Name>
 dnsNames:
   - test.<Your Domain Name>
 issuerRef:
   name: selfsigned
   kind: ClusterIssuer
 

Wanneer gedeployed, zou je de website in je browser moeten kunnen bereiken. Om dit op mijn lokale systeem te doen, heb ik een toevoeging gedaan aan mijn hosts bestand, dat eruitziet als het onderstaande voorbeeld. In het voorbeeld vervang je het IP met het IP van je MetalLB en <Jouw Domeinnaam> met je domeinnaam. 


10.0.0.1 test.<Your Domain Name>
 

Je zou een website moeten zien met de volgende inhoud: 

Let op! Omdat een zelfondertekend certificaat wordt gebruikt, moet het certificaat worden vertrouwd.

Samenvatting

Als de stappen correct zijn gevolgd, zou je je K3S cluster moeten hebben draaien.

Bedankt voor het lezen, en ik wens je veel plezier bij het maken van je eigen cluster!