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