☸ Kubernetes im Heimlabor

Kurs › Folge 03

Die Landkarte: Control Plane, Worker, etcd, kubelet

Welches Teil im Cluster welche Aufgabe hat — bevor wir irgendetwas installieren.

Das Video zu dieser Folge ist noch nicht veröffentlicht. Die Notizen stehen trotzdem schon hier.

Was du danach kannst

  • die Bestandteile der Control Plane benennen und ihre Aufgabe erklaeren
  • den Weg eines kubectl-Befehls bis zum laufenden Container nachvollziehen
  • erklaeren, warum etcd das empfindlichste Teil ist — und warum das eine Frage der Platte ist

Worum es geht

Bevor wir etwas installieren, die Landkarte: Welches Bauteil hat welche Aufgabe, und was passiert eigentlich zwischen dem Moment, in dem du Enter drückst, und dem Moment, in dem ein Container läuft.

Die Teile

Control Plane — das Gehirn. Vier Bestandteile:

  • API-Server: das einzige Tor. Jeder Befehl, jeder Agent und jeder Controller spricht ausschließlich mit ihm. Nichts im Cluster redet direkt mit etcd.
  • etcd: der Speicher. Hier steht der komplette Zustand des Clusters — und nur hier.
  • Scheduler: entscheidet, auf welchem Knoten ein neuer Pod laufen soll. Er startet nichts, er schreibt nur seine Entscheidung zurück.
  • Controller Manager: eine Sammlung von Regelkreisen. Jeder vergleicht ununterbrochen Soll und Ist und arbeitet gegen die Abweichung an.

Worker — die Arbeiter. Zwei Bestandteile:

  • kubelet: der Agent, der die Container tatsächlich startet und dem API-Server meldet, was auf seinem Knoten los ist.
  • kube-proxy bzw. das CNI: sorgt dafür, dass Pods sich erreichen.

Der Weg eines Befehls

kubectl run hallo --image=nginx sieht aus wie eine Anweisung. Es ist aber nur ein Eintrag in eine Datenbank:

  1. kubectl schickt das Objekt an den API-Server
  2. Der prüft Rechte und Form und schreibt es nach etcd — fertig, der Befehl ist zurück. Es läuft noch gar nichts.
  3. Der Scheduler sieht einen Pod ohne Knoten, sucht einen passenden aus und schreibt den Namen in dasselbe Objekt
  4. Das kubelet auf diesem Knoten sieht, dass ihm etwas zugewiesen wurde, holt das Image und startet den Container
  5. Es meldet den Zustand zurück an den API-Server, der ihn wieder nach etcd schreibt

Kein Bauteil ruft ein anderes auf. Alle lesen und schreiben denselben Zustand und reagieren auf Änderungen. Das ist der ganze Trick — und der Grund, warum ein ausgefallener Knoten nichts Besonderes ist: Die Abweichung zwischen Soll und Ist wird einfach wieder abgearbeitet.

Warum etcd das empfindlichste Teil ist

etcd ist streng konsistent. Jede Änderung wird zuerst in ein Write-Ahead-Log geschrieben und mit fsync auf das Medium gezwungen — nicht in den Schreibcache, sondern wirklich auf die Platte — bevor sie als erledigt gilt.

Das macht die Platte zum Flaschenhals, und zwar nicht über die Bandbreite, sondern über die Latenz:

Medium fsync-Dauer, typisch
Festplatte, 7200 U/min 5–15 ms
SATA-SSD 0,1–1 ms
NVMe 0,02–0,1 ms

Die Empfehlung von etcd lautet: Das 99. Perzentil von etcd_disk_wal_fsync_duration_seconds soll unter 10 ms bleiben. Eine drehende Platte liegt im Leerlauf genau an dieser Grenze — und reißt sie, sobald nebenher etwas anderes schreibt.

Was dann passiert, sieht nicht nach einem Plattenproblem aus: Der Leader schickt alle 100 ms Heartbeats, die Wahlfrist liegt bei 1000 ms. Verzögern sich die Schreibvorgänge, verpasst er Heartbeats — und das Cluster wählt einen neuen Leader, obwohl nichts kaputt ist. Im Log steht dann apply entries took too long, und man sucht überall, nur nicht bei der Platte.

Der Sprung von der Festplatte zur SSD ist gewaltig. Der Sprung von SATA-SSD zu NVMe ist für ein Labor bedeutungslos. Deshalb bekommt die Control Plane hier eine SSD — und nur sie.

Und was ist mit CPU und RAM?

CPU ist bei kleinen Clustern praktisch nie der Engpass. Der API-Server braucht Rechenzeit vor allem für TLS-Handshakes und das Serialisieren großer Listenabfragen. Bei vier Knoten sind das wenige Prozent eines Kerns.

RAM entscheidet dagegen darüber, was zusätzlich auf die Control Plane passt: Grundlast rund 2 GB, Prometheus nochmal 1–2 GB, Argo CD etwa 1 GB. Wer aufrüsten will, kauft Speicher — nicht Takt.

Selbst messen

# Zustand aller Bauteile (der alte Befehl componentstatuses ist veraltet)
kubectl get --raw='/readyz?verbose'

# Die Control Plane laeuft selbst als Pods
kubectl -n kube-system get pods -o wide

# Der eingebaute Pruefstand von etcd
etcdctl check perf

Zum Nachlesen

Eine geordnete Übersicht über die offizielle Dokumentation — welcher Bereich wann hilft und was zu welchem Modul gehört — steht unter Nachlesen.

Befehle aus dieser Folge

  • kubectl get --raw='/readyz?verbose'
  • kubectl -n kube-system get pods -o wide
  • kubectl -n kube-system logs etcd-control-1 --tail=20
  • etcdctl check perf

Begriffe

API-Server
das einzige Tor zum Cluster — jeder Befehl, jeder Agent, jeder Controller spricht mit ihm
etcd
der Speicher fuer den gesamten Clusterzustand, streng konsistent und deshalb empfindlich
Scheduler
entscheidet, auf welchem Knoten ein Pod laufen soll — und schreibt nur diese Entscheidung
Controller Manager
die Regelkreise, die Ist und Soll immer wieder angleichen
kubelet
der Agent auf jedem Knoten, der die Container tatsaechlich startet
fsync
der Systemaufruf, der Daten wirklich auf die Platte zwingt — hier entscheidet sich die Stabilitaet

Übung — mach es selbst

Verfolge einen Befehl durch das System.

  1. Oeffne zwei Terminals. Im ersten: kubectl get events -A --watch
  2. Im zweiten: kubectl run uebung --image=nginx
  3. Sieh im ersten zu, in welcher Reihenfolge die Meldungen kommen — Scheduled, dann Pulling, dann Created, dann Started.
  4. Ordne jeder Meldung zu, welches Bauteil sie erzeugt hat.

Zusatz: Halte auf der Control Plane kurz den Scheduler an (mv /etc/kubernetes/manifests/kube-scheduler.yaml /root/) und starte einen Pod. Er bleibt auf Pending stehen — und du siehst, wessen Arbeit gerade fehlt. Danach die Datei zurueckschieben.