OMNI52
kubectl Cheatsheet OMNI52™ GmbH
Neu in kubectl 1.37kubectl get -o kyaml stabil · explain --max-depth · --proxy-url überschreibt die kubeconfigAlle Neuerungen →

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)

kubectl Cheatsheet Seite 1: Kontexte und kuberc, Output-Formate inkl. KYAML, Apply/Diff/Server-Side Apply, Patch-Strategien, Debug, Rollout, Auth/Events/Wait
kubectl Cheatsheet Seite 2: Port-Forward/Exec/cp, Explain, Kustomize, Plugins, Anti-Patterns

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.

kubectl Cheatsheet (PDF, ~100 KB)

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

CC BY-SA 4.0. Du darfst dieses Cheatsheet kopieren, weiterverteilen, ausdrucken und in eigenen Materialien zitieren. Bedingung: Quellenangabe „kubectl Cheatsheet, OMNI52 GmbH, kubectl-cheatsheet.de“ bleibt sichtbar, und abgeleitete Werke stehen unter der gleichen Lizenz (Share-Alike).

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.