Diese Anleitung beschreibt alle Schritte, die für die initiale Installation und Konfiguration eines Kubernetes-Clusters inkl. containerd als Container Runtime Environment auf einen Ubuntu Linux erforderlich sind. Die allgemeine Beschreibung der Kubernetes Architektur finden Sie in diesem Blogbeitrag: Kubernetes Vor- und Nachteile, Architekturbeschreibung
Lab-Umgebung
Die Lab-Umgebung besteht aus drei Worker Nodes und einem Control Node. Die Basis für die Installation ist Ubuntu Linux in der Version Ubuntu 20.04.5 LTS und die Kubernetes Version 1.25.5. Wenn Sie gerade dabei sind, sich in das Thema Kubernetes einzuarbeiten, lohnt es sich, eine mehr oder weniger realistische Umgebung aufzubauen und keine Zeit mit Minikube zu verbringen.
Alle VMs werden auf VMware Workstation (Version 15.5) installiert, inkl. folgende Hardwarekonfiguration:
- RAM 4 GB
- CPU 2 vCPU
Server Typ |
Hostname |
IP-Adresse |
Master |
c01.demo.lab |
192.168.1.170 |
Worker |
w01.demo.lab |
192.168.1.171 |
Worker |
w02.demo.lab |
192.168.1.172 |
Worker |
w03.demo.lab |
192.168.1.173 |
admin-vm |
admin-vm.demo.lab |
192.168.1.165 |
Hier ist die grobe Auflistung der notwenigen Schritten:
- IP-Adressen und Hosts-Dateien konfigurieren
- IP-Anpassen: nano /etc/netplan/00-installer-config.yaml
network:
ethernets:
ens33:
addresses:
- 192.168.1.165/24
gateway4: 192.168.1.254
nameservers:
addresses:
- 192.168.1.1
search:
- demo.lab
version: 2
- Swap-Option deaktivieren
- Firewall deaktivieren
- Installation von kubeadm, kublet, kubectl und containerd auf allen Nodes
- Cluster erstellen
- Network-Plugin anbinden
Vorbereitung
1. Bevor Sie mit der Installation beginnen, passen Sie die Hosts-Datei auf jedem Knoten an (Sie können auch einen DNS-Server für diesen Zweck verwenden).
nano /etc/hosts
nano /etc/hostname
oder
sudo hostnamectl set-hostname master-node
2. Deaktivieren Sie die Swap-Option auf allen VMs. Eine detaillierte Anleitung finden Sie in diesem Blogbeitrag: Swap auf Linux dauerhaft deaktivieren
3. Firewall muss auf allen Knoten deaktiviert werden.
ufw status
ufw disable
Falls die FW wieder aktiviert werden soll.
ufw enable
oder
systemctl status firewalld
systemctl disable firewalld
Falls die FW wieder aktiviert werden soll.
systemctl enable firewalld
Kernelmodul hinzufügen
Offizielle Information: https://kubernetes.io/docs/setup/production-environment/container-runtimes/
1. 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
2. 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
3. sysctl-Parameter ohne Neustart übernehmen
sudo sysctl --system
4. Die Paketliste aktualisierten
sudo apt update
Installation containerd
5. containerd-Komponenten installieren
Die Paketliste aktualisierten.
sudo apt-get install -y containerd
6. In weiteren Schritten erstellen wir einen Ordner, in dem die containerd-Konfigurationsdatei abgelegt wird und anschließend wird die Konfigurationsdatei erzeugt:
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
7. Die Konfigurationsdatei beinhalten die Default-Werte, die noch angepasst werden müssen:
sudo nano /etc/containerd/config.toml
Ändern Sie am Ende dieses Abschnitts:
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = false in SystemdCgroup = true
8. Dann starten Sie containerd mit der neuen Konfiguration:
sudo systemctl restart containerd
Zu Beachten
Die älteren containerd-Versionen beinhalten die benötigten Zeilen nicht und müssen zuerst manuell hinzugefügt werden.
Installation kubeadm, kubelet and kubectl
9. Im ersten Schritt werden wir den gpg-Schlüssel der Google-Repository unserem System hinzufügen, damit unser System dieser Repository vertrauen kann.
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
weiter fügen wir diese Repository der lokalen Repository-Listen hinzu.
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
10. Aktualisieren Sie die Paketliste
sudo apt-get update
11. und überprüfen Sie welche Versionen im Repository verfügbar. (mit –n “Zahl” steuert man die Anzahl der angezeigten Zeilen)
apt-cache policy kubelet | head -n 20
Installation
12. Passende Version für die Installation auswählen. Ich meinen Fall werde ich die ältere Version auswählen, um die spätere Cluster-Aktualisierung dokumentieren zu können.
Installation starten:
sudo apt-get install -y kubelet=1.25.5-00 kubeadm=1.25.5-00 kubectl=1.25.5-00
oder mit einer Variable:
VERSION=1.25.5-00
sudo apt-get install -y kubelet=$VERSION kubeadm=$VERSION kubectl=$VERSION
13. Überprüfen Sie die Installationsergebnisse, ob die Services „up & running“:
sudo systemctl status kubelet.service
sudo systemctl status containerd.service
14. Passen Sie die Dienste an, dass die beim Hochfahren des Systems automatisch gestartet werden.
sudo systemctl enable kubelet.service
sudo systemctl enable containerd.service
15. Nachdem die Installation abgeschlossen ist, ist es notwendig, eine „zufällige“ Aktualisierung der Komponenten zu vermeiden. Mit der Option Hold (unhold) lässt sich die Aktualisierung von Paketen steuern.
sudo apt-mark hold kubelet kubeadm kubectl containerd
Die oberen Schritte müssen auf allen Nodes durchgeführt werden!
Cluster Bootstrapping
Nach der Installation der Kernkomponenten geht die Konfiguration des Clusters weiter. Für diesen Zweck wird das Kubeadm-Tool eingesetzt.
Nur auf dem Control Node!
16. Zuerst wird die Calico Manifest-Datei heruntergeladen.
wget https://docs.projectcalico.org/manifests/calico.yaml
17. Die Einstellung müssen an die Infrastruktur angepasst sein, um die Überschneidungen der IP-Bereichen zu vermeiden.
Datei öffnen
nano calico.yaml
Zum Abschnitt CALICO_IPV4POOL_CIDR navigieren.
den Wert durch einen passenden ersetzen und die Datei speichern.
18. Mit der folgenden Befehlskette können die Einstellungen überprüft bzw. in der Datei ClusterConfiguration abgespeichert werden.
kubeadm config print init-defaults | tee ClusterConfiguration.yaml
19. Initialisierung des Clusters durchführen:
sudo kubeadm init
oder
sudo kubeadm init --kubernetes-version v1.25.5
Wenn die Initialisierung des Clusters erfolgreich verlaufen ist, werden die Ergebnisse ähnlich aussehen:
Die untere Befehlskette ist für die Anbindung der Worker Nodes an den Cluster notwendig.
20. 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
21. Auf Basis von calico.yaml wird ein Pod-Netzwerk erstellt.
kubectl apply -f calico.yaml
22. Der folgende Schritt muss auf allen Nodes durchgeführt werden!
Der Befehl sudo kubeadm join wird verwendet, um einen neuen Worker-Knoten zu einem bestehenden Kubernetes-Cluster hinzuzufügen.
sudo kubeadm join 192.168.1.170:6443 --token 9yfgi9.5r71sn1crpmupezi \
--discovery-token-ca-cert-hash sha256:8ab42b0b6d3c21f3aa93495e0d102710df3baea5e22e9dfc33ed58830f024a3f
Ergebnisse überprüfen
23. Wenn Sie auf dem Control Node folgende Ergebnisse sehen, dann war die Installation/Konfiguration des Cluster erfolgreich.
kubectl get nodes
Konfiguration der Admin-VM
Anschließend wird die Admin VM eingerichtet.
1. Die kubectl-Binärdatei herunterladen
wget https://storage.googleapis.com/kubernetes-release/release/v1.25.5/bin/linux/amd64/kubectl
2. Die geladenen Datei ausführbar machen:
chmod +x kubectl
3. Die Binärdatei in den Pfad verschieben:
sudo mv ./kubectl /usr/local/bin/kubectl
4. Einen Ordner zur Speicherung der Config-Datei erstellen:
mkdir $HOME/.kube
5. Die Config-Datei vom Control Node auf die Admin-VM kopieren:
sudo scp $HOME/.kube/config Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!:/home/anatoli/.kube/config
Mögliche Probleme nach der Cluster-Initialisierung:
In meiner Situation hatte ich einige Kompatibilitätsprobleme, so dass die Initiierung des Clusters nicht möglich war. Beim Ausführen des Befehls kubeadm init kam die folgende Fehlermeldung:
[ERROR CRI]: container runtime is not running: output: time="2023-02-04T14:04:42Z" level=fatal msg="validate service connection: CRI v1 runtime API is not implemented for endpoint \"unix:///var/run/containerd/containerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"
Folgende Schritte ist ein funktionierender Workaround:
wget https://github.com/containerd/containerd/releases/download/v1.6.12/containerd-1.6.12-linux-amd64.tar.gz
tar xvf containerd-1.6.12-linux-amd64.tar.gz
sudo systemctl stop containerd
cd bin
sudo cp * /usr/bin/
sudo systemctl start containerd
Fortsetzung: Erste Schritte nach der Installation des Kubernetes Clusters (kreyman.de)