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.
In dieser Anleitung wird folgendes Hardware Setup genutzt:
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
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
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
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
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
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.
minikube sauber stoppen:
minikube stop
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
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.