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:
kubectlschickt das Objekt an den API-Server- Der prüft Rechte und Form und schreibt es nach etcd — fertig, der Befehl ist zurück. Es läuft noch gar nichts.
- Der Scheduler sieht einen Pod ohne Knoten, sucht einen passenden aus und schreibt den Namen in dasselbe Objekt
- Das kubelet auf diesem Knoten sieht, dass ihm etwas zugewiesen wurde, holt das Image und startet den Container
- 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 widekubectl -n kube-system logs etcd-control-1 --tail=20etcdctl 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.
- Oeffne zwei Terminals. Im ersten:
kubectl get events -A --watch - Im zweiten:
kubectl run uebung --image=nginx - Sieh im ersten zu, in welcher Reihenfolge die Meldungen kommen —
Scheduled, dannPulling, dannCreated, dannStarted. - 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.