English
DH3MFW
headerimage

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.

nach oben