Workshop-Wiki · Deutsch

Kommandoreferenz: Kubernetes

Diese Referenz sammelt die wichtigsten Kubernetes-Kommandos und beschreibt, wann du sie verwendest, welche Ausgabe du erwarten kannst und worauf du achten musst. Der Schwerpunkt liegt auf kubectl, kubeadm und den Werkzeugen, die du im re…

Workshop-Beispiele als ZIP
Lernstand in der Web-App

Kapitel als gelesen markieren, Lesefortschritt sehen und Praxismodule abhaken: Diese Funktionen stehen nach Aktivierung der optionalen Web-App zur Verfügung. Der Workshop-Fortschritt ergibt sich automatisch aus den Kapiteln aller Dokumentseiten. Deine Auswahl bleibt auf diesem Gerät; es gibt kein Konto und keinen Serverabgleich. Eine Installation ist nicht erforderlich. Beim Widerruf in den Datenschutz-Einstellungen wird der Lernstand gelöscht.

Lesefortschritt0%
0%
0 / 50 Kapitel gelesen
Weitere SprachfassungEnglisch ↗Griechisch ↗

Kommandoreferenz: Kubernetes

Stand: 13. Juni 2026
Zielgruppe: Kubernetes-Workshop, Betrieb, Troubleshooting, Reviews und Abschlussprojekte

Diese Referenz sammelt die wichtigsten Kubernetes-Kommandos und beschreibt, wann du sie verwendest, welche Ausgabe du erwarten kannst und worauf du achten musst. Der Schwerpunkt liegt auf kubectl, kubeadm und den Werkzeugen, die du im realen Betrieb um Kubernetes herum regelmäßig brauchst: kubelet, Control-Plane-Binaries, crictl, ctr, nerdctl, etcdctl, etcdutl, Helm, Kustomize, CNI-Tools, Cluster-Tools und Linux-Hilfsbefehle.

Wichtig: Kubernetes-Kommandos sind stark versions-, Distributions-, Cloud- und Add-on-abhängig. Diese Datei ist deshalb als ausführliche Workshop- und Betriebsreferenz aufgebaut. Die vollständige Flag-Referenz einer konkreten Installation prüfst du immer zusätzlich mit <kommando> --help, <kommando> <unterkommando> --help und der Dokumentation deiner Kubernetes-Version.



1. Grundregeln für sicheres Arbeiten

Kubernetes-Kommandos wirken oft unmittelbar auf produktive Workloads. Arbeite deshalb mit klarer Reihenfolge:

  1. Kontext prüfen: Du prüfst zuerst Cluster, Namespace und Identität.
  2. Lesen vor Schreiben: Du verwendest zuerst get, describe, diff, dry-run und auth can-i.
  3. Änderung begrenzen: Du arbeitest mit Namespace, Label-Selector oder konkretem Objekt statt mit -A oder --all.
  4. Auswirkung verstehen: Du bewertest, ob ein Kommando Pods neu startet, Traffic umleitet, Daten löscht oder Nodes entleert.
  5. Rollback vorbereiten: Du sicherst vorher Manifest, Werte, Revision, Backup oder Snapshot.
  6. Nachher validieren: Du prüfst Status, Events, Logs, Endpoints und Metriken.

Gefährliche Kommandoklassen

Kommandoklasse Risiko Sicherer Umgang
kubectl delete Entfernt Ressourcen oder löst Re-Creation aus. Erst kubectl get, dann gezielt löschen. Keine unkontrollierten Wildcards.
kubectl replace --force Löscht und erstellt neu. Das verursacht Downtime. Nur verwenden, wenn du den Re-Creation-Effekt willst.
kubectl drain Evicted Pods auf einem Node. PDBs, DaemonSets, lokale Daten und Kapazität prüfen.
kubeadm reset Entfernt lokale Cluster-Artefakte eines Nodes. Nur auf dem richtigen Host ausführen. Danach CNI-, iptables- und Datenreste prüfen.
etcdctl snapshot restore / etcdutl snapshot restore Erzeugt einen neuen logischen etcd-Clusterzustand. Nur nach dokumentiertem Restore-Plan und Backup verwenden.
kubectl patch Kann Felder unbemerkt überschreiben. Patch klein halten und Ergebnis mit get -o yaml prüfen.
kubectl apply --prune Kann nicht mehr deklarierte Ressourcen entfernen. Nur mit engem Selector und Testumgebung einsetzen.

01 / 50

2. Notation und Platzhalter

In dieser Datei werden Platzhalter einheitlich verwendet:

Platzhalter Bedeutung Beispiel
<namespace> Namespace demo
<pod> Pod-Name web-785d9c9d8f-abc12
<deployment> Deployment-Name web
<service> Service-Name web
<node> Node-Name worker-01
<container> Container-Name in einem Pod app
<context> kubeconfig-Kontext dev-cluster
<image> Container-Image ghcr.io/example/app:1.2.3
<file> Manifest, Values-Datei oder Snapshot deployment.yaml

Konventionen:

bash
# Namespace explizit setzen
kubectl get pods -n <namespace>

# Alle Namespaces anzeigen
kubectl get pods -A
kubectl get pods --all-namespaces

# Kurze Schreibweise für Ressourcentypen
kubectl get po,svc,deploy -n <namespace>

# Lange Schreibweise ist in Dokumentation und Workshops oft besser lesbar
kubectl get pods,services,deployments -n <namespace>

02 / 50

3. Shell, Autocomplete und Aliasse

Versionen prüfen

bash
kubectl version --client
kubectl version
kubectl version -o yaml
kubeadm version
helm version
crictl --version
ctr version
etcdctl version

kubectl version --client prüft nur dein lokales CLI. kubectl version spricht zusätzlich mit dem API Server. Wenn du keinen Zugriff hast, siehst du hier Authentifizierungs-, Netzwerk- oder Zertifikatsfehler.

Autocomplete für Bash

bash
source <(kubectl completion bash)
echo 'source <(kubectl completion bash)' >> ~/.bashrc

alias k=kubectl
complete -o default -F __start_kubectl k

Autocomplete für Zsh

bash
source <(kubectl completion zsh)
echo '[[ $commands[kubectl] ]] && source <(kubectl completion zsh)' >> ~/.zshrc

Autocomplete für Fish

bash
mkdir -p ~/.config/fish/completions
kubectl completion fish > ~/.config/fish/completions/kubectl.fish

Nützliche Aliasse

bash
alias k='kubectl'
alias kgp='kubectl get pods'
alias kgn='kubectl get nodes -o wide'
alias kga='kubectl get all'
alias kaf='kubectl apply -f'
alias kdf='kubectl diff -f'
alias kdel='kubectl delete'
alias kctx='kubectl config current-context'
alias kns='kubectl config set-context --current --namespace'

Verwende Aliasse nur interaktiv. In Dokumentation, Runbooks und CI-Pipelines sind ausgeschriebene Kommandos robuster.


03 / 50

4. kubectl: Syntax und globale Optionen

kubectl ist das Standard-CLI für die Kommunikation mit der Kubernetes Control Plane. Die Grundform lautet:

bash
kubectl [global options] <verb> <resource> [name] [flags]

Beispiele:

bash
kubectl get pods -n demo
kubectl describe deployment web -n demo
kubectl apply -f deployment.yaml
kubectl delete service web -n demo

Globale Optionen

Option Zweck Beispiel
--kubeconfig <file> Nutzt eine bestimmte kubeconfig-Datei. kubectl --kubeconfig ./kubeconfig get nodes
--context <context> Nutzt einen bestimmten Kontext. kubectl --context prod get pods -A
-n, --namespace Setzt den Namespace für namespaced Ressourcen. kubectl get pods -n demo
-A, --all-namespaces Zeigt Ressourcen in allen Namespaces. kubectl get pods -A
-o <format> Ausgabeformat. kubectl get pods -o wide
-l, --selector Filtert per Label-Selector. kubectl get pods -l app=web
--field-selector Filtert per Feld. kubectl get pods --field-selector=status.phase=Pending
--as <user> Impersonation als Benutzer. kubectl auth can-i get pods --as alice
--as-group <group> Impersonation als Gruppe. kubectl auth can-i list pods --as-group devs
--request-timeout <dauer> Timeout für API-Anfragen. kubectl get pods --request-timeout=10s
--v <level> Erhöht Verbosity für Debugging. kubectl get pods --v=8
--dry-run=client Validiert/generiert lokal ohne API-Persistenz. kubectl create ns demo --dry-run=client -o yaml
--dry-run=server Validiert über den API Server, inklusive Admission. kubectl apply --dry-run=server -f app.yaml

Ausgabeformate

bash
kubectl get pods -o wide
kubectl get pods -o yaml
kubectl get pods -o json
kubectl get pods -o name
kubectl get pods -o custom-columns='NS:.metadata.namespace,NAME:.metadata.name,STATUS:.status.phase'
kubectl get pods -o jsonpath='{.items[*].metadata.name}'

Typische Ressourcenkurzformen

Kurzform Langform
po pods
svc services
deploy deployments
rs replicasets
sts statefulsets
ds daemonsets
cm configmaps
sa serviceaccounts
ns namespaces
ep endpoints
pvc persistentvolumeclaims
pv persistentvolumes
sc storageclasses
ing ingresses
netpol networkpolicies
cj cronjobs

04 / 50

5. kubeconfig, Kontext und Zugriff

Aktuellen Kontext prüfen

bash
kubectl config current-context
kubectl config get-contexts
kubectl cluster-info
kubectl get nodes -o wide

Du führst diese Kommandos vor jeder Änderung aus. Ein falscher Kontext ist einer der häufigsten Betriebsfehler.

Kontext wechseln

bash
kubectl config use-context <context>
kubectl config current-context

Namespace im aktuellen Kontext setzen

bash
kubectl config set-context --current --namespace=<namespace>
kubectl config view --minify | grep namespace

Das ist komfortabel, kann aber gefährlich sein. In Runbooks ist -n <namespace> expliziter.

kubeconfig anzeigen und prüfen

bash
kubectl config view
kubectl config view --raw
kubectl config view --minify
kubectl config get-clusters
kubectl config get-users
kubectl config get-contexts

--raw kann sensible Daten wie Zertifikate oder Tokens ausgeben. Teile diese Ausgabe nicht ungeprüft.

Cluster, User und Kontext setzen

bash
kubectl config set-cluster <cluster> --server=https://<api-server>:6443 --certificate-authority=<ca.crt>
kubectl config set-credentials <user> --client-certificate=<user.crt> --client-key=<user.key>
kubectl config set-context <context> --cluster=<cluster> --user=<user> --namespace=<namespace>
kubectl config use-context <context>

Kontext umbenennen oder löschen

bash
kubectl config rename-context <old-context> <new-context>
kubectl config delete-context <context>
kubectl config delete-cluster <cluster>
kubectl config delete-user <user>

Temporäre kubeconfig verwenden

bash
KUBECONFIG=./kubeconfig kubectl get nodes
kubectl --kubeconfig ./kubeconfig get pods -A

Mehrere kubeconfig-Dateien zusammenführen

bash
export KUBECONFIG=$HOME/.kube/config:./cluster-a.yaml:./cluster-b.yaml
kubectl config view --merge --flatten > ./merged-kubeconfig.yaml

05 / 50

6. API-Erkundung und Ressourcenmodell

API-Versionen und Ressourcen anzeigen

bash
kubectl api-versions
kubectl api-resources
kubectl api-resources --namespaced=true
kubectl api-resources --namespaced=false
kubectl api-resources --verbs=list
kubectl api-resources --api-group=apps
kubectl api-resources -o wide

Damit erkennst du, welche Ressourcentypen im Cluster verfügbar sind. CRDs von Add-ons erscheinen ebenfalls hier.

Ressourcenschema erklären

bash
kubectl explain pod
kubectl explain pod.spec
kubectl explain pod.spec.containers
kubectl explain deployment.spec.strategy
kubectl explain networkpolicy.spec.ingress
kubectl explain gateway.spec.listeners
kubectl explain --recursive deployment.spec.template.spec

kubectl explain ist die schnellste Methode, um Felder direkt aus dem API-Schema zu verstehen.

API-Rohzugriff

bash
kubectl get --raw /api
kubectl get --raw /apis
kubectl get --raw /version
kubectl get --raw /healthz
kubectl get --raw /readyz?verbose
kubectl get --raw /livez?verbose
kubectl get --raw /metrics | head

/metrics, /readyz und /livez können abhängig von RBAC und API-Server-Konfiguration geschützt sein.

Subresources

Einige Ressourcen besitzen Subresources wie status, scale oder versionsabhängig resize.

bash
kubectl get deployment web -n demo --subresource=scale -o yaml
kubectl patch deployment web -n demo --subresource=scale --type=merge -p '{"spec":{"replicas":3}}'
kubectl get pod <pod> -n demo --subresource=status -o yaml

Nutze Subresources gezielt, wenn du nur Status, Skalierung oder ein spezielles Teilobjekt bearbeiten willst.


06 / 50

7. Ressourcen anzeigen, filtern und formatieren

Grundkommandos

bash
kubectl get namespaces
kubectl get nodes -o wide
kubectl get pods -A -o wide
kubectl get all -n <namespace>
kubectl get deployments,replicasets,pods -n <namespace>
kubectl get services,endpoints,endpointslices -n <namespace>
kubectl describe pod <pod> -n <namespace>
kubectl describe node <node>

Watch-Modus

bash
kubectl get pods -n <namespace> -w
kubectl get events -n <namespace> --watch
watch -n 2 'kubectl get pods -n <namespace>'

kubectl -w folgt API-Events. watch ruft ein Kommando wiederholt auf und ist nützlich, wenn du mehrere Objekttypen zusammen anzeigen willst.

Label-Selector

bash
kubectl get pods -n demo -l app=web
kubectl get pods -n demo -l 'app in (web,api)'
kubectl get pods -n demo -l 'app=web,environment=dev'
kubectl get pods -A -l 'app.kubernetes.io/name=nginx'

Field-Selector

bash
kubectl get pods -A --field-selector=status.phase=Pending
kubectl get pods -A --field-selector=status.phase!=Running
kubectl get events -A --field-selector=type=Warning
kubectl get pods -A --field-selector=spec.nodeName=<node>

Field-Selectoren sind begrenzter als Label-Selectoren, aber für Status- und Node-bezogene Abfragen sehr hilfreich.

Sortieren

bash
kubectl get pods -A --sort-by=.metadata.creationTimestamp
kubectl get events -A --sort-by=.lastTimestamp
kubectl get pv --sort-by=.spec.capacity.storage
kubectl get pods -A --sort-by=.status.containerStatuses[0].restartCount

Ausgabe als Namen

bash
kubectl get pods -n demo -o name
kubectl get deploy -n demo -o name
kubectl get pods -n demo -l app=web -o name | xargs -r -n1 kubectl describe -n demo

YAML und JSON gezielt speichern

bash
kubectl get deployment web -n demo -o yaml > deployment.web.yaml
kubectl get service web -n demo -o json > service.web.json

Mehrere Ressourcen kombiniert prüfen

bash
kubectl get deploy,rs,po,svc,ep,endpointslice -n demo -o wide
kubectl get ingress,svc,ep,endpointslice -n demo -o wide
kubectl get pvc,pv,storageclass -A

07 / 50

8. Ressourcen erstellen, anwenden und validieren

Deklarativ mit apply

bash
kubectl apply -f manifest.yaml
kubectl apply -f ./manifests/
kubectl apply -f https://example.invalid/manifest.yaml
kubectl apply -k overlays/dev

apply ist Standard für deklarative Arbeit. Die Manifestdatei bleibt der autoritative Zielzustand.

Server-Side Dry Run

bash
kubectl apply --dry-run=server -f manifest.yaml
kubectl apply --dry-run=server -k overlays/dev

Server-Side Dry Run validiert gegen den API Server und berücksichtigt Admission Controller. Das ist aussagekräftiger als rein lokale YAML-Prüfung.

Client-Side Dry Run und YAML-Generierung

bash
kubectl create namespace demo --dry-run=client -o yaml
kubectl create deployment web --image=nginx:1.27 --replicas=2 --dry-run=client -o yaml
kubectl create service clusterip web --tcp=80:8080 --dry-run=client -o yaml
kubectl run debug --image=busybox --restart=Never --dry-run=client -o yaml -- sleep 3600

Diese Form nutzt du, um Startmanifeste zu erzeugen und danach sauber zu versionieren.

Diff vor Änderung

bash
kubectl diff -f manifest.yaml
kubectl diff -k overlays/dev
kubectl diff -f ./manifests/ --server-side

diff zeigt dir, welche Felder sich im Cluster ändern würden.

Server-Side Apply

bash
kubectl apply --server-side -f manifest.yaml
kubectl apply --server-side --field-manager=workshop -f manifest.yaml
kubectl apply --server-side --force-conflicts -f manifest.yaml

Server-Side Apply ist hilfreich, wenn mehrere Controller oder Teams Felder verwalten. --force-conflicts nur verwenden, wenn du bewusst Feldbesitz überschreiben willst.

Replace

bash
kubectl replace -f manifest.yaml
kubectl replace --force -f manifest.yaml

replace ersetzt die Ressource anhand des gelieferten Objekts. replace --force löscht und erstellt neu; das kann Downtime verursachen.

Validierung mit Schema und Admission

bash
kubectl apply --dry-run=server -f manifest.yaml
kubectl explain deployment.spec.template.spec.containers.resources
kubectl get events -n demo --sort-by=.lastTimestamp

Wenn Admission Controller wie Policy Engines aktiv sind, kann ein Manifest syntaktisch korrekt sein und trotzdem abgelehnt werden.


08 / 50

9. Ressourcen ändern: edit, patch, label, annotate und set

Interaktiv editieren

bash
kubectl edit deployment web -n demo
kubectl edit service web -n demo
kubectl edit configmap app-config -n demo
kubectl edit node <node>

edit ist für Notfälle nützlich, aber schlecht reproduzierbar. Übertrage dauerhafte Änderungen anschließend in dein Git-Repository.

Patch mit Merge Patch

bash
kubectl patch deployment web -n demo --type=merge -p '{"spec":{"replicas":3}}'
kubectl patch service web -n demo --type=merge -p '{"spec":{"type":"ClusterIP"}}'

Patch mit JSON Patch

bash
kubectl patch deployment web -n demo --type=json -p='[
  {"op":"replace","path":"/spec/replicas","value":3}
]'

JSON Patch ist präzise, aber empfindlich gegenüber Pfaden.

Patch einer Annotation

bash
kubectl patch deployment web -n demo --type=merge -p '{
  "metadata": {
    "annotations": {
      "workshop.example/change-reason": "manual-test"
    }
  }
}'

Labels setzen und entfernen

bash
kubectl label namespace demo environment=dev
kubectl label pod <pod> -n demo debug=true
kubectl label deployment web -n demo app.kubernetes.io/version=1.2.3 --overwrite
kubectl label namespace demo environment-

Labels steuern Selektoren, Policies, Metrikaggregation und häufig auch GitOps-/Deployment-Logik. Ändere sie kontrolliert.

Annotationen setzen und entfernen

bash
kubectl annotate deployment web -n demo kubernetes.io/change-cause='image update to 1.2.3'
kubectl annotate pod <pod> -n demo workshop.example/owner='team-a' --overwrite
kubectl annotate deployment web -n demo kubernetes.io/change-cause-

Images ändern

bash
kubectl set image deployment/web app=<image> -n demo
kubectl set image deployment/web app=ghcr.io/example/app:1.2.3 -n demo --record=false
kubectl set image daemonset/node-agent agent=ghcr.io/example/agent:2.0.0 -n kube-system

Umgebungsvariablen ändern

bash
kubectl set env deployment/web LOG_LEVEL=debug -n demo
kubectl set env deployment/web LOG_LEVEL- -n demo
kubectl set env deployment/web --from=configmap/app-config -n demo
kubectl set env deployment/web --list -n demo

Ressourcen ändern

bash
kubectl set resources deployment/web -n demo --requests=cpu=100m,memory=128Mi --limits=cpu=500m,memory=512Mi
kubectl set resources deployment/web -n demo -c app --requests=cpu=200m,memory=256Mi

ServiceAccount setzen

bash
kubectl set serviceaccount deployment/web app-sa -n demo

Selector setzen

bash
kubectl set selector service/web app=web -n demo

Bei Selektoren musst du besonders vorsichtig sein. Ein falscher Service-Selector führt schnell zu Services ohne Endpoints oder zu Traffic auf falsche Pods.


09 / 50

10. Ressourcen löschen, warten und aufräumen

Gezielt löschen

bash
kubectl delete pod <pod> -n demo
kubectl delete deployment web -n demo
kubectl delete service web -n demo
kubectl delete -f manifest.yaml
kubectl delete -k overlays/dev

Per Label löschen

bash
kubectl delete pods -n demo -l app=web
kubectl delete jobs -n demo -l cleanup=true

Alle Ressourcen eines Typs löschen

bash
kubectl delete pods --all -n demo
kubectl delete jobs --all -n demo

Verwende --all nur in bewusst abgegrenzten Namespaces.

Grace Period und Force Delete

bash
kubectl delete pod <pod> -n demo --grace-period=30
kubectl delete pod <pod> -n demo --grace-period=0 --force

--force entfernt das API-Objekt aggressiv. Das bedeutet nicht automatisch, dass der Prozess auf dem Node sauber beendet wurde.

Finalizer prüfen und entfernen

bash
kubectl get <resource> <name> -n demo -o jsonpath='{.metadata.finalizers}'
kubectl patch <resource> <name> -n demo --type=merge -p '{"metadata":{"finalizers":null}}'

Finalizer nur entfernen, wenn du verstanden hast, welcher Controller die Ressource blockiert. Sonst bleiben externe Artefakte zurück.

Auf Zustand warten

bash
kubectl wait --for=condition=Available deployment/web -n demo --timeout=120s
kubectl wait --for=condition=Ready pod/<pod> -n demo --timeout=60s
kubectl wait --for=delete pod/<pod> -n demo --timeout=60s
kubectl wait --for=jsonpath='{.status.phase}'=Running pod/<pod> -n demo --timeout=60s

Prune vorsichtig verwenden

bash
kubectl apply -f ./manifests/ --prune -l app.kubernetes.io/part-of=demo

--prune kann Ressourcen löschen, die nicht mehr im angewendeten Set enthalten sind. Nutze einen engen, eindeutigen Label-Selector.


10 / 50

11. Pods

Pods anzeigen

bash
kubectl get pods -n demo
kubectl get pods -n demo -o wide
kubectl get pod <pod> -n demo -o yaml
kubectl describe pod <pod> -n demo

Pods nach Status finden

bash
kubectl get pods -A --field-selector=status.phase=Pending
kubectl get pods -A --field-selector=status.phase=Failed
kubectl get pods -A --field-selector=status.phase=Succeeded
kubectl get pods -A --field-selector=spec.nodeName=<node>

Container eines Pods anzeigen

bash
kubectl get pod <pod> -n demo -o jsonpath='{.spec.containers[*].name}'
kubectl get pod <pod> -n demo -o jsonpath='{.spec.initContainers[*].name}'
kubectl get pod <pod> -n demo -o jsonpath='{.status.containerStatuses[*].restartCount}'

Temporären Pod starten

bash
kubectl run tmp-shell -n demo --rm -it --image=busybox:1.36 --restart=Never -- sh
kubectl run curl -n demo --rm -it --image=curlimages/curl:8.8.0 --restart=Never -- sh
kubectl run dns-test -n demo --rm -it --image=busybox:1.36 --restart=Never -- nslookup kubernetes.default.svc.cluster.local

Pod-Manifest generieren

bash
kubectl run app -n demo --image=nginx:1.27 --restart=Never --dry-run=client -o yaml > pod.yaml

Pod löschen, damit Controller neu erstellt

bash
kubectl delete pod <pod> -n demo
kubectl get replicaset,deployment -n demo

Wenn der Pod von einem Deployment, ReplicaSet, StatefulSet oder DaemonSet verwaltet wird, erstellt der Controller meist Ersatz. Wenn der Pod manuell erstellt wurde, ist er danach weg.


11 / 50

12. Deployments, ReplicaSets und Rollouts

Deployment erstellen

bash
kubectl create deployment web -n demo --image=nginx:1.27 --replicas=2
kubectl create deployment web -n demo --image=nginx:1.27 --replicas=2 --dry-run=client -o yaml > deployment.yaml

Deployment prüfen

bash
kubectl get deployment web -n demo
kubectl describe deployment web -n demo
kubectl get replicaset -n demo -l app=web
kubectl get pods -n demo -l app=web -o wide

Rollout starten und beobachten

bash
kubectl set image deployment/web nginx=nginx:1.28 -n demo
kubectl rollout status deployment/web -n demo --timeout=120s
kubectl rollout history deployment/web -n demo

Rollout-Historie und Revision prüfen

bash
kubectl rollout history deployment/web -n demo
kubectl rollout history deployment/web -n demo --revision=2
kubectl describe deployment web -n demo

Rollback

bash
kubectl rollout undo deployment/web -n demo
kubectl rollout undo deployment/web -n demo --to-revision=2
kubectl rollout status deployment/web -n demo

Rollout pausieren und fortsetzen

bash
kubectl rollout pause deployment/web -n demo
kubectl set image deployment/web app=ghcr.io/example/app:1.2.4 -n demo
kubectl set env deployment/web FEATURE_X=true -n demo
kubectl rollout resume deployment/web -n demo
kubectl rollout status deployment/web -n demo

Deployment neu starten

bash
kubectl rollout restart deployment/web -n demo
kubectl rollout status deployment/web -n demo

rollout restart setzt eine Annotation im Pod-Template und erzeugt dadurch neue Pods.

ReplicaSets prüfen

bash
kubectl get rs -n demo
kubectl describe rs <replicaset> -n demo
kubectl get pods -n demo --show-labels

ReplicaSets werden normalerweise nicht direkt geändert. Du änderst das Deployment.


12 / 50

13. StatefulSets, DaemonSets, Jobs und CronJobs

StatefulSets

bash
kubectl get statefulsets -n demo
kubectl describe statefulset db -n demo
kubectl rollout status statefulset/db -n demo
kubectl rollout restart statefulset/db -n demo
kubectl scale statefulset/db -n demo --replicas=3
kubectl get pods -n demo -l app=db -o wide
kubectl get pvc -n demo -l app=db

StatefulSets erzeugen stabile Pod-Namen und nutzen häufig PVCs. Beim Löschen des StatefulSets bleiben PVCs je nach Storage-Policy bestehen.

DaemonSets

bash
kubectl get daemonsets -A
kubectl describe daemonset <daemonset> -n <namespace>
kubectl rollout status daemonset/<daemonset> -n <namespace>
kubectl rollout restart daemonset/<daemonset> -n <namespace>
kubectl get pods -n <namespace> -l <label-key>=<label-value> -o wide

DaemonSets laufen typischerweise für Node-nahe Agenten: CNI, CSI, Logging, Monitoring, Security.

Jobs

bash
kubectl create job migrate -n demo --image=ghcr.io/example/app:1.2.3 -- ./migrate.sh
kubectl create job migrate -n demo --image=ghcr.io/example/app:1.2.3 --dry-run=client -o yaml > job.yaml
kubectl get jobs -n demo
kubectl describe job migrate -n demo
kubectl logs job/migrate -n demo
kubectl delete job migrate -n demo

Job aus CronJob erzeugen

bash
kubectl create job manual-backup -n demo --from=cronjob/backup
kubectl logs job/manual-backup -n demo

CronJobs

bash
kubectl create cronjob backup -n demo --image=busybox:1.36 --schedule='*/15 * * * *' -- /bin/sh -c 'date; echo backup'
kubectl get cronjobs -n demo
kubectl describe cronjob backup -n demo
kubectl get jobs -n demo --sort-by=.metadata.creationTimestamp
kubectl delete cronjob backup -n demo

Fehlgeschlagene Jobs bereinigen

bash
kubectl get jobs -n demo
kubectl delete job -n demo --field-selector=status.successful=1
kubectl delete job -n demo -l cleanup=true

13 / 50

14. Skalierung, Autoscaling und Verfügbarkeit

Manuell skalieren

bash
kubectl scale deployment/web -n demo --replicas=3
kubectl scale statefulset/db -n demo --replicas=3
kubectl get deployment web -n demo

HorizontalPodAutoscaler erzeugen

bash
kubectl autoscale deployment web -n demo --min=2 --max=10 --cpu-percent=70
kubectl get hpa -n demo
kubectl describe hpa web -n demo

HPA benötigt Metriken, meistens über den Metrics Server. Ohne Metriken bleibt der HPA wirkungslos oder zeigt Fehler.

HPA prüfen

bash
kubectl get hpa -A
kubectl describe hpa <hpa> -n <namespace>
kubectl top pods -n <namespace>
kubectl top pods -n <namespace> --containers

PodDisruptionBudget

bash
kubectl get poddisruptionbudgets -A
kubectl describe pdb web -n demo
kubectl create poddisruptionbudget web -n demo --selector=app=web --min-available=1 --dry-run=client -o yaml

PDBs schützen gegen freiwillige Unterbrechungen, etwa bei kubectl drain. Sie verhindern keine Node-Ausfälle.

Availability eines Deployments prüfen

bash
kubectl get deployment web -n demo -o jsonpath='{.status.availableReplicas}'
kubectl get deployment web -n demo -o jsonpath='{.status.conditions}'
kubectl describe deployment web -n demo

14 / 50

15. Logs, Exec, Attach, Copy und Debug

Logs anzeigen

bash
kubectl logs pod/<pod> -n demo
kubectl logs pod/<pod> -n demo -c <container>
kubectl logs pod/<pod> -n demo --all-containers
kubectl logs deployment/web -n demo
kubectl logs deployment/web -n demo --tail=100
kubectl logs deployment/web -n demo --since=10m
kubectl logs deployment/web -n demo -f
kubectl logs pod/<pod> -n demo -c <container> --previous

--previous ist wichtig bei CrashLoopBackOff, weil der aktuelle Container oft sofort wieder beendet wird.

Logs per Label

bash
kubectl logs -n demo -l app=web --all-containers=true --tail=100
kubectl logs -n demo -l app=web --prefix=true --since=30m

Exec in Container

bash
kubectl exec -it pod/<pod> -n demo -- sh
kubectl exec -it pod/<pod> -n demo -c <container> -- bash
kubectl exec pod/<pod> -n demo -- printenv
kubectl exec pod/<pod> -n demo -- cat /etc/resolv.conf

Bei minimalen Images gibt es oft kein bash, curl, nslookup oder Paketmanager. Nutze dann Debug-Container.

Attach

bash
kubectl attach pod/<pod> -n demo -c <container>
kubectl attach -it pod/<pod> -n demo -c <container>

attach verbindet sich mit einem laufenden Prozess. Für Shells ist exec meist geeigneter.

Dateien kopieren

bash
kubectl cp demo/<pod>:/path/in/container ./local-file -c <container>
kubectl cp ./local-file demo/<pod>:/tmp/local-file -c <container>

kubectl cp benötigt häufig tar im Container. Wenn tar fehlt, verwende kubectl exec mit Streams oder ein Debug-Image.

Ephemeral Debug Container

bash
kubectl debug -it pod/<pod> -n demo --image=busybox:1.36 --target=<container> -- sh
kubectl debug -it pod/<pod> -n demo --image=nicolaka/netshoot --target=<container> -- bash

Ephemeral Containers verändern den Pod zu Debug-Zwecken. Sie sind nicht für dauerhafte Änderungen gedacht.

Debug-Kopie eines Pods erstellen

bash
kubectl debug pod/<pod> -n demo -it --copy-to=<pod>-debug --container=debug --image=busybox:1.36 -- sh

Node debuggen

bash
kubectl debug node/<node> -it --image=ubuntu:24.04

In der Debug-Shell findest du das Host-Dateisystem typischerweise unter /host. Nutze das nur mit klarer Absicht.


15 / 50

16. Port-Forwarding, Proxy und lokale Tests

Port-Forward auf Pod

bash
kubectl port-forward pod/<pod> -n demo 8080:80

Port-Forward auf Service

bash
kubectl port-forward service/web -n demo 8080:80
curl http://127.0.0.1:8080

Port-Forward auf Deployment

bash
kubectl port-forward deployment/web -n demo 8080:8080

API Proxy

bash
kubectl proxy --port=8001
curl http://127.0.0.1:8001/api/
curl http://127.0.0.1:8001/apis/apps/v1/namespaces/demo/deployments

kubectl proxy ist für lokale Entwicklung und API-Erkundung nützlich. Setze es nicht ungeschützt auf gemeinsam genutzten Systemen ein.

Lokale Service-Tests

bash
kubectl run curl -n demo --rm -it --image=curlimages/curl:8.8.0 --restart=Never -- http://web.demo.svc.cluster.local
kubectl run netshoot -n demo --rm -it --image=nicolaka/netshoot --restart=Never -- bash

16 / 50

17. Services, DNS, Endpoints und EndpointSlices

Services anzeigen

bash
kubectl get services -n demo
kubectl get svc -n demo -o wide
kubectl describe service web -n demo
kubectl get service web -n demo -o yaml

Service erstellen

bash
kubectl expose deployment web -n demo --port=80 --target-port=8080 --type=ClusterIP
kubectl create service clusterip web -n demo --tcp=80:8080 --dry-run=client -o yaml
kubectl create service nodeport web -n demo --tcp=80:8080 --dry-run=client -o yaml
kubectl create service loadbalancer web -n demo --tcp=80:8080 --dry-run=client -o yaml

Endpoints prüfen

bash
kubectl get endpoints web -n demo -o wide
kubectl get endpointslices -n demo -l kubernetes.io/service-name=web
kubectl describe endpointslice -n demo -l kubernetes.io/service-name=web

Wenn ein Service keine Endpoints hat, stimmen meist Selector und Pod-Labels nicht überein oder die Pods sind nicht Ready.

DNS im Cluster testen

bash
kubectl run dns-test -n demo --rm -it --image=busybox:1.36 --restart=Never -- nslookup kubernetes.default.svc.cluster.local
kubectl run dns-test -n demo --rm -it --image=busybox:1.36 --restart=Never -- nslookup web.demo.svc.cluster.local
kubectl run dns-test -n demo --rm -it --image=busybox:1.36 --restart=Never -- cat /etc/resolv.conf

CoreDNS prüfen

bash
kubectl get pods -n kube-system -l k8s-app=kube-dns -o wide
kubectl logs -n kube-system -l k8s-app=kube-dns --tail=100
kubectl get configmap coredns -n kube-system -o yaml

Service-Traffic prüfen

bash
kubectl run curl -n demo --rm -it --image=curlimages/curl:8.8.0 --restart=Never -- curl -sv http://web.demo.svc.cluster.local
kubectl run netshoot -n demo --rm -it --image=nicolaka/netshoot --restart=Never -- curl -sv http://web.demo.svc.cluster.local

17 / 50

18. Ingress und Gateway API

Ingress anzeigen

bash
kubectl get ingress -A
kubectl describe ingress web -n demo
kubectl get ingress web -n demo -o yaml

IngressClass prüfen

bash
kubectl get ingressclass
kubectl describe ingressclass <ingressclass>

Ingress-Controller prüfen

bash
kubectl get pods -A | grep -i ingress
kubectl get svc -A | grep -i ingress
kubectl logs -n ingress-nginx deployment/ingress-nginx-controller --tail=100

Namespace und Labels hängen vom konkreten Controller ab.

Gateway API anzeigen

bash
kubectl get gatewayclasses
kubectl get gateways -A
kubectl get httproutes -A
kubectl get grpcroutes -A
kubectl get tlsroutes -A
kubectl get referencegrants -A

Gateway API beschreiben

bash
kubectl describe gateway <gateway> -n <namespace>
kubectl describe httproute <route> -n <namespace>
kubectl get httproute <route> -n <namespace> -o yaml

Typische Ingress-/Gateway-Triage

bash
kubectl get ingress,svc,ep,endpointslice -n demo -o wide
kubectl describe ingress web -n demo
kubectl get events -n demo --sort-by=.lastTimestamp
kubectl get pods -A -o wide | grep -i ingress
kubectl logs -n <ingress-namespace> <ingress-controller-pod> --tail=200

18 / 50

19. NetworkPolicies und Netzwerktests

NetworkPolicies anzeigen

bash
kubectl get networkpolicy -A
kubectl describe networkpolicy <policy> -n <namespace>
kubectl get networkpolicy <policy> -n <namespace> -o yaml

Netzwerktest-Pods

bash
kubectl run netshoot -n demo --rm -it --image=nicolaka/netshoot --restart=Never -- bash
kubectl run busybox -n demo --rm -it --image=busybox:1.36 --restart=Never -- sh
kubectl run curl -n demo --rm -it --image=curlimages/curl:8.8.0 --restart=Never -- sh

DNS und HTTP testen

bash
nslookup web.demo.svc.cluster.local
curl -sv http://web.demo.svc.cluster.local
wget -qO- http://web.demo.svc.cluster.local
nc -vz web.demo.svc.cluster.local 80

Pod-zu-Pod-Test

bash
kubectl get pods -n demo -o wide
kubectl exec -it <pod> -n demo -- sh
ip addr
ip route
cat /etc/resolv.conf

CNI-Grundprüfung

bash
kubectl get pods -n kube-system -o wide
kubectl get daemonsets -n kube-system
kubectl get nodes -o wide
kubectl describe node <node>

Wenn NetworkPolicies nicht wirken, prüfst du zuerst, ob dein CNI NetworkPolicies überhaupt durchsetzt.


19 / 50

20. ConfigMaps, Secrets und ServiceAccounts

ConfigMap erstellen

bash
kubectl create configmap app-config -n demo --from-literal=LOG_LEVEL=info
kubectl create configmap app-config -n demo --from-file=application.yaml
kubectl create configmap app-config -n demo --from-env-file=.env
kubectl create configmap app-config -n demo --from-literal=LOG_LEVEL=info --dry-run=client -o yaml > configmap.yaml

ConfigMap prüfen

bash
kubectl get configmap app-config -n demo
kubectl describe configmap app-config -n demo
kubectl get configmap app-config -n demo -o yaml

Secret erstellen

bash
kubectl create secret generic app-secret -n demo --from-literal=password='dummy'
kubectl create secret generic app-secret -n demo --from-file=credentials.json
kubectl create secret tls web-tls -n demo --cert=tls.crt --key=tls.key
kubectl create secret docker-registry regcred -n demo \
  --docker-server=<registry> \
  --docker-username=<user> \
  --docker-password=<password> \
  --docker-email=<email>

Secret manifestieren, ohne echte Werte zu committen

bash
kubectl create secret generic app-secret -n demo --from-literal=password='dummy' --dry-run=client -o yaml > secret.example.yaml

Echte Secrets gehören nicht in Workshop-Dateien. Nutze externe Secret-Systeme, Sealed Secrets, External Secrets oder die Secret-Lösung deiner Plattform.

Secret lesen

bash
kubectl get secret app-secret -n demo -o yaml
kubectl get secret app-secret -n demo -o jsonpath='{.data.password}' | base64 -d; echo

Base64 ist keine Verschlüsselung. Es ist nur eine Kodierung.

ServiceAccount erstellen und Token prüfen

bash
kubectl create serviceaccount app-sa -n demo
kubectl get serviceaccount app-sa -n demo -o yaml
kubectl create token app-sa -n demo

ImagePullSecrets setzen

bash
kubectl patch serviceaccount default -n demo -p '{"imagePullSecrets":[{"name":"regcred"}]}'
kubectl get serviceaccount default -n demo -o yaml

20 / 50

21. RBAC, Authentifizierung und Autorisierung

Eigene Berechtigung prüfen

bash
kubectl auth can-i get pods -n demo
kubectl auth can-i list secrets -n demo
kubectl auth can-i create deployments -n demo
kubectl auth can-i '*' '*' -n demo
kubectl auth whoami

Berechtigung für ServiceAccount prüfen

bash
kubectl auth can-i get pods -n demo --as system:serviceaccount:demo:app-sa
kubectl auth can-i list secrets -n demo --as system:serviceaccount:demo:app-sa
kubectl auth can-i '*' '*' --as system:serviceaccount:demo:app-sa

Rollen und Bindings anzeigen

bash
kubectl get roles,rolebindings -n demo
kubectl get clusterroles,clusterrolebindings
kubectl describe role <role> -n demo
kubectl describe rolebinding <rolebinding> -n demo
kubectl describe clusterrole <clusterrole>
kubectl describe clusterrolebinding <clusterrolebinding>

Role erstellen

bash
kubectl create role pod-reader -n demo --verb=get,list,watch --resource=pods
kubectl create role deployment-editor -n demo --verb=get,list,watch,update,patch --resource=deployments.apps

RoleBinding erstellen

bash
kubectl create rolebinding read-pods -n demo --role=pod-reader --serviceaccount=demo:app-sa
kubectl create rolebinding read-pods-user -n demo --role=pod-reader --user=alice@example.com
kubectl create rolebinding read-pods-group -n demo --role=pod-reader --group=developers

ClusterRole und ClusterRoleBinding

bash
kubectl create clusterrole node-reader --verb=get,list,watch --resource=nodes
kubectl create clusterrolebinding node-reader-binding --clusterrole=node-reader --user=alice@example.com

Cluster-weite Rechte sind hochsensibel. Erstelle sie nur, wenn Namespace-Rollen nicht ausreichen.

RBAC aus Manifesten abgleichen

bash
kubectl auth reconcile -f rbac.yaml --dry-run=server
kubectl auth reconcile -f rbac.yaml

Alle ServiceAccounts in Pods anzeigen

bash
kubectl get pods -A -o custom-columns='NS:.metadata.namespace,POD:.metadata.name,SA:.spec.serviceAccountName'

21 / 50

22. Pod- und Container-Security

SecurityContext prüfen

bash
kubectl get pod <pod> -n demo -o jsonpath='{.spec.securityContext}'
kubectl get pod <pod> -n demo -o jsonpath='{.spec.containers[*].securityContext}'
kubectl get pods -A -o custom-columns='NS:.metadata.namespace,POD:.metadata.name,SA:.spec.serviceAccountName'

Privilegierte Pods finden

bash
kubectl get pods -A -o json | jq -r '
  .items[] |
  select(any(.spec.containers[]?; .securityContext.privileged == true)) |
  [.metadata.namespace, .metadata.name] | @tsv'

Pods mit Host-Network, Host-PID oder Host-IPC finden

bash
kubectl get pods -A -o json | jq -r '
  .items[] |
  select(.spec.hostNetwork == true or .spec.hostPID == true or .spec.hostIPC == true) |
  [.metadata.namespace, .metadata.name, "host-level"] | @tsv'

Pod Security Admission per Namespace-Label

bash
kubectl label namespace demo pod-security.kubernetes.io/enforce=baseline --overwrite
kubectl label namespace demo pod-security.kubernetes.io/audit=restricted --overwrite
kubectl label namespace demo pod-security.kubernetes.io/warn=restricted --overwrite
kubectl get namespace demo --show-labels

Admission-Fehler prüfen

bash
kubectl apply --dry-run=server -f pod.yaml
kubectl get events -n demo --sort-by=.lastTimestamp

Images und Pull Policy prüfen

bash
kubectl get pods -A -o jsonpath='{range .items[*]}{.metadata.namespace}{"\t"}{.metadata.name}{"\t"}{range .spec.containers[*]}{.image}{" "}{.imagePullPolicy}{";"}{end}{"\n"}{end}'

Vermeide unkontrollierte :latest-Tags in produktionsnahen Umgebungen.


22 / 50

23. Ressourcenmanagement: Requests, Limits, Quotas und LimitRanges

Requests und Limits anzeigen

bash
kubectl get pod <pod> -n demo -o jsonpath='{.spec.containers[*].resources}'
kubectl describe pod <pod> -n demo
kubectl get pods -n demo -o custom-columns='POD:.metadata.name,CPU_REQ:.spec.containers[*].resources.requests.cpu,MEM_REQ:.spec.containers[*].resources.requests.memory,CPU_LIM:.spec.containers[*].resources.limits.cpu,MEM_LIM:.spec.containers[*].resources.limits.memory'

Ressourcen setzen

bash
kubectl set resources deployment/web -n demo --requests=cpu=100m,memory=128Mi --limits=cpu=500m,memory=512Mi
kubectl set resources deployment/web -n demo -c app --requests=cpu=200m,memory=256Mi --limits=cpu=1,memory=1Gi

ResourceQuota

bash
kubectl get resourcequota -n demo
kubectl describe resourcequota -n demo
kubectl create quota demo-quota -n demo \
  --hard=pods=20,requests.cpu=4,requests.memory=8Gi,limits.cpu=8,limits.memory=16Gi

LimitRange

bash
kubectl get limitrange -n demo
kubectl describe limitrange -n demo

LimitRanges werden in der Regel als Manifest gepflegt, weil die imperativen Generatoren begrenzt sind.

Metrics Server prüfen

bash
kubectl top nodes
kubectl top pods -A
kubectl top pods -n demo --containers
kubectl get apiservice v1beta1.metrics.k8s.io
kubectl describe apiservice v1beta1.metrics.k8s.io

Wenn kubectl top nicht funktioniert, prüfe den Metrics Server und dessen APIService.


23 / 50

24. Storage: StorageClasses, PVs, PVCs, CSI und VolumeAttachments

StorageClasses anzeigen

bash
kubectl get storageclass
kubectl describe storageclass <storageclass>
kubectl get storageclass -o yaml

PVCs und PVs anzeigen

bash
kubectl get pvc -A
kubectl get pv
kubectl describe pvc <pvc> -n demo
kubectl describe pv <pv>

PVC erzeugen

bash
cat <<'YAML' | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data
  namespace: demo
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: standard
YAML

PVC an Debug-Pod mounten

bash
cat <<'YAML' | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: pvc-debug
  namespace: demo
spec:
  restartPolicy: Never
  containers:
    - name: shell
      image: busybox:1.36
      command: ["sh", "-c", "sleep 3600"]
      volumeMounts:
        - name: data
          mountPath: /data
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: data
YAML

CSI prüfen

bash
kubectl get csidrivers
kubectl get csinodes
kubectl get volumeattachments
kubectl describe volumeattachment <volumeattachment>
kubectl get pods -A | grep -i csi

Storage-Triage

bash
kubectl describe pvc <pvc> -n demo
kubectl describe pod <pod> -n demo
kubectl get events -n demo --sort-by=.lastTimestamp
kubectl get pv,pvc -A
kubectl get storageclass
kubectl get volumeattachments

24 / 50

25. Nodes, Scheduling, Taints, Drain und Maintenance

Nodes anzeigen

bash
kubectl get nodes
kubectl get nodes -o wide
kubectl describe node <node>
kubectl get node <node> -o yaml

Pods auf einem Node anzeigen

bash
kubectl get pods -A --field-selector=spec.nodeName=<node> -o wide

Node labels

bash
kubectl get nodes --show-labels
kubectl label node <node> disktype=ssd
kubectl label node <node> disktype-

Taints setzen und entfernen

bash
kubectl taint nodes <node> dedicated=gpu:NoSchedule
kubectl taint nodes <node> dedicated=gpu:NoSchedule-
kubectl describe node <node> | grep -i taints -A2

Node cordon und uncordon

bash
kubectl cordon <node>
kubectl get node <node>
kubectl uncordon <node>

cordon verhindert neue Scheduling-Entscheidungen auf dem Node. Laufende Pods bleiben bestehen.

Node drain

bash
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data --timeout=10m
kubectl uncordon <node>

Prüfe vor drain:

bash
kubectl get pdb -A
kubectl get pods -A --field-selector=spec.nodeName=<node> -o wide
kubectl describe node <node>

Scheduling-Probleme analysieren

bash
kubectl describe pod <pod> -n demo
kubectl get events -n demo --sort-by=.lastTimestamp
kubectl describe node <node>
kubectl get resourcequota,limitrange -n demo
kubectl get pods -A --field-selector=status.phase=Pending

Node-Pressure prüfen

bash
kubectl describe node <node> | grep -E 'Pressure|Allocatable|Capacity' -A5
kubectl get events -A --field-selector=reason=Evicted
kubectl top node <node>
kubectl top pods -A --sort-by=memory

25 / 50

26. Events, Metriken und Beobachtbarkeit

Events anzeigen

bash
kubectl get events -n demo
kubectl get events -n demo --sort-by=.lastTimestamp
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get events -A --field-selector=type=Warning

Neueres events-Kommando, falls unterstützt

bash
kubectl events -n demo
kubectl events -n demo --for pod/<pod>
kubectl events -A --types=Warning

Nicht jede ältere kubectl-Version unterstützt kubectl events gleich.

Metriken anzeigen

bash
kubectl top nodes
kubectl top pods -A
kubectl top pod <pod> -n demo
kubectl top pods -n demo --containers

API Server Health und Readiness

bash
kubectl get --raw /readyz?verbose
kubectl get --raw /livez?verbose
kubectl get --raw /healthz

Cluster-Info dump

bash
kubectl cluster-info
kubectl cluster-info dump
kubectl cluster-info dump --namespaces demo --output-directory ./cluster-dump

cluster-info dump kann sensible Daten enthalten. Nicht ungeprüft teilen.


26 / 50

27. kubectl-Top-Level-Kommandos im Überblick

Kommando Zweck Typischer Einsatz
kubectl annotate Annotationen setzen, ändern oder entfernen. Metadaten, Change-Cause, Controller-Hinweise.
kubectl api-resources Verfügbare Ressourcentypen anzeigen. API-Erkundung, CRD-Prüfung.
kubectl api-versions Verfügbare API-Versionen anzeigen. Manifest-Kompatibilität prüfen.
kubectl apply Deklarative Konfiguration anwenden. Standard für GitOps-nahe Änderungen.
kubectl attach An laufenden Container-Prozess anhängen. Interaktive Diagnose.
kubectl auth Autorisierung prüfen und RBAC abgleichen. can-i, whoami, reconcile.
kubectl autoscale HPA erzeugen. CPU-basiertes Autoscaling starten.
kubectl certificate CertificateSigningRequests verwalten. CSR genehmigen oder ablehnen.
kubectl cluster-info Cluster-Endpunkte anzeigen. Erste Clusterdiagnose.
kubectl completion Shell-Autocomplete erzeugen. Produktiveres Arbeiten.
kubectl config kubeconfig verwalten. Kontext, Cluster, User, Namespace.
kubectl cordon Node für neues Scheduling sperren. Wartung vorbereiten.
kubectl cp Dateien zwischen Container und lokalem System kopieren. Diagnose, Export kleiner Dateien.
kubectl create Ressourcen imperativ erzeugen. Schnelle Tests, YAML-Generator.
kubectl debug Debug-Container oder Node-Debug starten. Laufzeitdiagnose.
kubectl delete Ressourcen löschen. Rückbau, Cleanup, Neuaufbau durch Controller.
kubectl describe Detailbeschreibung mit Events anzeigen. Fehlersuche.
kubectl diff Unterschiede zwischen Manifest und Cluster anzeigen. Review vor apply.
kubectl drain Node für Wartung leeren. Node-Patching, Hardware-Wartung.
kubectl edit Ressource interaktiv ändern. Notfalländerung.
kubectl events Events anzeigen, falls Version unterstützt. Schnelle Eventdiagnose.
kubectl exec Kommando im Container ausführen. Shell, Prozess- und Netzwerktests.
kubectl explain API-Felder erklären. Manifest-Entwicklung.
kubectl expose Service für Ressource erzeugen. Schnelle Service-Erstellung.
kubectl get Ressourcen listen oder abrufen. Standard-Leseoperation.
kubectl kustomize Kustomization rendern. Manifest-Generierung.
kubectl label Labels setzen, ändern oder entfernen. Selektoren, Organisation, Policies.
kubectl logs Containerlogs anzeigen. Applikationsdiagnose.
kubectl options Globale Optionen anzeigen. CLI-Hilfe.
kubectl patch Teiländerung anwenden. Präzise Änderung einzelner Felder.
kubectl plugin Plugins anzeigen. CLI-Erweiterungen.
kubectl port-forward Lokalen Port zu Pod/Service weiterleiten. Lokale Tests.
kubectl proxy Lokalen Proxy zur Kubernetes API starten. API-Erkundung.
kubectl replace Ressource ersetzen. Vollständiger Austausch.
kubectl rollout Rollouts verwalten. Status, History, Undo, Restart.
kubectl run Pod starten oder Manifest generieren. Debugging, schnelle Tests.
kubectl scale Replica-Anzahl ändern. Manuelle Skalierung.
kubectl set Teilbereiche setzen. Image, Env, Ressourcen, ServiceAccount.
kubectl taint Taints auf Nodes verwalten. Scheduling-Steuerung.
kubectl top Metriken anzeigen. CPU-/Memory-Sicht.
kubectl uncordon Node wieder schedulable machen. Wartung abschließen.
kubectl version Client- und Serverversion anzeigen. Kompatibilität prüfen.
kubectl wait Auf Bedingung warten. Skripte, CI, Rollout-Validierung.

Hilfe zu jedem Kommando

bash
kubectl --help
kubectl get --help
kubectl create --help
kubectl create secret --help
kubectl rollout --help
kubectl rollout history --help
kubectl options

27 / 50

28. kubeadm: Überblick

kubeadm ist ein Bootstrapping-Werkzeug für Kubernetes-Cluster. Es richtet einen minimal funktionsfähigen Cluster ein, führt aber nicht automatisch Machine-Provisioning, Cloud-Integration, Monitoring, Dashboard oder vollständige Add-on-Installation aus.

Typische Aufgaben:

Kommando Zweck
kubeadm init Control-Plane-Node initialisieren.
kubeadm join Worker oder weitere Control-Plane dem Cluster hinzufügen.
kubeadm upgrade Cluster-Upgrade planen und ausführen.
kubeadm config kubeadm-Konfiguration anzeigen, migrieren, validieren und Images verwalten.
kubeadm token Bootstrap-Tokens verwalten.
kubeadm reset kubeadm-Artefakte eines Nodes entfernen.
kubeadm certs Kubernetes-Zertifikate prüfen und erneuern.
kubeadm kubeconfig kubeconfig-Dateien verwalten.
kubeadm version kubeadm-Version anzeigen.
kubeadm completion Shell-Completion erzeugen.
kubeadm alpha experimentelle Funktionen; nicht als stabile Betriebsbasis verwenden.

Hilfe

bash
kubeadm --help
kubeadm init --help
kubeadm join --help
kubeadm upgrade --help
kubeadm certs --help

28 / 50

29. kubeadm init

Minimaler Control-Plane-Start

bash
sudo kubeadm init

Das nutzt Defaults und ist für Labore ausreichend, aber für reproduzierbare Setups zu unpräzise.

Initialisierung mit Pod-CIDR

bash
sudo kubeadm init --pod-network-cidr=10.244.0.0/16

Der Pod-CIDR muss zu deinem CNI passen. Flannel nutzt in vielen Beispielen 10.244.0.0/16; andere CNIs haben andere Defaults.

Initialisierung mit API-Server-Advertise-Adresse

bash
sudo kubeadm init --apiserver-advertise-address=<ip-adresse>

Das ist relevant bei Hosts mit mehreren Interfaces.

Initialisierung mit Control-Plane-Endpoint

bash
sudo kubeadm init \
  --control-plane-endpoint=<dns-name-oder-loadbalancer>:6443 \
  --upload-certs

--control-plane-endpoint ist wichtig für HA-Control-Planes. --upload-certs erleichtert das spätere Joinen weiterer Control-Plane-Nodes.

Initialisierung mit Konfigurationsdatei

bash
sudo kubeadm init --config kubeadm-init.yaml

Beispiel:

yaml
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.0.2.10
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
---
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: v1.36.0
controlPlaneEndpoint: k8s-api.example.internal:6443
networking:
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.96.0.0/12

Nach init: kubeconfig einrichten

bash
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes

Nach init: CNI installieren

bash
kubectl get nodes
kubectl get pods -n kube-system
kubectl apply -f <cni-manifest.yaml>
kubectl get nodes -w

Ohne CNI bleiben Nodes häufig NotReady, und CoreDNS-Pods können nicht korrekt laufen.

init mit Phasen untersuchen

bash
sudo kubeadm init phase --help
sudo kubeadm init phase preflight --config kubeadm-init.yaml
sudo kubeadm init phase certs all --config kubeadm-init.yaml
sudo kubeadm init phase kubeconfig all --config kubeadm-init.yaml
sudo kubeadm init phase control-plane all --config kubeadm-init.yaml
sudo kubeadm init phase etcd local --config kubeadm-init.yaml
sudo kubeadm init phase upload-config all --config kubeadm-init.yaml
sudo kubeadm init phase bootstrap-token --config kubeadm-init.yaml
sudo kubeadm init phase addon all --config kubeadm-init.yaml

Phasen sind für Debugging und Spezialfälle nützlich. Für Standardinstallationen nutzt du in der Regel kubeadm init --config ....


29 / 50

30. kubeadm join

Join-Kommando anzeigen lassen

Auf einem bestehenden Control-Plane-Node:

bash
kubeadm token create --print-join-command

Worker joinen

Auf dem neuen Worker:

bash
sudo kubeadm join <api-server>:6443 \
  --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash>

Join mit Konfigurationsdatei

bash
sudo kubeadm join --config kubeadm-join.yaml

Beispiel:

yaml
apiVersion: kubeadm.k8s.io/v1beta4
kind: JoinConfiguration
discovery:
  bootstrapToken:
    apiServerEndpoint: k8s-api.example.internal:6443
    token: abcdef.0123456789abcdef
    caCertHashes:
      - sha256:<hash>
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock

Weitere Control-Plane joinen

bash
sudo kubeadm join <api-server>:6443 \
  --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash> \
  --control-plane \
  --certificate-key <certificate-key>

Den Certificate Key erzeugst oder erneuerst du mit:

bash
sudo kubeadm init phase upload-certs --upload-certs

Join-Phasen

bash
sudo kubeadm join phase --help
sudo kubeadm join phase preflight --config kubeadm-join.yaml
sudo kubeadm join phase kubelet-start --config kubeadm-join.yaml
sudo kubeadm join phase control-plane-prepare all --config kubeadm-join.yaml
sudo kubeadm join phase control-plane-join all --config kubeadm-join.yaml

30 / 50

31. kubeadm reset

Node zurücksetzen

bash
sudo kubeadm reset
sudo kubeadm reset -f

kubeadm reset entfernt lokale kubeadm-Artefakte. Es ist kein vollständiger Betriebssystem-Reset.

Reset mit CRI-Socket

bash
sudo kubeadm reset -f --cri-socket unix:///var/run/containerd/containerd.sock

Nach Reset prüfen

bash
sudo systemctl status kubelet
sudo ls -la /etc/kubernetes/
sudo ls -la /var/lib/kubelet/
sudo iptables-save | grep -i kube || true
ip link

Je nach CNI musst du Netzwerkschnittstellen, iptables/nftables-Regeln oder CNI-Verzeichnisse separat bereinigen.

CNI-Reste vorsichtig entfernen

bash
sudo rm -rf /etc/cni/net.d
sudo rm -rf /var/lib/cni

Nur ausführen, wenn der Node wirklich aus dem Cluster entfernt oder neu aufgebaut wird.


31 / 50

32. kubeadm upgrade

Aktuelle Versionen prüfen

bash
kubectl get nodes
kubectl version
kubeadm version

Upgrade-Plan anzeigen

bash
sudo kubeadm upgrade plan

Control-Plane upgraden

bash
sudo kubeadm upgrade apply v1.36.0

Passe die Version an deine Zielversion an. In der Praxis installierst du vorher die passende kubeadm-Paketversion.

Node-Upgrade-Schritt

Auf weiteren Control-Plane-Nodes und Workern:

bash
sudo kubeadm upgrade node

Difference anzeigen

bash
sudo kubeadm upgrade diff v1.36.0

Typischer Ablauf pro Node

bash
kubectl cordon <node>
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data
# kubeadm/kubelet/kubectl über Paketmanager aktualisieren
sudo kubeadm upgrade node
sudo systemctl daemon-reload
sudo systemctl restart kubelet
kubectl uncordon <node>
kubectl get nodes

Für Control-Plane-Nodes prüfst du zusätzlich API Server, Controller Manager, Scheduler und etcd.


32 / 50

33. kubeadm config und Images

Defaults anzeigen

bash
kubeadm config print init-defaults
kubeadm config print join-defaults

Konfiguration migrieren

bash
kubeadm config migrate --old-config old.yaml --new-config new.yaml

Konfiguration validieren

bash
kubeadm config validate --config kubeadm-init.yaml

Cluster-Konfiguration aus ConfigMap lesen

bash
kubectl get configmap kubeadm-config -n kube-system -o yaml
kubectl get configmap kubeadm-config -n kube-system -o jsonpath='{.data.ClusterConfiguration}'

Images listen und vorziehen

bash
kubeadm config images list
kubeadm config images list --kubernetes-version v1.36.0
sudo kubeadm config images pull
sudo kubeadm config images pull --kubernetes-version v1.36.0
sudo kubeadm config images pull --cri-socket unix:///var/run/containerd/containerd.sock

Das ist wichtig für Air-Gap-Umgebungen oder kontrollierte Registry-Spiegel.


33 / 50

34. kubeadm token, certs und kubeconfig

Bootstrap-Tokens anzeigen und erzeugen

bash
kubeadm token list
kubeadm token generate
kubeadm token create
kubeadm token create --ttl 2h
kubeadm token create --print-join-command
kubeadm token delete <token-id>

Zertifikatsablauf prüfen

bash
sudo kubeadm certs check-expiration

Zertifikate erneuern

bash
sudo kubeadm certs renew all
sudo kubeadm certs renew apiserver
sudo kubeadm certs renew apiserver-kubelet-client
sudo kubeadm certs renew front-proxy-client
sudo kubeadm certs renew etcd-server
sudo kubeadm certs renew etcd-peer
sudo kubeadm certs renew etcd-healthcheck-client
sudo kubeadm certs renew apiserver-etcd-client

Nach Zertifikatserneuerung musst du statische Pods oder relevante Komponenten neu starten lassen, häufig durch Neustart des kubelet oder durch erneutes Schreiben/Bewegen der Manifeste.

Certificate Key erzeugen

bash
sudo kubeadm certs certificate-key
sudo kubeadm init phase upload-certs --upload-certs

CSRs erzeugen

bash
sudo kubeadm certs generate-csr

kubeconfig-Dateien verwalten

bash
sudo kubeadm kubeconfig --help
sudo kubeadm kubeconfig user --client-name <name>
sudo kubeadm init phase kubeconfig admin
sudo kubeadm init phase kubeconfig kubelet
sudo kubeadm init phase kubeconfig controller-manager
sudo kubeadm init phase kubeconfig scheduler

Typische kubeadm-kubeconfigs liegen unter:

bash
ls -la /etc/kubernetes/*.conf

34 / 50

35. kubeadm phases, completion, version und alpha

Version

bash
kubeadm version
kubeadm version -o yaml
kubeadm version -o json

Completion

bash
source <(kubeadm completion bash)
kubeadm completion zsh
kubeadm completion fish

Phasen anzeigen

bash
kubeadm init phase --help
kubeadm join phase --help
kubeadm reset phase --help

Alpha-Funktionen

bash
kubeadm alpha --help

Alpha-Funktionen können sich ändern oder verschwinden. Nutze sie nicht als stabile Grundlage für produktive Runbooks.


35 / 50

36. kubelet und systemd

kubelet ist der Node-Agent. In kubeadm-Setups läuft er meistens als systemd-Service und startet statische Pods aus /etc/kubernetes/manifests.

Service prüfen

bash
sudo systemctl status kubelet
sudo systemctl is-enabled kubelet
sudo systemctl cat kubelet
sudo journalctl -u kubelet -n 200 --no-pager
sudo journalctl -u kubelet -f

Service steuern

bash
sudo systemctl daemon-reload
sudo systemctl restart kubelet
sudo systemctl stop kubelet
sudo systemctl start kubelet

kubelet-Konfiguration prüfen

bash
sudo cat /var/lib/kubelet/config.yaml
sudo cat /var/lib/kubelet/kubeadm-flags.env
sudo cat /etc/default/kubelet 2>/dev/null || true
sudo cat /etc/sysconfig/kubelet 2>/dev/null || true

kubelet direkt aufrufen

bash
kubelet --help
kubelet --version

Direkte kubelet-Starts sind im Betrieb unüblich. Du prüfst und steuerst kubelet normalerweise über systemd.

Häufige kubelet-Fehler prüfen

bash
sudo journalctl -u kubelet -n 300 --no-pager | grep -Ei 'error|failed|certificate|cni|runtime|eviction'
crictl info
crictl ps -a
kubectl describe node <node>

36 / 50

37. Control-Plane-Komponenten: kube-apiserver, scheduler, controller-manager

In kubeadm-Clustern laufen Control-Plane-Komponenten meist als statische Pods.

Statische Pod-Manifeste anzeigen

bash
sudo ls -la /etc/kubernetes/manifests
sudo cat /etc/kubernetes/manifests/kube-apiserver.yaml
sudo cat /etc/kubernetes/manifests/kube-controller-manager.yaml
sudo cat /etc/kubernetes/manifests/kube-scheduler.yaml
sudo cat /etc/kubernetes/manifests/etcd.yaml

Control-Plane-Pods prüfen

bash
kubectl get pods -n kube-system -o wide
kubectl describe pod -n kube-system kube-apiserver-<node>
kubectl logs -n kube-system kube-apiserver-<node> --tail=100
kubectl logs -n kube-system kube-controller-manager-<node> --tail=100
kubectl logs -n kube-system kube-scheduler-<node> --tail=100

kube-apiserver

bash
kube-apiserver --help
kubectl get --raw /readyz?verbose
kubectl get --raw /livez?verbose
kubectl get --raw /metrics | head

Wichtige Themen beim API Server: Zertifikate, Admission Controller, Authentifizierung, Autorisierung, Audit Logging, etcd-Verbindung, Feature Gates.

kube-controller-manager

bash
kube-controller-manager --help
kubectl logs -n kube-system kube-controller-manager-<node> --tail=200

Der Controller Manager enthält zentrale Control Loops, die den Ist-Zustand auf den gewünschten Zustand hin korrigieren.

kube-scheduler

bash
kube-scheduler --help
kubectl logs -n kube-system kube-scheduler-<node> --tail=200

Der Scheduler wählt Nodes für Pods aus. Scheduling-Fehler findest du häufig in Pod-Events, nicht nur im Scheduler-Log.


37 / 50

38. kube-proxy

kube-proxy implementiert Service-Netzwerkregeln, je nach Modus über iptables, IPVS oder nftables/andere Mechanismen der Distribution.

kube-proxy prüfen

bash
kubectl get daemonset kube-proxy -n kube-system
kubectl get pods -n kube-system -l k8s-app=kube-proxy -o wide
kubectl logs -n kube-system -l k8s-app=kube-proxy --tail=100
kubectl get configmap kube-proxy -n kube-system -o yaml

Direktes Binary

bash
kube-proxy --help
kube-proxy --version

Service-Regeln auf Node prüfen

bash
sudo iptables-save | grep KUBE-SVC | head
sudo iptables-save | grep KUBE-SEP | head
sudo ipvsadm -Ln 2>/dev/null | head || true
sudo nft list ruleset 2>/dev/null | grep -i kube | head || true

Welche Kommandos funktionieren, hängt vom kube-proxy-Modus und Betriebssystem ab.


38 / 50

39. Container Runtime: crictl, ctr, nerdctl und Docker

crictl: Standardwerkzeug für CRI-Debugging

crictl spricht die Kubernetes Container Runtime Interface API. Für Node-Debugging ist crictl meistens das passendste Werkzeug.

Endpoint konfigurieren

bash
sudo crictl config runtime-endpoint unix:///var/run/containerd/containerd.sock
sudo crictl config image-endpoint unix:///var/run/containerd/containerd.sock
sudo cat /etc/crictl.yaml

Für CRI-O:

bash
sudo crictl --runtime-endpoint unix:///var/run/crio/crio.sock ps

Runtime-Info

bash
sudo crictl info
sudo crictl version

Pods und Container anzeigen

bash
sudo crictl pods
sudo crictl pods -a
sudo crictl ps
sudo crictl ps -a
sudo crictl inspect <container-id>
sudo crictl inspectp <pod-id>

Logs und Exec

bash
sudo crictl logs <container-id>
sudo crictl logs --tail=100 <container-id>
sudo crictl exec -it <container-id> sh

Images

bash
sudo crictl images
sudo crictl pull <image>
sudo crictl rmi <image-id>
sudo crictl inspecti <image-id>

Container stoppen und entfernen

bash
sudo crictl stop <container-id>
sudo crictl rm <container-id>
sudo crictl rmp <pod-id>

Nutze Stop/Remove auf Kubernetes-Containern nur zur Diagnose. kubelet erstellt verwaltete Container wieder neu.

ctr: containerd-nahes Werkzeug

ctr spricht direkt mit containerd und ist niedriger angesiedelt als crictl.

bash
sudo ctr version
sudo ctr namespaces list
sudo ctr -n k8s.io containers list
sudo ctr -n k8s.io tasks list
sudo ctr -n k8s.io images list
sudo ctr -n k8s.io snapshots list
sudo ctr -n k8s.io content ls

Kubernetes-Objekte liegen bei containerd üblicherweise im Namespace k8s.io.

nerdctl

nerdctl bietet eine Docker-ähnliche Bedienung für containerd. Für Kubernetes-Runtime-Debugging bleibt crictl meist korrekter, weil es die CRI-Sicht zeigt.

bash
sudo nerdctl version
sudo nerdctl -n k8s.io ps
sudo nerdctl -n k8s.io images
sudo nerdctl -n k8s.io logs <container>
sudo nerdctl -n k8s.io inspect <container>

Docker

In modernen Kubernetes-Clustern ist Docker nicht mehr die direkte Kubernetes-Runtime. Docker-Kommandos sind trotzdem relevant, wenn du Images lokal baust.

bash
docker build -t <image> .
docker tag <image> <registry>/<image>:<tag>
docker push <registry>/<image>:<tag>
docker run --rm -it <image> sh
docker logs <container>
docker inspect <container>

Für Container, die kubelet über containerd oder CRI-O startet, nutzt du nicht docker ps, sondern crictl ps.


39 / 50

40. etcd, etcdctl und etcdutl

etcd speichert den Clusterzustand. Arbeiten an etcd sind kritisch. Vor Änderungen brauchst du Backups, Change-Fenster und einen Restore-Plan.

etcd-Pod in kubeadm prüfen

bash
kubectl get pods -n kube-system -l component=etcd -o wide
kubectl logs -n kube-system etcd-<node> --tail=100
sudo cat /etc/kubernetes/manifests/etcd.yaml

etcdctl-Umgebung für kubeadm

bash
export ETCDCTL_API=3
export ETCDCTL_ENDPOINTS=https://127.0.0.1:2379
export ETCDCTL_CACERT=/etc/kubernetes/pki/etcd/ca.crt
export ETCDCTL_CERT=/etc/kubernetes/pki/etcd/healthcheck-client.crt
export ETCDCTL_KEY=/etc/kubernetes/pki/etcd/healthcheck-client.key

Endpoint Health und Status

bash
sudo -E etcdctl endpoint health
sudo -E etcdctl endpoint status -w table
sudo -E etcdctl member list -w table

Snapshot erstellen

bash
sudo -E etcdctl snapshot save /var/backups/etcd-snapshot.db
sudo -E etcdctl snapshot status /var/backups/etcd-snapshot.db -w table

Snapshot mit etcdutl prüfen

bash
etcdutl snapshot status /var/backups/etcd-snapshot.db -w table

Snapshot wiederherstellen

bash
etcdutl snapshot restore /var/backups/etcd-snapshot.db --data-dir /var/lib/etcd-restore

Für Kubernetes-Restore-Szenarien sind Revisionssprünge wichtig, damit Informer-Caches nicht mit zurückspringenden Revisionen arbeiten:

bash
etcdutl snapshot restore /var/backups/etcd-snapshot.db \
  --bump-revision 1000000000 \
  --mark-compacted \
  --data-dir /var/lib/etcd-restore

Keys inspizieren

bash
sudo -E etcdctl get / --prefix --keys-only | head
sudo -E etcdctl get /registry/namespaces --prefix --keys-only

Im Normalbetrieb liest du Kubernetes-Zustand über die API, nicht direkt aus etcd. Direkte etcd-Abfragen sind Diagnose- und Disaster-Recovery-Werkzeuge.


40 / 50

41. Helm

Helm verwaltet Kubernetes-Anwendungen als Charts und Releases.

Repositorys

bash
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo list
helm repo update
helm search repo nginx
helm repo remove bitnami

Chart ansehen

bash
helm show chart bitnami/nginx
helm show values bitnami/nginx
helm show readme bitnami/nginx
helm show crds <chart>
helm pull bitnami/nginx --untar

Chart prüfen und rendern

bash
helm lint ./chart
helm template web ./chart -f values.yaml
helm template web ./chart -f values.yaml --debug
helm template web ./chart -n demo --include-crds

Installieren und aktualisieren

bash
helm install web ./chart -n demo --create-namespace
helm upgrade web ./chart -n demo -f values.yaml
helm upgrade --install web ./chart -n demo --create-namespace -f values.yaml
helm upgrade --install web ./chart -n demo --atomic --wait --timeout 5m
helm upgrade --install web ./chart -n demo --dry-run --debug

--atomic rollt bei Fehlern zurück. --wait wartet auf Kubernetes-Readiness-Bedingungen, soweit Helm sie bewerten kann.

Releases anzeigen

bash
helm list -n demo
helm list -A
helm status web -n demo
helm history web -n demo

Release-Inhalte abrufen

bash
helm get values web -n demo
helm get values web -n demo --all
helm get manifest web -n demo
helm get hooks web -n demo
helm get notes web -n demo
helm get all web -n demo

Rollback und Uninstall

bash
helm rollback web 1 -n demo
helm uninstall web -n demo
helm uninstall web -n demo --keep-history

Dependencies

bash
helm dependency list ./chart
helm dependency update ./chart
helm dependency build ./chart

Paketieren und OCI Registry

bash
helm package ./chart
helm registry login <registry>
helm push ./chart-0.1.0.tgz oci://<registry>/<repo>
helm pull oci://<registry>/<repo>/<chart> --version 0.1.0

Helm-Plugins

bash
helm plugin list
helm plugin install <plugin-url>
helm plugin update <plugin-name>
helm plugin uninstall <plugin-name>

41 / 50

42. Kustomize

Kustomize rendert Kubernetes-Manifeste aus Bases und Overlays.

Mit kubectl integriertes Kustomize

bash
kubectl kustomize overlays/dev
kubectl apply -k overlays/dev
kubectl diff -k overlays/dev
kubectl delete -k overlays/dev

Eigenständiges kustomize-Binary

bash
kustomize build overlays/dev
kustomize build overlays/prod > rendered.yaml
kustomize edit set image app=ghcr.io/example/app:1.2.3
kustomize edit set namespace demo
kustomize edit add resource deployment.yaml

Typisches Overlay prüfen

bash
find overlays/dev -maxdepth 2 -type f -name 'kustomization.yaml' -print
kubectl kustomize overlays/dev | kubectl apply --dry-run=server -f -
kubectl kustomize overlays/dev | kubectl diff -f -

ConfigMap- und Secret-Generatoren

bash
kustomize edit add configmap app-config --from-literal=LOG_LEVEL=info
kustomize edit add secret app-secret --from-literal=password=dummy

Auch hier gilt: echte Secrets nicht in Git speichern.


42 / 50

43. Lokale und leichtgewichtige Cluster: kind, minikube, k3d, k3s, k0s und Talos

Diese Tools sind nicht Kubernetes-Core, aber im Workshop und bei Labs häufig relevant.

kind

bash
kind version
kind create cluster
kind create cluster --name workshop
kind get clusters
kind get kubeconfig --name workshop
kind load docker-image <image> --name workshop
kind export logs ./kind-logs --name workshop
kind delete cluster --name workshop

minikube

bash
minikube version
minikube start
minikube start --driver=docker
minikube status
minikube kubectl -- get pods -A
minikube addons list
minikube addons enable ingress
minikube service <service> -n <namespace>
minikube tunnel
minikube logs
minikube delete

k3d

bash
k3d version
k3d cluster create workshop
k3d cluster list
k3d kubeconfig get workshop
k3d image import <image> -c workshop
k3d cluster delete workshop

k3s

bash
sudo systemctl status k3s
sudo journalctl -u k3s -f
sudo k3s kubectl get nodes
sudo cat /etc/rancher/k3s/k3s.yaml

k0s

bash
k0s version
sudo k0s status
sudo k0s kubectl get nodes
sudo k0s kubeconfig admin
sudo systemctl status k0scontroller
sudo systemctl status k0sworker

Talos

bash
talosctl version
talosctl config endpoint <node-ip>
talosctl config node <node-ip>
talosctl health
talosctl kubeconfig .
talosctl service kubelet
talosctl logs kubelet
talosctl dmesg
talosctl dashboard

Talos hat kein klassisches SSH-/Shell-Modell. Du arbeitest über talosctl.


43 / 50

44. Cloud-Cluster: EKS, GKE und AKS

Cloud-CLIs erzeugen oft kubeconfig-Einträge. Danach arbeitest du wieder mit kubectl.

AWS EKS

bash
aws eks list-clusters --region <region>
aws eks describe-cluster --name <cluster> --region <region>
aws eks update-kubeconfig --name <cluster> --region <region>
kubectl get nodes

Google GKE

bash
gcloud container clusters list --region <region>
gcloud container clusters get-credentials <cluster> --region <region> --project <project>
kubectl get nodes

Azure AKS

bash
az aks list -o table
az aks get-credentials --resource-group <resource-group> --name <cluster>
az aks get-credentials --resource-group <resource-group> --name <cluster> --overwrite-existing
kubectl get nodes

Cloud-spezifische Rechte, Netzwerkmodelle, LoadBalancer, StorageClasses und Managed Add-ons unterscheiden sich erheblich. Prüfe immer die Provider-Dokumentation.


44 / 50

45. CNI-, Service-Mesh- und Add-on-Kommandos

Diese Kommandos hängen von installierten Add-ons ab.

Cilium

bash
cilium status
cilium version
cilium connectivity test
cilium sysdump
cilium config view
cilium policy get
hubble status
hubble observe
hubble observe --namespace demo

Calico

bash
calicoctl version
calicoctl get nodes
calicoctl get ippools
calicoctl get networkpolicy -A
calicoctl get globalnetworkpolicy
calicoctl get felixconfiguration default -o yaml

Istio

bash
istioctl version
istioctl proxy-status
istioctl analyze
istioctl x describe pod <pod> -n <namespace>
istioctl proxy-config clusters <pod> -n <namespace>
istioctl proxy-config listeners <pod> -n <namespace>
istioctl proxy-config routes <pod> -n <namespace>
istioctl proxy-config endpoints <pod> -n <namespace>

cert-manager

bash
kubectl get certificates -A
kubectl get certificaterequests -A
kubectl get issuers -A
kubectl get clusterissuers
kubectl describe certificate <certificate> -n <namespace>
kubectl describe certificaterequest <request> -n <namespace>
kubectl get challenges,orders -A

Argo CD CLI und kubectl-Sicht

bash
argocd version
argocd login <server>
argocd app list
argocd app get <app>
argocd app sync <app>
argocd app diff <app>
argocd app history <app>

kubectl get applications -n argocd
kubectl describe application <app> -n argocd

Flux CLI

bash
flux version
flux check
flux get sources all -A
flux get kustomizations -A
flux get helmreleases -A
flux reconcile kustomization <name> -n <namespace>
flux reconcile source git <name> -n <namespace>

Krew und kubectl-Plugins

bash
kubectl plugin list
kubectl krew version
kubectl krew search
kubectl krew install ctx
kubectl krew install ns
kubectl krew install neat
kubectl krew update
kubectl krew upgrade

Plugins sind hilfreich, aber nicht in jedem Cluster oder auf jedem Admin-Rechner vorhanden. Runbooks sollten ohne nicht zwingende Plugins verständlich bleiben.


45 / 50

46. Linux-Hilfsbefehle für Kubernetes-Betrieb

Diese Kommandos laufen auf Nodes oder Admin-Maschinen.

systemd und Logs

bash
sudo systemctl status kubelet
sudo systemctl status containerd
sudo systemctl status crio
sudo journalctl -u kubelet -n 200 --no-pager
sudo journalctl -u containerd -n 200 --no-pager
sudo journalctl -u crio -n 200 --no-pager

Netzwerk

bash
ip addr
ip route
ss -lntup
ss -antp | grep 6443
sudo iptables-save | grep -i kube
sudo nft list ruleset | grep -i kube
sudo ipvsadm -Ln
conntrack -L 2>/dev/null | head

DNS

bash
resolvectl status 2>/dev/null || true
cat /etc/resolv.conf
nslookup kubernetes.default.svc.cluster.local <cluster-dns-ip>
dig kubernetes.default.svc.cluster.local @<cluster-dns-ip>

Dateien und Mounts

bash
df -h
df -ih
mount | grep kubelet
findmnt | grep kubelet
sudo du -sh /var/lib/kubelet/* 2>/dev/null | sort -h
sudo du -sh /var/lib/containerd/* 2>/dev/null | sort -h

Zertifikate

bash
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | less
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates
openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -subject -issuer

Prozesse

bash
ps aux | grep kubelet
ps aux | grep containerd
ps aux | grep kube-apiserver
sudo crictl ps -a

46 / 50

47. JSONPath, jq, yq, custom-columns und Templates

JSONPath-Beispiele

bash
kubectl get pods -n demo -o jsonpath='{.items[*].metadata.name}'
kubectl get pod <pod> -n demo -o jsonpath='{.status.phase}'
kubectl get pod <pod> -n demo -o jsonpath='{.spec.nodeName}'
kubectl get secret app-secret -n demo -o jsonpath='{.data.password}' | base64 -d; echo

Liste mit Zeilenumbrüchen

bash
kubectl get pods -A -o jsonpath='{range .items[*]}{.metadata.namespace}{"\t"}{.metadata.name}{"\t"}{.status.phase}{"\n"}{end}'

custom-columns

bash
kubectl get pods -A -o custom-columns='NS:.metadata.namespace,POD:.metadata.name,NODE:.spec.nodeName,PHASE:.status.phase'
kubectl get nodes -o custom-columns='NODE:.metadata.name,VERSION:.status.nodeInfo.kubeletVersion,RUNTIME:.status.nodeInfo.containerRuntimeVersion'

jq

bash
kubectl get pods -A -o json | jq '.items[] | {namespace: .metadata.namespace, name: .metadata.name, phase: .status.phase}'
kubectl get pods -A -o json | jq -r '.items[] | [.metadata.namespace, .metadata.name, .status.phase] | @tsv'

yq

bash
yq '.spec.template.spec.containers[].image' deployment.yaml
kubectl get deployment web -n demo -o yaml | yq '.spec.template.spec.containers[].image'

Go Template

bash
kubectl get pods -A -o go-template='{{range .items}}{{.metadata.namespace}}{{"\t"}}{{.metadata.name}}{{"\n"}}{{end}}'

47 / 50

48. Troubleshooting-Rezepte

Schnelle Cluster-Triage

bash
kubectl config current-context
kubectl get nodes -o wide
kubectl get pods -A --field-selector=status.phase!=Running
kubectl get events -A --sort-by=.lastTimestamp | tail -100
kubectl get componentstatuses 2>/dev/null || true
kubectl get --raw /readyz?verbose

Pod Pending

bash
kubectl describe pod <pod> -n <namespace>
kubectl get events -n <namespace> --sort-by=.lastTimestamp
kubectl get nodes -o wide
kubectl describe nodes | grep -E 'Taints:|Allocatable:|Allocated resources:' -A10
kubectl get resourcequota,limitrange -n <namespace>

Typische Ursachen: zu wenig Ressourcen, Taints ohne Tolerations, NodeSelector/Affinity passt nicht, PVC nicht gebunden, Quota erreicht.

CrashLoopBackOff

bash
kubectl describe pod <pod> -n <namespace>
kubectl logs <pod> -n <namespace> --all-containers --previous
kubectl logs <pod> -n <namespace> --all-containers --tail=200
kubectl get pod <pod> -n <namespace> -o jsonpath='{.status.containerStatuses}'

Typische Ursachen: Prozess beendet sich, falsche Config, Secret fehlt, Probe zu aggressiv, Berechtigungsproblem, Image startet nicht.

ImagePullBackOff oder ErrImagePull

bash
kubectl describe pod <pod> -n <namespace>
kubectl get secret -n <namespace>
kubectl get serviceaccount -n <namespace> <serviceaccount> -o yaml
kubectl get events -n <namespace> --sort-by=.lastTimestamp

Typische Ursachen: falscher Image-Name, Tag fehlt, Registry nicht erreichbar, ImagePullSecret fehlt, Rate-Limit.

Service ohne Endpoints

bash
kubectl get svc <service> -n <namespace> -o yaml
kubectl get endpoints <service> -n <namespace> -o wide
kubectl get endpointslices -n <namespace> -l kubernetes.io/service-name=<service>
kubectl get pods -n <namespace> --show-labels
kubectl describe pod -n <namespace> -l <selector>

Typische Ursachen: falscher Selector, Pods nicht Ready, falscher Portname, Pods in anderem Namespace.

DNS defekt

bash
kubectl get pods -n kube-system -l k8s-app=kube-dns -o wide
kubectl logs -n kube-system -l k8s-app=kube-dns --tail=100
kubectl get configmap coredns -n kube-system -o yaml
kubectl run dns-test -n <namespace> --rm -it --image=busybox:1.36 --restart=Never -- nslookup kubernetes.default.svc.cluster.local

Ingress routet nicht

bash
kubectl get ingress -A
kubectl describe ingress <ingress> -n <namespace>
kubectl get ingressclass
kubectl get svc,ep,endpointslice -n <namespace>
kubectl get pods -A | grep -i ingress
kubectl logs -n <ingress-namespace> <ingress-controller-pod> --tail=200

Gateway Route funktioniert nicht

bash
kubectl get gatewayclasses,gateway,httproute -A
kubectl describe gateway <gateway> -n <namespace>
kubectl describe httproute <route> -n <namespace>
kubectl get events -n <namespace> --sort-by=.lastTimestamp

PVC Pending

bash
kubectl describe pvc <pvc> -n <namespace>
kubectl get storageclass
kubectl get pv
kubectl get events -n <namespace> --sort-by=.lastTimestamp
kubectl get pods -A | grep -i csi

Node NotReady

bash
kubectl describe node <node>
kubectl get pods -A --field-selector=spec.nodeName=<node> -o wide
sudo systemctl status kubelet
sudo journalctl -u kubelet -n 300 --no-pager
sudo crictl info
sudo crictl ps -a

RBAC Forbidden

bash
kubectl auth can-i <verb> <resource> -n <namespace>
kubectl auth can-i <verb> <resource> -n <namespace> --as system:serviceaccount:<namespace>:<serviceaccount>
kubectl get role,rolebinding -n <namespace>
kubectl get clusterrole,clusterrolebinding | grep <name>

OOMKilled

bash
kubectl describe pod <pod> -n <namespace>
kubectl get pod <pod> -n <namespace> -o jsonpath='{.status.containerStatuses[*].lastState.terminated.reason}'
kubectl top pod <pod> -n <namespace> --containers
kubectl get pod <pod> -n <namespace> -o jsonpath='{.spec.containers[*].resources}'

Rollout hängt

bash
kubectl rollout status deployment/<deployment> -n <namespace> --timeout=60s
kubectl describe deployment <deployment> -n <namespace>
kubectl get rs,pods -n <namespace> -l app=<app>
kubectl get events -n <namespace> --sort-by=.lastTimestamp
kubectl logs deployment/<deployment> -n <namespace> --all-containers --tail=100

API Server nicht erreichbar

bash
kubectl cluster-info
kubectl get --raw /readyz?verbose
curl -k https://<api-server>:6443/readyz
sudo crictl ps -a | grep kube-apiserver
sudo crictl logs <apiserver-container-id>
sudo journalctl -u kubelet -n 300 --no-pager

48 / 50

49. Betriebs-Checklisten

Vor einer Änderung

bash
kubectl config current-context
kubectl get namespace <namespace>
kubectl auth can-i patch deployments -n <namespace>
kubectl diff -f manifest.yaml
kubectl apply --dry-run=server -f manifest.yaml

Prüfe zusätzlich:

  • Ist der Cluster korrekt?
  • Ist der Namespace korrekt?
  • Gibt es ein Rollback?
  • Gibt es ein Backup, falls Daten betroffen sind?
  • Sind echte Secrets ausgeschlossen?
  • Sind PDBs und Kapazität ausreichend?

Nach einer Änderung

bash
kubectl rollout status deployment/<deployment> -n <namespace> --timeout=120s
kubectl get pods -n <namespace> -o wide
kubectl get events -n <namespace> --sort-by=.lastTimestamp | tail -50
kubectl logs deployment/<deployment> -n <namespace> --all-containers --tail=100
kubectl get svc,ep,endpointslice -n <namespace>

Vor Node-Wartung

bash
kubectl get node <node> -o wide
kubectl get pods -A --field-selector=spec.nodeName=<node> -o wide
kubectl get pdb -A
kubectl cordon <node>
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data --timeout=10m

Nach Node-Wartung

bash
sudo systemctl restart kubelet
kubectl uncordon <node>
kubectl get node <node> -o wide
kubectl get pods -A --field-selector=spec.nodeName=<node> -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50

Vor kubeadm-Upgrade

bash
kubectl get nodes
kubectl get pods -A
kubectl get pdb -A
sudo kubeadm upgrade plan
sudo kubeadm certs check-expiration
sudo -E etcdctl endpoint health
sudo -E etcdctl snapshot save /var/backups/etcd-before-upgrade.db

Nach kubeadm-Upgrade

bash
kubectl get nodes -o wide
kubectl get pods -A
kubectl get --raw /readyz?verbose
kubectl top nodes
kubectl get events -A --sort-by=.lastTimestamp | tail -100

49 / 50

50. Quellen und weiterführende Referenzen

50 / 50

K8S · Orthevs Academy

31 Module als durchgängiger Lernpfad.

Die Reihenfolge bleibt unverändert: von der Laborgrundstruktur über fachliche Grundlagen und Betriebsmodelle bis zum abschließenden Troubleshooting. Die technischen Verzeichnisnamen werden bewusst beibehalten.

Orthevs – Engineering als Grundlage für das, was als Nächstes kommt.

Orthevs als App

Orthevs installieren

Die Orthevs Web-App kann auf unterstützten Mobilgeräten und Desktop-Browsern installiert werden.

iPhone und iPad

Öffnen Sie Orthevs in Safari. Tippen Sie auf Teilen, dann auf ‚Zum Home-Bildschirm‘. Aktivieren Sie gegebenenfalls ‚Als Web-App öffnen‘ und tippen Sie auf ‚Hinzufügen‘.

Android

Für die Web-App öffnen Sie das Browsermenü und wählen ‚App installieren‘ oder ‚Zum Startbildschirm hinzufügen‘. Bestätigen Sie die Installation.

Desktop-Browser

Öffnen Sie das Browsermenü oder das Installationssymbol in der Adressleiste und wählen Sie ‚App installieren‘ beziehungsweise ‚Zum Dock hinzufügen‘.

Die Web-App-Installation hängt vom Browser ab. Falls kein Installationsdialog erscheint, nutzen Sie die angezeigten Schritte im Browser.