Dein erstes Kubernetes-Manifest schreiben
YAML-Grundlagen, die vier Felder, die jedes Objekt hat, und der Kreislauf aus Erstellen, Untersuchen, Löschen mit einem Pod.
Alles, was du in Kubernetes erstellst, ist ein in einem Manifest beschriebenes Objekt, einer YAML-Datei, die sagt, was du willst. Diese Anleitung behandelt gerade genug YAML, um eines zu lesen, erklärt die Struktur, die jedes Manifest teilt, und führt durch das Ausführen eines Pods aus einer Datei. Sie setzt einen funktionierenden Cluster voraus (siehe die vorherige Anleitung).
YAML in fünf Minuten
YAML hat zwei Bausteine, die du erkennen musst.
Eine Map ist eine Menge von key: value-Paaren. Die Einrückung zeigt die Verschachtelung, und alles, was unter einem Schlüssel eingerückt ist, gehört zu ihm. Eine Liste ist eine Folge von Einträgen, die jeweils mit einem Bindestrich beginnen:
app:
name: shop
enabled: true
labels:
tier: frontend
ports:
- 80
- 443
Hier ist app eine Map mit den Schlüsseln name, enabled, labels und ports. labels ist selbst eine Map, und ports ist eine Liste aus zwei Zahlen. Nutze Leerzeichen, niemals Tabs. Falsche Einrückung ist die häufigste Ursache für ein Manifest, das sich nicht anwenden lässt, und sie ändert stillschweigend, was zu was gehört. Mehrere Objekte können sich eine Datei teilen, wenn du sie durch eine Zeile mit --- trennst.
Anatomie eines Manifests
Jedes Kubernetes-Objekt hat dieselben Felder auf oberster Ebene:
apiVersionsagt, welche Version der API diese Art von Objekt definiert.kindist der Typ des Objekts, etwaPododerDeployment. Es unterscheidet Groß- und Kleinschreibung.metadataidentifiziert das Objekt: seinenname, optional einennamespaceund beliebigelabelsundannotations.specist der Soll-Zustand, und sein Inhalt hängt vom Kind ab.
Kubernetes fügt einen vierten Abschnitt hinzu, status, der den tatsächlichen Zustand beschreibt. Du schreibst ihn nicht. Hier ist ein minimaler Pod:
apiVersion: v1
kind: Pod
metadata:
name: web
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
containers ist eine Liste, ein Pod könnte also mehrere Container betreiben, die jeweils mit einem eigenen Bindestrich beginnen. Das Feld image solltest du doppelt prüfen. Ein Tippfehler bedeutet, dass Kubernetes es nicht pullen kann und der Pod in einem Fehlerzustand verharrt.
Manifeste nicht von Grund auf schreiben
Kopiere ein funktionierendes Beispiel aus der Kubernetes-Dokumentation oder lass kubectl eines erzeugen:
kubectl run web --image=nginx:1.25 --port=80 --dry-run=client -o yaml > pod.yaml
--dry-run=client baut das Objekt lokal, ohne es zu erstellen, und -o yaml gibt es als YAML aus. Das gibt dir einen gültigen Ausgangspunkt zum Bearbeiten.
Die apiVersion richtig setzen
Verschiedene Kinds leben in verschiedenen API-Gruppen und -Versionen. Pods sind v1, Deployments sind apps/v1, Ingresses sind networking.k8s.io/v1. Wählst du die falsche oder eine Version, die ein neuerer Cluster entfernt hat, bekommst du einen Fehler wie no matches for kind "X" in version "Y". So findest du den richtigen Wert:
kubectl api-resources | grep -i deployment
kubectl explain deployment | head
Das Erste zeigt die Gruppe für jedes Kind, das Zweite seine VERSION. Das zählt am meisten, wenn du einen Cluster upgradest, weil alte Manifeste aufhören können zu funktionieren, wenn eine Version entfernt wird. Die Kubernetes-Anleitung zu Deprecations listet auf, was sich in jedem Release geändert hat.
Erstellen, untersuchen und löschen
kubectl apply -f pod.yaml
kubectl get pods
kubectl describe pod web
kubectl delete -f pod.yaml
In kubectl get pods zeigt die Spalte READY, wie viele Container des Pods bereit sind (1/1 ist gesund), STATUS zeigt seine Phase, und RESTARTS zählt Container-Neustarts. Eine Zahl, die ständig steigt, bedeutet, dass etwas den Container immer wieder beendet. describe gibt die vollständigen Details des Pods aus, mit den letzten Events unten, der ersten Anlaufstelle, wenn etwas nicht stimmt.
apply ist deklarativ: Es erstellt das Objekt, wenn es nicht existiert, und aktualisiert es, wenn es existiert, sodass du die Datei bearbeiten und erneut anwenden kannst. kubectl create -f schlägt fehl, wenn das Objekt bereits existiert.
Imperativ vs. deklarativ
Befehle wie kubectl run und kubectl create sind imperativ: Du sagst Kubernetes, etwas jetzt zu tun. Sie sind schnell für Experimente und für Zertifizierungsprüfungen. Mit kubectl apply -f angewendete Manifeste sind deklarativ, und das willst du für alles Echte, weil die Dateien in Git liegen, geprüft und erneut angewendet werden können. Die Argo-CD-Anleitungen in dieser Reihe zeigen, wie du diese Idee zu Ende denkst.
Beliebte Anleitungen
-
Was Kubernetes ist und welche Probleme es löst Warum Container allein nicht mehr skalieren und wie Kubernetes eine Gruppe von Maschinen zu einer Plattform macht. -
Wie ein Kubernetes-Cluster funktioniert: Control Plane und Knoten Die Komponenten, die einen Cluster am Laufen halten, und was zwischen kubectl apply und einem laufenden Container passiert. -
Deployments: Skalieren, Selbstheilung und Rolling Updates Betreibe Replikas eines Pods, aktualisiere sie ohne Ausfallzeit und rolle zurück, wenn ein Release schiefgeht. -
Services: Stabiles Networking für kurzlebige Pods Gib Pods eine stabile Adresse, stelle sie innerhalb und außerhalb des Clusters bereit und beschränke, wer mit wem sprechen darf. -
Einen fehlschlagenden Pod debuggen: describe, logs, exec und port-forward Eine wiederholbare Checkliste, um herauszufinden, warum ein Pod Pending ist, abstürzt oder nicht antwortet.