Hinweis perev. : Dieser Artikel setzt den Materialzyklus eines technischen Redakteurs von Google fort, der an der Dokumentation für Kubernetes (Andrew Chen) arbeitet, und eines Direktors für Software-Engineering von SAP (Dominik Tornow). Ihr Ziel ist es, die Grundlagen von Kubernetes klar und deutlich zu erklären. Das letzte Mal haben wir einen Artikel über Hochverfügbarkeit übersetzt , und jetzt werden wir über ein solches Grundkonzept in Kubernetes wie pod sprechen.
Kubernetes ist eine Container-Orchestrierungs-Engine, mit der containerisierte Anwendungen auf mehreren Knoten ausgeführt werden können, die üblicherweise als Cluster bezeichnet werden. In diesen Veröffentlichungen verwenden wir einen Systemmodellierungsansatz, um das Verständnis von Kubernetes und den zugrunde liegenden Konzepten zu verbessern. Die Leser werden ermutigt, bereits ein grundlegendes Verständnis von Kubernetes zu haben.
Pods sind die Grundbausteine von Kubernetes, aber selbst erfahrene Kubernetes-Benutzer können nicht immer erklären, was es ist.
Diese Veröffentlichung bietet ein prägnantes Gedankenmodell, das die charakteristischen Merkmale von Kubernetes-Pods beleuchtet. Aus Gründen dieser Kürze musste ich einige andere Funktionen von Pods weglassen, z. B.
Lebendigkeits- und Bereitschaftstests , gemeinsame Nutzung von Ressourcen
(einschließlich der kürzlich erschienenen gemeinsamen Nutzung von Namespaces - ca. übersetzt ) und Arbeit mit dem Netzwerk.
Definition
Ein Pod ist eine Anforderung, einen oder mehrere Container auf einem einzelnen Knoten auszuführen.
Ein Pod wird definiert, indem eine Anforderung zum
Ausführen eines oder mehrerer Container auf einem einzelnen Knoten angezeigt wird. Diese Container teilen sich den Zugriff auf Ressourcen wie Speichervolumes und den Netzwerkstapel.
Im Alltag kann der Begriff "Pod" jedoch sowohl im Sinne dieser
Anfrage als auch im Sinne der
Sammlung von Containern verwendet werden, die als Antwort auf die Anfrage gestartet werden. Daher werden wir in der Veröffentlichung das Wort "pod" verwenden, wenn wir über die Anforderung sprechen, und für den zweiten Fall - verwenden Sie den Ausdruck "Satz von Containern".
Pods gelten als Grundbausteine von Kubernetes, da alle Workloads in Kubernetes - z. B.
Bereitstellungen ,
ReplicaSets und
Jobs - als Pods ausgedrückt werden können.
Pod ist das
einzige Objekt in Kubernetes, bei dem Container ausgeführt werden.
Kein Pod - kein Container!
Schema 1. Bereitstellung, ReplicaSet, Pod und ContainerKubernetes Architektur
Schema 2. Pods, Scheduler und KubeletIn dieser Abbildung werden die entsprechenden Objekte und Komponenten hervorgehoben. Pods werden als
Kubernetes Pod-Objekte dargestellt und arbeiten mit ihnen:
Kubernetes Objekte
Abbildung 3. Kubernetes-ObjekteDiese Abbildung zeigt die Kubernetes-Objekte, die für die Arbeit mit dem Pod verantwortlich sind:
- das eigentliche Pod- Objekt (Pod-Objekt) ;
- Bindungsobjekt
- Knotenobjekt
Pod Object legt die Anzahl der zu startenden Container und die gewünschte
Neustartrichtlinie für den Fall eines Containerabsturzes fest und überwacht auch den Startstatus.
Das Bindungsobjekt bindet das
Pod-Objekt an das
Knotenobjekt , d.h. Weist dem Host einen Pod für den späteren Start zu.
Das Knotenobjekt repräsentiert einen Knoten in einem Kubernetes-Cluster.
Pod-Verarbeitung
Schema 4. Verarbeitung von pod'aWenn ein Pod von einem Benutzer oder Controller wie
ReplicaSet Controller oder
Job Controller erstellt wird , verarbeitet Kubernetes den Pod in zwei Schritten:
- Scheduler plant einen Pod,
- Kubelet startet den Pod.
Pod Planung
Abbildung 5. Kubernetes Scheduler-SteuerzyklusDie Aufgabe des
Schedulers in Kubernetes besteht darin, einen Pod zu planen, dh ihm einen geeigneten Knoten im Kubernetes-Cluster für den späteren Start zuzuweisen.
Verknüpfen eines Pod-Objekts mit einem KnotenobjektEin Pod wird einem Knoten genau dann zugewiesen (oder
an ihn gebunden), wenn es ein Bindungsobjekt gibt, das Folgendes enthält:
- Der Namespace entspricht dem Pod-Namespace.
- Der Name entspricht dem Namen der Kapsel.
- Zieltyp entspricht
Node
, - Der Name des Ziels entspricht dem Namen des Knotens.
(Abenteuerliebhaber können sich Kelsey Hightowers GitHub-Inhalt mit dem Titel "Manuelles
Erstellen und Planen eines Pods" ansehen
, eine Schritt-für-Schritt-Anleitung zum manuellen Erstellen eines Bindungsobjekts.)
Pod-Start
Abbildung 6. Kubelet-RegelzyklusKubelets Aufgabe ist es, einen Pod zu starten, was im Wesentlichen bedeutet, einen Satz Pod-Container zu starten. Der Start des Kubelet-Pods erfolgt in zwei Phasen: Initialisierung und Hauptphase.
In der Regel führt eine Reihe von Containern während der Initialisierungsphase vorbereitende Arbeiten durch, z. B. die Vorbereitung des erforderlichen Verzeichnisses und der erforderlichen Dateistruktur. Und der Satz von Containern in der Hauptphase führt bereits die „wichtigsten“ Aufgaben aus.
Obwohl dies im Alltag nicht ganz richtig ist, impliziert der Begriff „Pod“ häufig eine Reihe von Containern in der Hauptphase oder eine noch engere Bedeutung des „wichtigsten“ Containers in der Hauptphase.
Schema 7.1. Starten eines Pods, Initialisierungsphase (init) und Hauptphase (main)Während der Initialisierung startet Kubelet die Container nacheinander gemäß den Spezifikationen des
.Spec.InitContainers
und in der in der Liste angegebenen Reihenfolge. Um den Pod erfolgreich zu starten und die Neustartrichtlinie zu berücksichtigen, müssen seine Init-Container gestartet und erfolgreich abgeschlossen werden.
Während der Hauptphase startet Kubelet gleichzeitig Container gemäß den Spezifikationen des
.Spec.Containers
. Hier müssen die Hauptcontainer für einen erfolgreichen Start des Pods und unter Berücksichtigung der Neustartrichtlinie gestartet und entweder erfolgreich abgeschlossen werden oder unbegrenzt arbeiten.
Schema 7.2. Running Pod, Details zu diesem ProzessIm Falle eines Containerfehlers kann Kubelet den Container gemäß der Pod-Neustartrichtlinie neu starten, wenn der Container nicht mehr mit einem
Exit-Code ungleich Null (0) arbeitet. Diese Richtlinie hat eine der folgenden Bedeutungen:
Always
,
OnFailure
,
Never
.
Die Pod-Neustartrichtlinie hat unterschiedliche Semantiken für Init-Container und Hauptcontainer: Wenn das Starten von Init-Containern zum Abschluss führen muss, werden die Hauptcontainer möglicherweise nicht beendet.
Starten Sie die Richtlinie für den Init-Container neuDer ursprüngliche Container wird nach Abschluss seiner Arbeit nur dann neu gestartet (d. H. Es wird ein neuer Container mit derselben Spezifikation gestartet), wenn die folgenden Bedingungen erfüllt sind:
- Der Container-Exit-Code meldet einen Fehler und
OnFailure
Neustartrichtlinie von OnFailure
lautet Always
oder OnFailure
.
Starten Sie die Richtlinie für den Hauptcontainer neuDer Hauptcontainer wird nach Abschluss seiner Arbeit nur dann neu gestartet (d. H. Es wird ein neuer Container mit derselben Spezifikation gestartet), wenn die folgenden Bedingungen erfüllt sind:
- Neustartrichtlinie definiert als
Always
oder - Die Neustartrichtlinie ist als
OnFailure
definiert und der Container-Exit-Code meldet einen Fehler.
Abbildung 8. Beispiel einer Zeitleiste mit einem roten Punkt als Symbol für einen ContainerfehlerDie Abbildung zeigt eine mögliche Pod-Startzeitleiste mit zwei Spezifikationen für Init-Container und zwei Spezifikationen für Hauptcontainer. Außerdem wird die Erstellung (gemäß der Neustartrichtlinie) des neuen
Hauptcontainers 1.2 nach einem Problem mit dem Start von
Hauptcontainer 1.1 angezeigt .
Pod-Phasen
Diagramm 9. Interaktion von Kubelet mit dem Pod-Objekt und der Container-Laufzeit (Container-Laufzeit)Kubelet erhält die Pod-Spezifikationen für
.Spec.InitContainers
und
.Spec.Containers
, startet den angegebenen Containersatz und aktualisiert die
.Status.InitContainerStatuses
Werte für
.Status.InitContainerStatuses
und
.Status.ContainerStatuses
.
Kubelet reduziert
.Status.InitContainerStatuses
und
.Status.ContainerStatuses
in einem Wert -
.Status.Phase
.
Die Pod-Phase ist eine Projektion des Zustands von Containern aus einer Reihe von Containern. Dies hängt ab von:
- Zustände und Exit-Codes von Init-Containern,
- Zustände und Ausstiegscodes der Hauptcontainer.
Schema 10. Phasen der KapselAusstehend
Ausstehende PhaseEin Pod befindet sich genau dann in einer Wartephase, wenn:
- Keiner der Pod-Init-Container befindet sich mit einem Fehler (
Failure
) im Status " Failure
. - Alle wichtigen Pod-Container befinden sich im
Waiting
.
Laufen
LaufphasePod ist genau dann in der Arbeitsphase, wenn:
- Alle Pod-Init-Container befinden sich mit Erfolg im Status "Beendet".
- Mindestens ein Haupt-Pod-Container befindet sich im
Running
. - Keiner der Haupt-Pod-Container befindet sich mit einem
Failure
im Status " Failure
.
Erfolg
ErfolgsphasePod befindet sich genau dann in einer Erfolgsphase, wenn:
- Alle Pod-Init-Container befinden sich mit Erfolg im Status "Beendet".
- Alle wichtigen Pod-Container befinden sich mit Erfolg im Status "Beendet".
Fehler
FehlerphaseEin Pod befindet sich genau dann in einer Fehlerphase, wenn:
- Alle Pod-Container befinden sich im Status "Beendet".
- Mindestens einer der Pod-Container befindet sich mit einem Fehler (
Failure
) im Status " Failure
.
Unbekannt
Zusätzlich zu den oben beschriebenen Phasen kann sich der Pod in einer unbekannten Phase befinden, was auf die Unmöglichkeit hinweist, seine aktuelle Phase zu bestimmen.
Müllabfuhr für Hülsen
Abbildung 11. Kontrollzyklus des Pod Garbage CollectorNachdem der Pod geplant und gestartet wurde, ist ein spezieller Controller in Kubernetes - der
Pod Garbage Collector Controller - für das Entfernen von Pod-Objekten aus dem
Kubernetes Object Store verantwortlich .
Fazit
Pod - der Grundbaustein von Kubernetes: Pod ist definiert als die Darstellung einer Anforderung zum Starten eines oder mehrerer Container auf einem Knoten. Nachdem der Pod erstellt wurde, verarbeitet Kubernetes ihn in zwei Schritten: Zuerst plant der
Scheduler den Pod und dann startet Kubelet ihn. Während seines gesamten Lebenszyklus durchläuft der Pod verschiedene Phasen und meldet dem Benutzer und dem System den Status - genauer gesagt den Status seines Containersatzes.
PS vom Übersetzer
Lesen Sie auch in unserem Blog: