Für dieses Tutorial wurden zwei virtuelle Maschinen mit Ubuntu 20.04.1 LTS verwendet.

Wenn du einen On-Premises Kubernetes-Cluster benötigst, ist K3s eine gute Option, da nur eine kleine Binärdatei pro Node installiert werden muss.

Bitte beachte, dass ich aus Datenschutzgründen alle Domainnamen, IP-Adressen und so weiter unkenntlich gemacht habe.

Installation des Clusters

Auf der Maschine, die der Hauptknoten sein wird, installiere die K3s-Binärdatei:

curl -sfL https://get.k3s.io | sh -

Hole das Node-Token, das im nächsten Schritt benötigt wird:

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

Auf jeder Maschine, die ein Worker-Node sein wird:

curl -sfL https://get.k3s.io | K3S_URL=https://kubernetes01.domain.de:6443 K3S_TOKEN=<the-token-from-the-step-before> sh -

Zurück auf dem Hauptknoten, überprüfe ob alle Nodes vorhanden sind:

sudo k3s kubectl get node
NAME      STATUS ROLES     AGE VERSION
kubernetes01.domain.de Ready control-plane,master 18m v1.20.0+k3s2
kubernetes02.domain.de Ready <none>     93s v1.20.0+k3s2

Einen Service deployen

Für einen ersten Test, deploye einige NGINX-Instanzen in den Cluster mit folgendem Manifest:

apiVersion: apps/v1
kind: Deployment
metadata:
 name: nginx-deployment
spec:
 selector:
 matchLabels:
  app: nginx
 replicas: 10
 template:
 metadata:
  labels:
  app: nginx
 spec:
  containers:
  - name: nginx
  image: nginx:1.14.2
  ports:
  - containerPort: 80

Speichere dies als nginx-deployment.yml und installiere es:

kubectl apply -f nginx-deployment.yml

Es sollten jetzt 10 Pods mit NGINX laufen. Warum 10? Nur zum Spaß - passe es nach Belieben an.

Überprüfe, wo diese Pods laufen:

kubectl get pods -l app=nginx --output=wide

Einen Service erstellen

Dieser Schritt ist der erste von zweien, um das interne Deployment von außerhalb des Clusters zugänglich zu machen.

apiVersion: v1
kind: Service
metadata:
 name: nginx
 labels:
 run: nginx
spec:
 ports:
 - port: 80
  protocol: TCP
 selector:
 app: nginx

Speichere als nginx-service.yml und wende es an:

kubectl apply -f nginx-service.yml

Überprüfe, ob es funktioniert hat:

sudo kubectl get services
NAME   TYPE  CLUSTER-IP  EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 00.0.0.0  <none>  443/TCP 4h9m
nginx  ClusterIP 00.00.000.000 <none>  80/TCP 13

Aber es muss doch Load-Balanced werden, oder?

Richtig!

Ingress mit HAProxy

Nach dem Erstellen des Services mache die NGINX-Instanzen von außen zugänglich, indem du einen Ingress mit HAProxy erstellst.

Das ursprüngliche Manifest von HAProxy ist ziemlich lang, daher wird es hier nicht wiederholt. Es kann direkt von seiner Quelle installiert werden:

kubectl apply -f https://raw.githubusercontent.com/haproxytech/kubernetes-ingress/v1.4/deploy/haproxy-ingress.yaml

Überprüfe, dass der Ingress erstellt wurde:

sudo kubectl get ingress
NAME   CLASS HOSTS ADDRESS  PORTS AGE
nginx-ingress <none> *  00.000.0.000 80  2m38s

Lass uns zusätzlich mit einem der Pods “sprechen”:

curl 10.199.7.120/nginx
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.14.2</center>
</body>
</html>

Der 404-Fehler ist erwartet - alle NGINX-Instanzen sind “leer”.

Den lokalen Kubernetes-Kontext ändern

Es ist bequemer, den Cluster von deinem lokalen Terminal aus zu steuern, ohne sich per SSH auf den Master-Node einzuloggen.

Kopiere den Inhalt von /etc/rancher/k3s/k3s.yaml vom Hauptknoten und füge ihn zu deiner lokalen ~/.kube/config hinzu.

Ersetze “localhost” durch die IP oder den Namen des K3s-Hauptknotens.

Auf der lokalen Maschine ändere den Kontext mit:

kubectl set-context <yourcontext>

Verifiziere durch Abrufen von Pods, zum Beispiel:

kubectl get pods -o wide

Ressourcen