Kubernetes-Prüfung: 02 Intermediate
Schwierigkeitsgrad: Intermediate
Sprache: Deutsch
Format: kombinierte Konzept-, Design- und Hands-on-Prüfung
Empfohlene Dauer: 150 bis 180 Minuten
Maximalpunktzahl: 100 Punkte
Bestehensgrenze: 70 Punkte
Diese Prüfung enthält Aufgaben, Abgabeanforderungen und Bewertungsraster. Sie enthält keine vollständige Musterlösung.
1. Prüfungsziel
Die Prüfung weist nach, dass du produktionsnähere Kubernetes-Workloads modellieren, konfigurieren und debuggen kannst. Der Schwerpunkt liegt auf Workload-Auswahl, Probes, Lifecycle, Ressourcenmanagement, Scheduling, NetworkPolicy, DNS, Ingress oder Gateway API, Storage, Helm, Kustomize und systematischem Troubleshooting.
Nach der Prüfung soll erkennbar sein, dass du:
- Deployment, StatefulSet, DaemonSet, Job und CronJob nach Zweck unterscheiden kannst,
- Init Container, Sidecar Container und Ephemeral Container korrekt einordnest,
- Startup, Readiness und Liveness Probes fachlich trennst,
- Requests, Limits, QoS, LimitRange und ResourceQuota anwenden kannst,
- Scheduling-Probleme über Events, Node-Labels, Taints und Tolerations erklärst,
- Service, DNS, EndpointSlices und NetworkPolicies getrennt diagnostizierst,
- Ingress und Gateway API als Regel plus Controller verstehst,
- PVC, PV, StorageClass und StatefulSet grundlegend beherrschst,
- Helm- und Kustomize-Ausgaben vor dem Anwenden prüfst.
2. Voraussetzungen und erlaubte Hilfsmittel
Du brauchst:
- einen Lab-Cluster mit funktionierendem CNI,
- CoreDNS,
kubectl,- optional
helm, - optional
kubectl kustomizeoderkustomize, - optional eine StorageClass,
- optional einen Ingress Controller oder Gateway Controller.
Erlaubt sind:
- offizielle Kubernetes-Dokumentation,
- eigene Workshop-Notizen,
kubectl explain,kubectl describe,kubectl logs,kubectl get events,- lokale Manifeste, die während der Prüfung erstellt werden.
Nicht erlaubt sind:
- produktive Secrets,
- Änderungen außerhalb des Prüfungs-Namespace, sofern nicht ausdrücklich gefordert,
- Cluster-weite Änderungen ohne Dokumentation und Rückbau.
Empfohlener Namespace:
export NS=exam-intermediate
3. Ausgangsszenario
Ein Team betreibt eine kleine Shop-Anwendung im Lab. Die Anwendung besteht aus:
frontend: nimmt HTTP-Anfragen an,backend: stellt eine interne API auf Port8080bereit,migration: läuft einmalig vor einer neuen Version,cleanup: läuft regelmäßig,data-demo: speichert eine kleine Datei persistent.
Die Anwendung soll kontrollierte Health Checks, Ressourcenanforderungen, Namespace-Grenzen, NetworkPolicies und eine saubere Diagnose erhalten. Externe Veröffentlichung erfolgt über Ingress oder Gateway API, falls ein Controller vorhanden ist. Falls kein Controller vorhanden ist, muss dies fachlich korrekt dokumentiert werden.
4. Erwartete Abgabe
Gib am Ende einen Ordner oder ein Archiv mit folgenden Dateien ab:
02-intermediate-abgabe/
answers.md
architecture-decision.md
workloads/
frontend.yml
backend.yml
migration-job.yml
cleanup-cronjob.yml
resources/
limitrange.yml
resourcequota.yml
networking/
services.yml
networkpolicies.yml
ingress-or-gateway.yml
storage/
statefulset.yml
packaging/
kustomize-output.md
helm-output.md
troubleshooting.md
evidence.md
cleanup.md
Wenn Helm, Gateway API, Ingress Controller oder StorageClass nicht verfügbar sind, dokumentiere die Einschränkung und liefere ein fachlich korrektes Beispielmanifest oder eine nachvollziehbare Alternativbewertung.
5. Teil A: Wissensfragen
Beantworte die Fragen präzise und mit betrieblichem Bezug.
- Wann nutzt du ein Deployment, wann ein StatefulSet, wann einen Job und wann einen CronJob?
- Was unterscheidet Init Container, Sidecar Container und Ephemeral Container?
- Welche Aufgabe haben Startup Probe, Readiness Probe und Liveness Probe?
- Warum kann eine zu aggressive Liveness Probe Schaden verursachen?
- Welche Wirkung haben CPU-/Memory-Requests auf Scheduling und HPA?
- Was ist der Unterschied zwischen
Guaranteed,BurstableundBestEffortQoS? - Welche Aufgabe haben LimitRange und ResourceQuota?
- Was ist der Unterschied zwischen
nodeSelector, Affinity, Taints und Tolerations? - Warum kann ein Pod trotz korrektem Manifest im Status
Pendingbleiben? - Wie hängen Service, EndpointSlice, Pod-Readiness und DNS zusammen?
- Warum muss DNS-Egress bei Default-Deny-NetworkPolicies explizit berücksichtigt werden?
- Was ist der Unterschied zwischen Ingress-Ressource und Ingress Controller?
- Welche Rolle haben PV, PVC, StorageClass und CSI?
- Warum ist
hostPathim Lab nicht automatisch eine Produktionslösung? - Was prüfst du bei
PVC Pending, Service ohne Endpoints undCreateContainerConfigError?
6. Teil B: Workload- und Architekturentscheidung
Erstelle architecture-decision.md. Beschreibe für jede Anforderung die passende Kubernetes-Ressource und begründe deine Entscheidung.
| Anforderung | Erwartete Entscheidung |
|---|---|
| HTTP-Frontend soll dauerhaft laufen und rollend aktualisiert werden | Ressourcentyp begründen |
| Backend-API braucht Health Checks und Requests/Limits | Probes und Ressourcen erklären |
| Datenmigration soll genau einmal pro Release laufen | Ressourcentyp begründen |
| Cleanup soll stündlich laufen und keine parallelen Jobs erzeugen | Ressourcentyp und Concurrency erklären |
| Kleiner stateful Workload soll Daten nach Pod-Neuerstellung behalten | StatefulSet/PVC erklären |
| Anwendung soll extern erreichbar sein | Ingress oder Gateway API mit Controller-Abhängigkeit erklären |
| Namespace soll vor Übernutzung geschützt werden | LimitRange und ResourceQuota erklären |
| Frontend darf nur Backend und DNS erreichen | NetworkPolicy-Design erklären |
7. Teil C: Praxisaufgaben
Aufgabe C1: Namespace, Quota und LimitRange
- Erstelle den Namespace
exam-intermediate. - Erstelle eine LimitRange mit Default Requests und Limits.
- Erstelle eine ResourceQuota für Pods, CPU und Memory.
- Zeige, dass ein zu großer Pod vom API Server abgelehnt wird.
Mindestanforderung für Quota:
pods: 10
requests.cpu: 2
requests.memory: 2Gi
limits.cpu: 4
limits.memory: 4Gi
Aufgabe C2: Frontend und Backend mit Probes
Erstelle zwei Deployments:
frontendmit Imagecurlimages/curl:8.8.0oder einem vergleichbaren ungefährlichen Testimage,backendmit einem HTTP-Testserver auf Port8080, zum Beispielregistry.k8s.io/e2e-test-images/agnhost:2.53mitnetexec.
Anforderungen:
- sinnvolle CPU-/Memory-Requests und Limits,
- Readiness Probe für Service-Traffic,
- Liveness Probe für echte Neustartfälle,
- Startup Probe, falls die App langsam startet,
- eindeutige Labels:
app,component,environment, - Services für Frontend und Backend.
Dokumentiere, warum Readiness nicht dasselbe Ziel wie Liveness hat.
Aufgabe C3: Job und CronJob
Erstelle:
- einen Job
migration, der einmalig erfolgreich endet, - einen CronJob
cleanup, der stündlich läuft, concurrencyPolicy: Forbidfür den CronJob,- sinnvolle
successfulJobsHistoryLimitundfailedJobsHistoryLimit.
Dokumentiere, warum ein Deployment hierfür fachlich schlechter geeignet wäre.
Aufgabe C4: Scheduling prüfen
- Label einen Lab-Node mit
exam-role=apps. - Erstelle einen Pod oder ein Deployment mit passendem
nodeSelector. - Erstelle einen zweiten Pod mit nicht passendem
nodeSelector. - Dokumentiere die
Pending-Events. - Setze einen Taint auf den gelabelten Node.
- Zeige den Unterschied zwischen Pod ohne Toleration und Pod mit passender Toleration.
- Baue die Node-Änderungen sauber zurück.
Aufgabe C5: NetworkPolicy Default Deny plus gezielte Erlaubnisse
Erstelle NetworkPolicies mit diesen Anforderungen:
- Default Deny für Ingress und Egress im Namespace.
- DNS-Egress zu CoreDNS erlauben.
frontenddarfbackendauf TCP-Port8080erreichen.- Sonstiger Egress bleibt blockiert.
- Dokumentiere, ob dein CNI NetworkPolicies tatsächlich durchsetzt.
Nachweise:
kubectl get networkpolicy -n exam-intermediate
kubectl exec <frontend-pod> -n exam-intermediate -- nslookup backend
kubectl exec <frontend-pod> -n exam-intermediate -- curl -s --max-time 5 http://backend:8080/hostname
Aufgabe C6: Ingress oder Gateway API
Prüfe zuerst, ob ein Controller vorhanden ist:
kubectl get ingressclass
kubectl get gatewayclass 2>/dev/null || true
Wenn ein Ingress Controller vorhanden ist:
- erstelle eine Ingress-Ressource mit Hostname
shop.localtest.me, - leite auf den passenden Service,
- dokumentiere Controller-Events und Backend-Zuordnung.
Wenn Gateway API vorhanden ist:
- erstelle oder beschreibe ein Gateway-/HTTPRoute-Modell,
- dokumentiere ParentRef, Hostname und BackendRef.
Wenn kein Controller vorhanden ist:
- erstelle ein Beispielmanifest,
- erkläre, warum die Ressource ohne Controller keine praktische Wirkung hat.
Aufgabe C7: PVC und StatefulSet
- Prüfe vorhandene StorageClasses.
- Erstelle ein StatefulSet
data-demomitvolumeClaimTemplates. - Schreibe eine Datei in
/data/test.txt. - Lösche den Pod.
- Prüfe nach Neuerstellung, ob die Datei noch vorhanden ist.
- Dokumentiere die StorageClass und die Grenzen des Labs.
Aufgabe C8: Helm und Kustomize rendern
- Erstelle eine kleine Kustomize-Base und ein Overlay
dev. - Rendere das Overlay mit
kubectl kustomize. - Erstelle ein minimales Helm Chart oder nutze ein lokales Beispielchart.
- Rendere das Chart mit
helm template. - Vergleiche Reviewbarkeit, Parametrisierung und Fehlerrisiko.
8. Teil D: Troubleshooting-Parcours
Untersuche fünf Fehlerbilder. Für jedes Fehlerbild dokumentierst du Symptom, Diagnose, Ursache, Fix und Validierung.
| Fehlerbild | Mindestdiagnose |
|---|---|
Pod bleibt Pending wegen falschem nodeSelector |
kubectl describe pod, Scheduling-Events |
ImagePullBackOff wegen falschem Image-Tag |
Pod-Events, Image-Name und Tag prüfen |
CrashLoopBackOff wegen fehlerhaftem Startkommando |
kubectl logs, kubectl logs --previous, Exit-Code |
PVC bleibt Pending wegen falscher StorageClass |
kubectl describe pvc, StorageClass, Events |
| Service hat keine Endpoints wegen falschem Selector | Labels, Selector, Endpoints, EndpointSlices |
9. Bewertung
| Bereich | Punkte | Erwartung |
|---|---|---|
| Wissensfragen | 20 | Begriffe und Betriebswirkung korrekt erklärt |
| Architekturentscheidung | 15 | Ressourcenwahl und Alternativen nachvollziehbar begründet |
| Workload-Konfiguration | 20 | Probes, Ressourcen, Jobs, CronJobs und Labels sinnvoll umgesetzt |
| Netzwerk, DNS, Ingress/Gateway | 15 | Servicepfad und Controller-Abhängigkeiten korrekt geprüft |
| Storage und Packaging | 10 | PVC/StatefulSet sowie Helm/Kustomize levelgerecht angewendet |
| Troubleshooting | 15 | Fehler systematisch über Events, Logs und Status eingegrenzt |
| Dokumentation und Cleanup | 5 | Abgabe nachvollziehbar, sauberer Rückbau |
| Summe | 100 |
Bewertungsskala:
| Punkte | Ergebnis |
|---|---|
| 90–100 | sehr gut bestanden |
| 80–89 | gut bestanden |
| 70–79 | bestanden |
| 0–69 | nicht bestanden |
10. K.-o.-Kriterien
Die Prüfung gilt unabhängig von der Punktzahl als nicht bestanden, wenn eines dieser Kriterien zutrifft:
- produktive oder fremde Cluster-Kontexte werden verwendet,
- Node-Taints oder Labels werden nicht zurückgebaut,
- NetworkPolicy wird behauptet, aber nicht getestet oder CNI-Wirkung nicht eingeordnet,
- echte Secrets oder produktive Registry-Zugangsdaten werden verwendet,
- keine Diagnose-Evidence für die Troubleshooting-Aufgaben vorhanden ist,
- Cluster-weite Ressourcen werden ohne Begründung verändert.
11. Prüfer-Checkliste
| Kriterium | Erfüllt? |
|---|---|
| Workload-Ressourcen fachlich unterschieden | ☐ |
| Startup, Readiness und Liveness korrekt getrennt | ☐ |
| Requests, Limits, LimitRange und Quota angewendet | ☐ |
| Scheduling-Events korrekt interpretiert | ☐ |
| NetworkPolicy inklusive DNS berücksichtigt | ☐ |
| Ingress/Gateway Controller-Rolle erklärt | ☐ |
| PVC und StatefulSet getestet oder begründet eingeordnet | ☐ |
| Helm und Kustomize gerendert | ☐ |
| Troubleshooting-Parcours vollständig dokumentiert | ☐ |
| Cleanup und Rückbau nachvollziehbar | ☐ |