kubectl
auf einem Blatt.
Dichte Referenz für Senior Platform Engineers und SREs zum Kubernetes-CLI. Output-Formate, Server-Side Apply mit Field-Ownership, Patch-Strategien, Debug mit Ephemeral Containers, Rollout, RBAC-Checks, Kustomize, Krew und Anti-Patterns. Keine Einsteiger-Folien.
Vorschau (2 Seiten A4 quer + Brand-Rückseite)


PDF herunterladen
Direkter Download, keine Mail-Adresse nötig. CC BY-SA 4.0: kopieren, drucken, weiterverteilen ist ausdrücklich erlaubt, solange die Quellenangabe sichtbar bleibt.
Was drin steht
Output & Abfragen
-o jsonpath, custom-columns, go-template (inkl. base64decode), kyaml (stable seit v1.37), --sort-by, Label- und Field-Selektoren. Script-Futter statt grep-Kaskaden.
Apply & SSA
kubectl diff, --dry-run=server, Server-Side Apply mit Field-Ownership (managedFields), --force-conflicts, Patch-Strategien strategic/merge/json.
Debug
Ephemeral Containers für distroless Images, Copy-Debug mit --copy-to, Node-Debug mit Host-FS unter /host, --profile bis sysadmin.
Rollout & Warten
rollout status/history/undo/restart als Pipeline-Gates, kubectl events, top, wait --for statt sleep-Schleifen.
Auth & Kontexte
auth can-i mit Impersonation, auth whoami, Kontexte + KUBECONFIG-Merge, kuberc mit Credential-Plugin-Allowlist, Version-Skew-Policy (+/-1 Minor).
Kustomize, Plugins & Anti-Patterns
apply -k mit Overlays, Krew-Plugin-Manager, explain/api-resources. Dazu: edit in Prod, --force delete, scale gegen HPA.
Cheatsheet im Volltext
Derselbe Inhalt wie im PDF, zum Mitlesen, Durchsuchen und direkten Kopieren der Snippets. Stand: Kubernetes/kubectl v1.37 (Edition 2026.10).
Kontexte & kubeconfig
Kontext = Cluster + User + Namespace
kubectl config get-contexts zeigt alle,
use-context wechselt, set-context --current
setzt den Default-Namespace.
Merge: KUBECONFIG nimmt eine
Pfad-Liste (:-getrennt), erste Definition gewinnt.
config view --flatten schreibt daraus eine Datei.
--kubeconfig pinnt pro Aufruf.
Version-Skew
kubectl ist innerhalb einer Minor-Version
(älter oder neuer) zum kube-apiserver supported: ein
v1.37-Client deckt v1.36 bis v1.38 ab. Bei HA-Clustern mit
gemischten API-Server-Versionen wird das Fenster enger.
kubectl version zeigt beide Seiten, bei
Cluster-Flotten mit Versions-Spread den Client bewusst
wählen.
kuberc: CLI-Verhalten, nicht Cluster-Zugriff
~/.kube/kuberc (Beta seit v1.34, Pfad per
KUBERC oder --kuberc) hält Aliase
und Default-Flags getrennt von der kubeconfig.
credentialPluginPolicy: Allowlist begrenzt, welche
exec-Credential-Plugins laufen dürfen. KUBERC=off
schaltet die Datei ab, etwa in CI.
kubectl config get-contexts kubectl config use-context prod-admin kubectl config set-context --current --namespace=payments export KUBECONFIG=~/.kube/prod.yaml:~/.kube/lab.yaml kubectl config view --flatten > ~/.kube/merged.yaml kubectl version # Client- vs. Server-Version (Skew) kubectl kuberc set --section defaults --command delete \ --option interactive=true
Output-Formate
-o: von wide bis go-template
-o wide|yaml|json|name für den Alltag.
kyaml (stable seit v1.37): strikte
YAML-Teilmenge, nicht whitespace-sensitiv, String-Werte immer
quotiert (kein no → false),
Maps und Listen in {}/[].
jsonpath: Feld-Extraktion mit
range/Filter, Script-Futter statt
grep-Kaskaden.
custom-columns: eigene Tabellen direkt aus dem
API-Objekt.
go-template: volle Template-Logik inkl.
base64decode für Secrets.
Sortieren & Filtern
--sort-by nimmt einen JSONPath.
-l filtert nach Labels
(app=web,tier!=cache),
--field-selector nach Objektfeldern
(status.phase=Running). -A = alle
Namespaces.
kubectl get pods -o jsonpath='{.items[*].spec.containers[*].image}'
kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name} {.status.podIP}{"\n"}{end}'
cols='NAME:.metadata.name,TAINT:.spec.taints[*].key'
kubectl get nodes -o custom-columns="$cols"
kubectl get secret db -o go-template='{{index .data "ca.crt" | base64decode}}'
kubectl get pods -A --sort-by=.metadata.creationTimestamp
kubectl get deploy web -o kyaml
Apply, Diff & Server-Side Apply
diff & dry-run
kubectl diff -f zeigt den Diff gegen den
Live-Stand vor dem Apply (Exit-Code 1 = Unterschiede,
CI-tauglich).
--dry-run=client sendet keinen Schreib-Request
und fängt deshalb keine falschen Feldnamen ab, die
Feldvalidierung macht der API-Server;
--dry-run=server lässt
Admission-Webhooks + Defaulting am API-Server
laufen, ohne zu persistieren, das ehrlichere Preflight.
Server-Side Apply, Field-Ownership
apply --server-side (GA seit v1.22) merged am
API-Server. Ownership steht pro Feld in
metadata.managedFields, jeder Writer trägt
einen --field-manager.
Conflict (HTTP 409), wenn ein anderer Manager
das Feld hält: --force-conflicts
übernimmt die Ownership, bewusst einsetzen, das
entzieht dem anderen Controller das Feld.
kubectl diff -f deploy.yaml kubectl apply -f deploy.yaml --dry-run=server kubectl apply --server-side --field-manager=ci -f deploy.yaml kubectl apply --server-side --force-conflicts -f deploy.yaml kubectl get deploy web --show-managed-fields -o yaml
Patch-Strategien
strategic, merge, json
strategic (Default): kennt Merge-Keys aus dem
Schema, patcht z.B. containers per
name statt die Liste zu ersetzen.
--type=merge (RFC 7386): simpel, aber Listen
werden komplett ersetzt.
--type=json (RFC 6902): Op-Liste
(add/replace/remove) mit
präzisen Pfaden.
CRDs: kein strategic-Support,
merge oder json verwenden.
--subresource (stable seit v1.33) mit
status, scale oder resize
bei get/patch/edit/replace und apply --server-side;
resize ändert
Pod-Ressourcen in place (GA seit v1.35).
kubectl patch deploy web -p '{"spec":{"replicas":4}}'
kubectl patch deploy web --type=merge \
-p '{"metadata":{"labels":{"team":"pay"}}}'
kubectl patch deploy web --type=json -p '[{"op": "replace",
"path": "/spec/template/spec/containers/0/image",
"value": "web:2.0"}]'
kubectl patch pod api --subresource=resize -p \
'{"spec":{"containers":[{"name":"api",
"resources":{"requests":{"cpu":"500m"}}}]}}'
Debug & Ephemeral Containers
Pod-Debug, distroless-tauglich
kubectl debug -it pod/x --image=... hängt
einen Ephemeral Container an (stable seit
v1.25), Debug-Tools für Images ohne Shell.
--target teilt den Prozess-Namespace des
Ziel-Containers.
Ephemeral Containers sind nicht entfernbar;
aufräumen heißt Pod löschen. Alternativ
--copy-to=dbg + --share-processes:
Kopie debuggen, Original bleibt unangetastet.
Node-Debug & Profile
kubectl debug node/<n> startet einen Pod
auf dem Node, Host-Dateisystem unter /host.
--profile steuert die Rechte:
general (Default seit v1.36), baseline,
restricted, netadmin,
sysadmin; legacy ist deprecated
(Removal geplant für v1.39).
kubectl debug -it pod/api --image=nicolaka/netshoot --target=api kubectl debug pod/api --copy-to=api-dbg \ --share-processes -it --image=busybox kubectl debug node/worker-3 -it --image=busybox --profile=sysadmin chroot /host # im Node-Debug-Pod
Rollout
status, history, undo
rollout status blockt bis Ready bzw.
progressDeadline, das Gate für Pipelines.
history listet Revisionen
(--revision=N zeigt Details; CHANGE-CAUSE kommt aus
der Annotation kubernetes.io/change-cause).
undo --to-revision=N rollt gezielt zurück.
restart erzwingt ein neues Rollout (z.B. nach
ConfigMap-Änderung). Gilt für Deployments, DaemonSets,
StatefulSets; pause/resume nur für
Deployments.
kubectl rollout status deploy/web --timeout=120s kubectl rollout history deploy/web --revision=3 kubectl rollout undo deploy/web --to-revision=2 kubectl rollout restart deploy/web kubectl rollout pause deploy/web # und: resume
Auth, Events & Wait
can-i, whoami
auth can-i prüft RBAC vor dem
Incident; --as / --as-group testet
fremde Identitäten (ServiceAccounts als
system:serviceaccount:<ns>:<sa>).
--list zeigt alle Rechte im Namespace.
auth whoami (GA seit v1.28,
SelfSubjectReview-API): UserInfo inkl. Gruppen, wie der
API-Server sie nach Authentifizierung sieht.
events, top, wait
kubectl events --for pod/x --types=Warning:
chronologisch, gefiltert, ergonomischer als
get events + --sort-by.
top pod|node braucht den metrics-server.
wait --for=condition=..., =create,
=delete oder =jsonpath=...:
deklaratives Warten mit --timeout statt
sleep-Schleifen. Mehrere --for werden seit v1.36
UND-verknüpft.
kubectl auth can-i create deploy -n prod kubectl auth can-i --list -n prod kubectl auth can-i get secrets --as system:serviceaccount:ci:builder kubectl auth whoami kubectl events --for pod/api --types=Warning kubectl top pods --containers -n prod kubectl wait --for=condition=Ready pod -l app=web --timeout=90s kubectl wait --for=create --for=condition=Ready pod/web-0
Port-Forward, Exec & cp
port-forward, exec, proxy, cp
port-forward tunnelt über den API-Server,
kein Ingress, kein NodePort nötig; svc/x pinnt
beim Start einen Pod dahinter, kein Load-Balancing, der
Tunnel endet mit diesem Pod. --address ist per
Default localhost; 0.0.0.0 öffnet
den Tunnel fürs Netz.
proxy legt die REST-API authentifiziert auf
127.0.0.1:8001, zum Explorieren und für
curl-Debugging. cp braucht ein
tar-Binary im Container, bei distroless nicht
vorhanden.
exec verlangt seit v1.35 -- vor dem
Kommando, die alte Form bricht mit Fehler ab.
kubectl port-forward svc/web 8080:80 kubectl port-forward pod/db 15432:5432 # lokal:remote kubectl proxy --port=8001 & curl localhost:8001/api/v1/namespaces/prod/pods kubectl cp prod/api-6d5f7:/var/log/app.log ./app.log kubectl exec -it deploy/web -c app -- sh
Explain, Kustomize & Plugins
explain & API-Discovery
explain deploy.spec.strategy: Feld-Doku aus dem
OpenAPI-Schema des Clusters, inkl. CRDs.
--recursive zeigt den ganzen Teilbaum,
--max-depth=N (seit v1.37) kappt ihn,
--api-version pinnt die Version.
api-resources / api-versions: was
der Cluster kann, inkl. Shortnames.
Kustomize (-k)
Kustomize ist in kubectl integriert:
apply|diff|delete -k <dir> rendert Base +
Overlay und wendet an; kubectl kustomize <dir>
rendert nur. Eingebettete Version:
kubectl version --client (v1.37: Kustomize v5.8.1);
GitOps-Controller rendern mit ihrer eigenen.
Plugins & Krew
Jedes Binary kubectl-<name> im
PATH wird Subcommand;
kubectl plugin list zeigt sie.
Plugin-Manager ist Krew (kubernetes-sigs):
krew search|install|upgrade, über 400 Plugins
im Index.
kubectl explain deploy.spec --recursive --max-depth=2 kubectl api-resources --namespaced=false kubectl kustomize overlays/prod | kubectl diff -f - kubectl apply -k overlays/prod kubectl krew install ctx ns tree
Anti-Patterns
Was du nicht tun solltest
edit in Prod: unversionierter
Live-Drift; der nächste Apply/GitOps-Sync überschreibt
still. Änderung ins Repo, dann apply.
delete --force --grace-period=0:
entfernt nur das API-Objekt, der Prozess kann am Node
weiterlaufen, bei StatefulSets Risiko doppelter
Identitäten.
Apply-Modi mischen: der Wechsel
client-side → server-side ist nur mit dem
Default-Manager kubectl konfliktfrei. Felder, die
per scale/edit statt Apply gesetzt
wurden, und ein eigener --field-manager laufen bei
abweichenden Werten in Conflicts. Pro Objekt einen Modus und
einen Manager festlegen.
:latest + rollout
restart als Deployment-Ersatz: nicht
reproduzierbar, kein Rollback-Ziel, immutable Tags.
Blind im falschen Kontext: destruktive
Kommandos ohne config current-context-Check;
Prod-Kontexte explizit benennen und im Prompt markieren.
scale gegen HPA: der Autoscaler
setzt den Wert zurück, Min/Max am HPA ändern
statt manuell zu skalieren.
Verwandte Cheatsheets
Ebenfalls von OMNI52:
kubernetes-cheatsheet.de, Kubernetes Core
helm-cheatsheet.de, Helm Charts
kyverno-cheatsheet.de, Policy-as-Code
rke2-cheatsheet.de, RKE2-Distribution
Lizenz & Weiterverteilung
Nicht erlaubt: Logo, Marken oder den Eindruck zu vermitteln, dass der Inhalt von dir/euch stammt oder dass OMNI52 GmbH die Weiterverwendung sponsort.
Volltext der Lizenz: creativecommons.org/licenses/by-sa/4.0/deed.de.
Kubernetes is a registered trademark of The Linux Foundation (in the United States and other countries). kubectl is part of the Kubernetes project. OMNI52™ is a trademark of OMNI52 GmbH (filed, not yet registered). This website is operated by OMNI52 GmbH and is not affiliated with, endorsed by, or sponsored by The Linux Foundation or the Cloud Native Computing Foundation. “Kubernetes” and “kubectl” are used in a nominative / descriptive sense to indicate the technology this cheatsheet documents.