- Authors

- Name
- Phillip Pham
- @ddppham
kubectl apply vs create: Wann welchen Befehl nutzen?
Wer mit Kubernetes startet, stolpert frueh ueber die Frage: kubectl apply oder kubectl create? Beide Befehle erstellen Ressourcen -- aber sie funktionieren grundlegend anders. Dazu kommt kubectl replace, das nochmal eigene Regeln hat. Dieser Artikel klaert den Unterschied, zeigt typische Fallstricke und gibt klare Empfehlungen fuer den Praxisalltag.
TL;DR
kubectl applyarbeitet deklarativ: Sie beschreiben den gewuenschten Zustand, Kubernetes berechnet die Aenderungen. Funktioniert zum Erstellen und Aktualisieren.kubectl createist imperativ: Erstellt eine Ressource einmalig. Schlaegt fehl, wenn die Ressource schon existiert.kubectl replaceersetzt eine Ressource komplett. Felder, die nicht in der neuen YAML stehen, gehen verloren.- Fuer produktive Workflows ist
kubectl applyfast immer die richtige Wahl.
Der fundamentale Unterschied: Deklarativ vs. Imperativ
Bevor wir in die Befehle einsteigen, muessen Sie den Kern verstehen. Testen Sie es direkt:
# Imperativ: "Erstelle dieses Deployment"
kubectl create deployment nginx --image=nginx:1.27
# Deklarativ: "Stelle sicher, dass dieses Deployment so existiert"
kubectl apply -f deployment.yaml
Imperativ heisst: Sie geben Kubernetes einen konkreten Befehl. "Erstelle X." Wenn X schon existiert, gibt es einen Fehler. Sie sagen was passieren soll.
Deklarativ heisst: Sie beschreiben den Zielzustand. Kubernetes vergleicht den aktuellen Zustand mit dem gewuenschten und fuehrt nur die noetige Aenderungen durch. Sie sagen wie es aussehen soll.
| Eigenschaft | kubectl create | kubectl apply | kubectl replace |
|---|---|---|---|
| Ansatz | Imperativ | Deklarativ | Imperativ |
| Erstellen | Ja | Ja | Nein (muss existieren) |
| Aktualisieren | Nein | Ja (Merge) | Ja (Komplettersetzung) |
| Fehler bei Existenz | Ja | Nein | Nein |
| Merge mit bestehenden Feldern | -- | Ja | Nein |
| Typischer Einsatz | Schnelltests, Scripting | GitOps, CI/CD, Produktion | Erzwungene Komplettersetzung |
kubectl create im Detail
create ist der einfachste Befehl. Er erstellt eine Ressource und meldet einen Fehler, wenn sie schon existiert:
# Ressource aus YAML erstellen
kubectl create -f service.yaml
# Imperativ ein Deployment erzeugen
kubectl create deployment redis --image=redis:7 --replicas=3
# Namespace erstellen
kubectl create namespace staging
Was passiert, wenn die Ressource schon da ist?
Error from server (AlreadyExists): deployments.apps "redis" already exists
Genau hier liegt das Problem fuer automatisierte Workflows. Wenn Ihre CI/CD Pipeline kubectl create nutzt, schlaegt der zweite Lauf fehl. Deshalb sieht man in Skripten manchmal dieses Anti-Pattern:
# Nicht empfohlen -- fragil und fehleranfaellig
kubectl delete -f deployment.yaml --ignore-not-found
kubectl create -f deployment.yaml
Das funktioniert, verursacht aber Downtime, weil die Ressource kurz geloescht wird.
Wann create sinnvoll ist
- Einmalige Aktionen: Namespace erstellen, Secret anlegen, Job starten
- Schnelle Tests in der lokalen Entwicklung
- Generierung von YAML-Vorlagen mit
--dry-run=client -o yaml
Gerade der letzte Punkt ist im Alltag Gold wert:
# YAML-Template generieren, ohne etwas zu erstellen
kubectl create deployment web --image=nginx:1.27 --replicas=3 \
--dry-run=client -o yaml > deployment.yaml
kubectl apply im Detail
apply ist der Arbeitspferd-Befehl fuer produktive Kubernetes-Umgebungen. Er erstellt Ressourcen, wenn sie nicht existieren, und aktualisiert sie, wenn sie schon da sind.
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 3
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: web
image: nginx:1.27
resources:
requests:
cpu: 100m
memory: 128Mi
# Erstes apply: erstellt die Ressource
kubectl apply -f deployment.yaml
# Image aendern, erneut apply: aktualisiert nur das Image
# (alle anderen Felder bleiben erhalten)
kubectl apply -f deployment.yaml
Wie apply intern funktioniert
kubectl apply speichert den letzten angewandten Zustand als Annotation (kubectl.kubernetes.io/last-applied-configuration) auf der Ressource. Beim naechsten apply vergleicht Kubernetes drei Versionen:
- Letzte angewandte Konfiguration (Annotation)
- Aktuelle Live-Konfiguration (was im Cluster steht)
- Neue gewuenschte Konfiguration (Ihre YAML-Datei)
Daraus berechnet Kubernetes einen Three-Way-Merge. Das bedeutet: Wenn jemand manuell ein Label hinzugefuegt hat und Ihre YAML-Datei dieses Label nicht enthaelt, bleibt es erhalten -- solange es nicht in der letzten Annotation stand.
kubectl replace: Die Holzhammer-Methode
replace ersetzt eine Ressource komplett. Alles, was nicht in der neuen YAML steht, geht verloren:
kubectl replace -f deployment.yaml
Das klingt gefaehrlich -- und ist es auch. Ein typisches Problem:
# Jemand hat manuell ein Label hinzugefuegt
kubectl label deployment web-app team=backend
# replace ueberschreibt alles -- das Label ist weg
kubectl replace -f deployment.yaml
Wann replace sinnvoll ist
- Sie wollen sicherstellen, dass die Ressource exakt Ihrer YAML entspricht, ohne Altlasten
- Bei Ressourcen, die sich nicht per
applyaktualisieren lassen (selten, aber es kommt vor) - In Kombination mit
--forcefuer einen Delete-and-Recreate-Workflow:
# Loescht und erstellt die Ressource neu -- verursacht kurze Downtime
kubectl replace --force -f deployment.yaml
Typische Fallstricke
Fallstrick 1: create in CI/CD Pipelines
Wie oben beschrieben: create schlaegt beim zweiten Lauf fehl. Nutzen Sie in Pipelines immer apply.
Fallstrick 2: apply nach create
Wenn Sie eine Ressource mit create erstellt haben und danach apply nutzen, erscheint diese Warnung:
Warning: resource deployments/web-app is missing the
kubectl.kubernetes.io/last-applied-configuration annotation
Die Annotation fehlt, weil create sie nicht setzt. Das erste apply fuegt sie hinzu, danach funktioniert alles normal. Kein Grund zur Panik -- aber ein Grund, von Anfang an apply zu nutzen.
Fallstrick 3: Felder loeschen mit apply
Wenn Sie ein Feld aus Ihrer YAML entfernen und apply ausfuehren, wird es aus der Ressource entfernt -- aber nur, wenn es in der last-applied-configuration Annotation stand. Felder, die manuell oder durch Controller hinzugefuegt wurden, bleiben.
Fallstrick 4: Server-Side Apply
Seit Kubernetes 1.22 gibt es Server-Side Apply als Alternative:
kubectl apply --server-side -f deployment.yaml
Server-Side Apply loest Konflikte besser, weil der Server den Merge durchfuehrt und Feld-Ownership trackt. Fuer Teams, die gleichzeitig an Ressourcen arbeiten (z.B. HPA aendert Replicas, waehrend Sie das Image updaten), ist das die bessere Wahl.
Entscheidungshilfe
Nutzen Sie diese einfache Regel:
- Produktion, CI/CD, GitOps:
kubectl apply -f - Schneller Test, einmalige Aktion:
kubectl create - YAML generieren:
kubectl create --dry-run=client -o yaml - Komplette Ersetzung erzwingen:
kubectl replace -f
Im Zweifel: apply. Es ist der sicherste und flexibelste Befehl.
FAQ
Kann ich apply und create mischen?
Technisch ja, aber Sie bekommen beim ersten apply nach einem create eine Warnung wegen der fehlenden Annotation. Bleiben Sie bei einem Ansatz -- idealerweise apply.
Ist kubectl apply idempotent?
Ja. Sie koennen apply beliebig oft mit derselben YAML ausfuehren. Wenn sich nichts geaendert hat, passiert nichts (die Ressource wird als "unchanged" gemeldet).
Was ist der Unterschied zwischen apply und patch?
apply sendet die komplette Ressource und berechnet einen Merge. kubectl patch aendert gezielt einzelne Felder, ohne die gesamte YAML zu benoetigen. Fuer schnelle Einzelaenderungen ist patch praktisch, fuer reproduzierbare Deployments apply.
Wann sollte ich Server-Side Apply nutzen?
Wenn mehrere Akteure dieselbe Ressource aendern (z.B. HPA, VPA, CI/CD Pipeline). Server-Side Apply trackt, wer welches Feld "besitzt", und verhindert versehentliches Ueberschreiben.
Tipp: Gewoehnen Sie sich an kubectl apply und speichern Sie alle Ressourcen als YAML in Git. So haben Sie jederzeit einen reproduzierbaren, nachvollziehbaren Zustand Ihres Clusters.
Weiterführende Artikel:
Kubernetes-Beratung gesucht?
Wir helfen deutschen Unternehmen bei der Kubernetes-Implementierung, Migration und Optimierung. DSGVO-konform und praxiserprobt.
📖 Verwandte Artikel
Weitere interessante Beiträge zu ähnlichen Themen
ConfigMaps richtig nutzen: Kubernetes Best Practices
ConfigMaps in Kubernetes erstellen, mounten und aktualisieren: Praktische Best Practices für Volumes, Env-Vars und Hot-Reload mit Reloader.
kubectl Produktivität: Aliase, Plugins und Tricks
Mit kubectl-Aliasen, krew-Plugins und Shell-Integration arbeiten Kubernetes-Admins bis zu 50% schneller auf der Kommandozeile.
Kubernetes Log-Analyse: Patterns und Tools
Kubernetes-Logs effektiv analysieren mit kubectl logs, stern und strukturiertem Logging. Die wichtigsten Befehle, Patterns und Strategien für schnelles Debugging.
RBAC Best Practices: Kubernetes-Zugriff sicher steuern
Kubernetes RBAC richtig konfigurieren: Role vs. ClusterRole, praxisnahe Beispiele für Developer- und CI/CD-Rollen und die häufigsten Fehler vermeiden.
Resource Requests und Limits: Kubernetes-Guide
Kubernetes Resource Requests und Limits richtig setzen. CPU-Throttling, OOMKill, QoS-Klassen und LimitRange mit praktischen YAML-Beispielen erklärt.