Installation von Kubernetes auf Ubuntu 20.04

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

Demo Lab Kubernetes

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

001 grep overlay br netfilter

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

002 net.bridge.bridge

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

004 SystemdCgroup

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

007 head n

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

005 hold

 

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.

010 CALICO IPV4POOL CIDR

den Wert durch einen passenden ersetzen und die Datei speichern.

011 CALICO IPV4POOL CIDR angepasst

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: 

012 Installation Abgeschlossen

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

014 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

015 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!:/path/to/.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"

error cri runtime

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)

Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell für den Betrieb der Seite, während andere uns helfen, diese Website und die Nutzererfahrung zu verbessern (Tracking Cookies). Sie können selbst entscheiden, ob Sie die Cookies zulassen möchten. Bitte beachten Sie, dass bei einer Ablehnung womöglich nicht mehr alle Funktionalitäten der Seite zur Verfügung stehen.