
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.

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!