+49 (160) 944 59 106

Volker Zimmermann

IT-Beratung und Softwareentwicklung

minikube Bare-Metal auf einer Virtuellen Maschine installieren

1. Motivation

minikube ist ein Open Source Projekt, das ein kompaktes Kubernetes Cluster bereitstellt. Es verwendet die offiziellen Kubernetes Binaries und bietet die Möglichkeit, ein Kubernetes Cluster auf einem lokalen Rechner zu starten. Zu diesen Kubernetes-Binaries gehören kube-apiserver, kube-scheduler, kube-controller-manager und kubelet. Damit ist minikube, auch wenn es "nur" auf einem lokalen Rechner läuft, deutlich näher an einem produktiven Kubernetes Cluster als andere Distributionen wie z.B. k3s. So modifiziert k3s den Kubernetes-Quellcode und fasst alle wesentlichen Komponenten (API-Server, Controller-Manager, Scheduler) in einem einzigen Binary zusammen. Es entfernt oder ersetzt weniger häufig verwendete Funktionen, nutzt z.B. kein etcd als Backend und ersetzt es durch SQLite.

minikube wird primär für Entwicklungs-, Test- und Lernzwecke genutzt. Zielgruppe für minikube sind Entwickler und Tester, die Kubernetes so authentisch wie möglich erleben möchten.

minikube läuft standardmäßig auf einem Node, dieser fungiert gleichzeitig als Control Plane (Master Node) und Worker Node. Durch dieses Single Node Setup wird der Installationsaufwand und der Ressourcenbedarf klein gehalten, die Konfiguration ist trotzdem nahezu identisch zu einem vollständigen Kubernetes.

Die Unterschiede zu einem vollständigen Kubernetes sollen nicht verschwiegen werden:

  • Netzwerk: minikube konfiguriert standardmäßig eine einfachere Netzwerkstruktur, z. B. durch interne IP-Weiterleitung und keine Notwendigkeit für einen externen Load Balancer.

  • Add-ons: minikube enthält oft vorinstallierte Add-ons wie das Kubernetes Dashboard oder Flannel, die nicht immer in einer produktiven Installation enthalten sind.

  • Skalierung und HA: minikube ist für Single-Node ausgelegt und unterstützt standardmäßig keine hochverfügbaren oder skalierbaren Multi-Node-Setups.

Das Wichtigste zum Schluss: In eigentlich allen Anleitungen zur Installation von minikube, die im Internet zu finden sind, wird minikube als Docker Container installiert. Eine solche Installation ist deutlich einfacher als die hier dargestellte Vorgehensweise. Die Vorteile der hier vorgestellten Installation von von minikube werden im Artikel minikube Scenarien vorgestellt.

Bemerkung: Im folgenden wird minikube zwar auf einer Virtuellen Maschine (VM) installiert, die Installation erfolgt jedoch so, dass sie auch auf einer eigenen Hardware mit Ubuntu Server 24.04 ausgeführt werden kann. D.h., dass die VM im lokalen Netzwerk als eigener Rechner angesprochen werden kann und die "ganze" VM ein Kubernetes Node ist. Wer es möchte, kann die Installation also 1:1 auf einer dedizierten Hardware ausführen.


2. Vorbereitung der Virtuellen Maschine (VM)

In dieser Anleitung wird folgendes Hardware Setup genutzt:

  • Host: Mac Pro 2019 mit macOS 15
  • Virtuelle Maschine (VM) mit VMware Fusion: Ubuntu 24.04 Server, VM auf dem Mac, 4 Kerne, 16GB RAM und 60GB Disk.

In VMware Fusion ist in den Einstellungen der VM bei 'Prozessoren und RAM', erweiterte Optionen der Punkt 'Hypervisor-Anwendungen in dieser virtuellen Maschine aktivieren' zu aktivieren.

Damit die VM im lokalen Netz als Rechner mit eigener Adresse zu erreichen ist: in VMware Fusion in den Einstellungen der VM bei 'Netzwerkkarte bei 'Bridge-Netzwerk' 'Automatische Erkennung' aktivieren.

Zu root wechseln: sudo -i

Sicherstellen, dass das System auf dem neuesten Stand ist: apt update && apt upgrade -y

Installation der benötigten Pakete: apt install -y curl wget apt-transport-https ca-certificates gnupg lsb-release conntrack

Da Kubernetes keinen Swap mag, wird er deaktiviert: swapoff -a

Damit der Swap nach einem Neustart der VM nicht wieder aktiviert wird, ist die Datei /etc/fstab zu editieren. Die Zeile, in der die Swap Partition definiert wird, ist auszukommentieren:

# /swap.img none swap sw 0 0


3. Installation Container Runtime Interface (CRI)

Da Dockershim ab der Kubernetes Version 1.24 nicht mehr unterstützt wird ist CRI zu installieren, auch wenn Docker als Laufzeitumgebung in Kubernetes genutzt werden soll. Zum Zeitpunkt der Erstellung dieses Artikels ist 1.32 das aktuelle Docker Release.

Repository einrichten:

echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list

GPG-Schlüssel hinzufügen:

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

Pakete updaten und cri-tools installieren: apt update && apt install cri-tools -y

Das Ergebnis der Installation prüfen, die Version sollte ausgegeben werden: crictl --version

Bemerkung: Soll später das Release der cri-tools gewechselt werden z.B. auf ein dann existierendes Minor Release 1.3.3, dann ist das Repository wie folgt zu ändern: sudo sed -i 's/v1.30/v1.31/g' /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt upgrade cri-tools


4. Docker installieren

GPG-Schlüssel hinzufügen:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Docker-Repository hinzufügen:

echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list

Paketlisten aktualisieren und Docker installieren: apt update apt install -y docker-ce docker-ce-cli containerd.io

Docker-Dienst starten und aktivieren:

systemctl start docker
systemctl enable docker

Installation überprüfen: docker --version


5. Installation cri-dockerd

Docker soll als Container-Laufzeitumgebung genutzt werden, daher muss ein cri-docker Service erstellt, konfiguriert und gestartet werden.

Identifizieren des richigen Pakets auf https://github.com/Mirantis/cri-dockerd/releases. Zum Zeitpunkt der Erstellung dieses Artikels cri-dockerd_0.3.16.3-0.debian-bookworm_amd64.deb

Paket herunterladen:

wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.16/cri-dockerd_0.3.16.3-0.debian-bookworm_amd64.deb

Paket installieren: ` dpkg -i cri-dockerd_0.3.16.3-0.debian-bookworm_amd64.deb Die Installation wird durchaus Fehler werfen, da noch abhängige Pakete fehlen. Wichtig ist, dass diese fehlenden Abhängigkeiten dem System jetzt bekannt sind.

Die fehlenden Abhängigkeiten beheben: ` apt install -f

Paket erneut installieren: ` dpkg -i cri-dockerd_0.3.16.3-0.debian-bookworm_amd64.deb

Systemd-Dateien herunterladen:

wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.service
wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.socket

Systemd-Dateien verschieben:

mv cri-docker.service /etc/systemd/system/
mv cri-docker.socket /etc/systemd/system/

Systemd-Dienst aktivieren und starten:

systemctl daemon-reload
systemctl enable --now cri-docker.service
systemctl enable --now cri-docker.socket

Installation überprüfen: cri-dockerd --version

Status der Dienstes überprüfen:

systemctl status cri-docker.service
systemctl status cri-docker.socket

Version von cri-dockerd überprüfen: cri-dockerd --version


6. Installation von minikube

minikube Binary herunterladen: curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 Installieren: install minikube-linux-amd64 /usr/local/bin/minikube

Aufräumen: rm minikube-linux-amd64

Die Bare-Metal Installation, die hier durchgeführt wird, benötigt die Containernetworking Plugins. Dazu auf der Seite containernetworking-plugins die passende Version identifizieren. Zum Zeitpunkt der Erstellung des Artikels ist das die Version v1.6.2.

Variablen setzen: CNI_PLUGIN_VERSION="v1.6.2" CNI_PLUGIN_TAR="cni-plugins-linux-amd64-$CNI_PLUGIN_VERSION.tgz" CNI_PLUGIN_INSTALL_DIR="/opt/cni/bin"

Herunterladen und Installation des Pakets:

curl -LO "https://github.com/containernetworking/plugins/releases/download/$CNI_PLUGIN_VERSION/$CNI_PLUGIN_TAR"
sudo mkdir -p "$CNI_PLUGIN_INSTALL_DIR"
sudo tar -xf "$CNI_PLUGIN_TAR" -C "$CNI_PLUGIN_INSTALL_DIR"
rm "$CNI_PLUGIN_TAR"

Zum Zeitpunkt der Erstellung des Artikels ist für minikube das Issue #6391 offen. Entsprechend der Fehlermeldung von minikube ausführen: sysctl fs.protected_regular=0

Damit ist die Installation von minikube abgeschlossen!

Das Command Line Interface kubectl ist nicht Bestandteil von minikube. Da es zur Verwaltung und Steuerung von Kubernetes essentiell ist, wird es vor dem Start von minikube installiert: apt install -y kubectl


7. minikube starten und erste Schritte

7.1 Erster Start

minikube Version prüfen: minikube version

minikube starten: minikube start --driver=none

Bemerkung: Beim ersten Sart von minikube ist etwas Geduld notwendig. Gegebenenfalls erfolgt nach einiger Zeit die Meldung: 💢 initialization failed, will try again: kubeadm init timed out in 10 minutesBitte einfach weiter warten. Der Start von minikube ist beendet, wenn das Kommando zum Terminal zurückkehrt.

Ein einfacher Test, ob minikube läuft: kubectl get nodes Die Informationen zum Node mit dem Namen des hosts sollte ausgegeben werden.

7.2 minikube beenden

minikube sauber stoppen: minikube stop

7.3 minikube neu starten

Muss minikube, z.B. nach einem Neustart des Rechners, neu gestartet werden, gilt folgende Startprozedur.

Docker starten: systemctl start docker

Wegen des minikube Issues #6391: sysctl fs.protected_regular=0

Neustart von minikube: minikube start --driver=none

7.4 Ersten Pod deployen

Als einfaches Beispiel wird nginx im Cluster deployed, dazu wird das Kommando kubectl run ... genutzt.

Deploy Pod nginx: kubectl run nginx --image=nginx:alpine --port=80

Wer schnell genug ist, kann mit kubectl get pod -A folgenden Status sehen:

NAMESPACE     NAME                            READY   STATUS              RESTARTS   AGE
default       nginx                           0/1     ContainerCreating   0          49s
kube-system   coredns-6f6b679f8f-2r2ss        1/1     Running             0          67m
kube-system   etcd-host                       1/1     Running             2          67m
kube-system   kube-apiserver-host             1/1     Running             2          67m
kube-system   kube-controller-manager-host    1/1     Running             2          67m
kube-system   kube-proxy-k7vdl                1/1     Running             0          67m
kube-system   kube-scheduler-host             1/1     Running             2          67m
kube-system   storage-provisioner             1/1     Running             0          67m

In der obigen Ausgabe sehen wir alle Pods und wegen der Option -A, in allen Namespaces:

Im Namespace 'default' wurde der nginx-Pod gestartet, er beinhaltet einen Container, der noch nicht Ready ist. Sein Status ist ContainerCreating. Dieses Verhalten kann immer gesehen werden, wenn ein Pod zu ersten mal erstellt wird. Die Phase ContainerCreating braucht Zeit um das Image von Docker Hub zu laden. Nach einer Weile ist der Pod dann im Status Running.

Im Namespace 'kube-system' sind die Komponenten von minikube zu sehen, die das eigentliche Control Plane ausmachen.

Bemerkung: Am Anfang des Artikels wurde gesagt, dass minikube standardmäßig auf einem Node läuft. An der obigen Ausgabe kann man das gut sehen. Die Pods, die im Namespace 'kube-system' laufen, liefen auf einer produktiven Kubernetes-Umgebung auf einem eigenen Node, einem Control Plane. Der nginx-Pod wäre dann auf einem Worker Node zu finden. In minikube sind dafür zwei Namespaces eingerichtet.

Um aus dem lokalen Netzwerk auf den nginx-Pod zuzugreifen einen NodePort einrichten: kubectl expose pod nginx --type=NodePort --name=nginx-service

Daten vom Service 'nginx-service' ausgeben: kubectl get service nginx-service

An jedem Rechner im lokalen Netzwerk kann mit der Eingabe von http://hostIP:PortNr in einem Browser auf nginx im Pod zugegriffen werden. Die Startseite von nginx wird angezeigt.


Viel Spaß mit minikube!