Beginnend muss ein passendes Linux Ubuntu Server 22.04.3 für alle Nodes installiert und folgende Einstellungen angepasst werden:
hostnamectl set-hostname <NAME>
IP-Adresse mit --> ip addr anzeigen
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:50:56:81:93:a0 brd ff:ff:ff:ff:ff:ff
altname enp2s1
inet 172.16.155.10/24 brd 172.16.155.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::250:56ff:fe81:93a0/64 scope link
valid_lft forever preferred_lft forever
In der Datei /etc/netplan/00... --> die richtige IP-Adresse einstellen.
root@cl1-master-01:~$ cat /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
ethernets:
ens33:
addresses:
- 172.16.155.10/24
nameservers:
addresses:
- 172.16.16.11
search:
- d00.cccrz.de
routes:
- to: default
via: 172.16.155.1
version: 2
Dann mit netplan apply die Änderungen ohne Reboot übernehmen.
swapoff -a --> Swapdatei ausschalten
Wenn man nach der Offiziellen Dokumentation geht, soll zuerst eine ContainerRuntime installiert werden. Das war früher Docker, aber ab der Version 1.24 nicht mehr. Jetzt stehen folgende Runtime´s zur Auswahl
Ich habe mich für containerd entschieden.
Auch eine sehr gute Anleitung gibt es bei https://www.kreyman.de gefunden. Die gehen in einer anderen Reihenfolge vor, was auch funktioniert ;-)
Zuerst gehören noch ein paar Kernelmodule installiert.
Offizielle Information: https://kubernetes.io/docs/setup/production-environment/container-runtimes/
Zum Betrieb von containerd werden folgende Kernelmodule geladen und die dazugehörigen Informationen aktualisiert.
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
modprobe ist ein Linux-Programm und dazu dient, ein ladbares Kernelmodul zum Linux-Kernel hinzuzufügen oder ein ladbares Kernelmodul aus dem Kernel zu entfernen.
Überprüfen Sie, ob die Module geladen sind:
lsmod | grep br_netfilter
lsmod | grep overlay
Weiterhin werden folgenden sysctl-Paramter angepasst und konfiguriert, sodass diese nach dem Reboot erhalten bleiben.
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
Parameter ohne Neustart übernehmen
sudo sysctl --system
Wieder die Paketlisten aktualisierten
sudo apt update
Jetzt die containerd-Komponente installieren
sudo apt-get install -y containerd
Für die containerd-Konfigurationsdatei einen Ordner erstellen und eine Default-Konfigurationsdatei erzeugen:
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
In der erzeugten Konfigurationsdatei muss noch ein Eintrag angepasst werden:
sudo vi /etc/containerd/config.toml
Ändert am Ende dieses Abschnitts den Eintrag auf True
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = false in SystemdCgroup = true
Dann kann der containerd Dienst mit der geänderten Konfiguration gestartet werden.
sudo systemctl restart containerd
Installation der Kubernetes Tools kubeadm, kubelet and kubectl
Sicherheitshalber ein Package Update durchführen und benötigte Pakete installieren :-)
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
Den öffentlichen Schlüssel herunterladen und für weitere Aktionen verwenden.
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
Füge die Kubernetes APT Repository hinzu:
# Diese Zeile überschreibt eine bestehende Konfiguration in /etc/apt/sources.list.d/kubernetes.list
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
Update den apt package index, installiere kubelet, kubeadm and kubectl, and markiere diese Version nur für händischen Update:
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
All diese Schritte müssen auf allen Nodes durchgeführt werden !!
Da nun die Vorarbeiten beendet sind, wird mit dem Tool kubeadm ein Cluster vom MasterNode aus generiert.
Mit der folgenden Befehlskette wird eine Default Konfiguration in die Datei ClusterConfiguration.yaml gespeichert und kann wenn nötig noch umkonfiguriert werden.
kubeadm config print init-defaults | tee ClusterConfiguration.yaml
Initialisierung des Clusters durchführen:
sudo kubeadm init
oder mit Versionsangabe
sudo kubeadm init --kubernetes-version v1.25.5
Wenn die Initialisierung des Clusters erfolgreich verlaufen ist, werden die Ergebnisse ähnlich aussehen:
Die untere Befehlskette kubeadm join ist für die Anbindung der Worker Nodes an den Cluster notwendig.
Folgende Schritte sind notwendig, um den nicht privilegierten Benutzer zu erlauben den Cluster zu verwalten.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Der folgende Schritt muss auf allen Worker-Nodes durchgeführt werden!
Der Befehl sudo kubeadm join wird verwendet, um einen neuen Worker-Knoten zu einem bestehenden Kubernetes-Cluster hinzuzufügen.
kubeadm join 172.16.155.10:6443 --token 567ska.2whoy1d7l7x8l3er \
--discovery-token-ca-cert-hash sha256:910da7f6c5e5b4e3835619c5ee1dbc855e5c9798eecf0f9b11a84021e4b0b04e
Wenn Sie auf dem Master Node folgende Ergebnisse sehen, dann war die Installation/Konfiguration des Cluster erfolgreich.
kubectl get nodes
Dann braucht es ein sogenanntes Overlay Netzwerk, um die einzelnen Nodes per Netzwerk zu verbinden. Da stehen auch, wie soll es auch nicht anders sein, verschiedenste Möglichkeiten zur Verfügung.
Eine Kollegin meinte ich solle mal Cilium verwenden :-).
https://docs.cilium.io/en/stable/gettingstarted/k8s-install-default/
cilium herunterladen
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
Cilium installieren
cilium install --version 1.14.2
root@cl1-master-01:~# cilium install --version 1.14.2
ℹ️ Using Cilium version 1.14.2
🔮 Auto-detected cluster name: kubernetes
🔮 Auto-detected kube-proxy has been installed
root@cl1-master-01:~# cilium status --wait
/¯¯\
/¯¯\__/¯¯\ Cilium: OK
\__/¯¯\__/ Operator: OK
/¯¯\__/¯¯\ Envoy DaemonSet: disabled (using embedded mode)
\__/¯¯\__/ Hubble Relay: disabled
\__/ ClusterMesh: disabled
Deployment cilium-operator Desired: 1, Ready: 1/1, Available: 1/1
DaemonSet cilium Desired: 4, Ready: 4/4, Available: 4/4
Containers: cilium Running: 4
cilium-operator Running: 1
Cluster Pods: 2/2 managed by Cilium
Helm chart version: 1.14.2
Image versions cilium quay.io/cilium/cilium:v1.14.2@sha256:6263f3a3d5d63b267b538298dbeb5ae87da3efacf09a2c620446c873ba807d35: 4
cilium-operator quay.io/cilium/operator-generic:v1.14.2@sha256:52f70250dea22e506959439a7c4ea31b10fe8375db62f5c27ab746e3a2af866d: 1
Jetzt braucht es noch die dazugehörige Grafische Oberfläche :-)
cilium hubble enable
root@cl1-master-01:~# cilium status
/¯¯\
/¯¯\__/¯¯\ Cilium: OK
\__/¯¯\__/ Operator: OK
/¯¯\__/¯¯\ Envoy DaemonSet: disabled (using embedded mode)
\__/¯¯\__/ Hubble Relay: OK
\__/ ClusterMesh: disabled
Deployment cilium-operator Desired: 1, Ready: 1/1, Available: 1/1
Deployment hubble-relay Desired: 1, Ready: 1/1, Available: 1/1
DaemonSet cilium Desired: 4, Ready: 4/4, Available: 4/4
Containers: cilium-operator Running: 1
hubble-relay Running: 1
cilium Running: 4
Cluster Pods: 3/3 managed by Cilium
Helm chart version: 1.14.2
Image versions hubble-relay quay.io/cilium/hubble-relay:v1.14.2@sha256:a89030b31f333e8fb1c10d2473250399a1a537c27d022cd8becc1a65d1bef1d6: 1
cilium quay.io/cilium/cilium:v1.14.2@sha256:6263f3a3d5d63b267b538298dbeb5ae87da3efacf09a2c620446c873ba807d35: 4
cilium-operator quay.io/cilium/operator-generic:v1.14.2@sha256:52f70250dea22e506959439a7c4ea31b10fe8375db62f5c27ab746e3a2af866d: 1
https://docs.cilium.io/en/stable/gettingstarted/hubble_setup/#hubble-setup
Jetzt die letzten Versionen installieren
HUBBLE_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/hubble/master/stable.txt)
HUBBLE_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then HUBBLE_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/hubble/releases/download/$HUBBLE_VERSION/hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum}
sha256sum --check hubble-linux-${HUBBLE_ARCH}.tar.gz.sha256sum
sudo tar xzvfC hubble-linux-${HUBBLE_ARCH}.tar.gz /usr/local/bin
rm hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum}
root@cl1-master-01:~# cilium hubble port-forward&
[1] 9885
root@cl1-master-01:~# hubble status
Healthcheck (via localhost:4245): Ok
Current/Max Flows: 3,935/16,380 (24.02%)
Flows/s: 8.69
Connected Nodes: 4/4
Sodala wäre der Kubernetes Cluster über seine ClusterIP erreichbar.
root@cl1-master-01:~# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d21h
Diese ist aber im Internen Netzwerk von Extern nicht erreichbar.
