Skip to content

Room 99

EXIT EXAM - THE GRAND ESCAPE


The Ultimate Challenge

  • You’ve fought through 56 rooms of Kubernetes mastery.
  • This is your final test. No hints. No hand-holding.
  • Complete all tasks from memory to prove you are a true Kubernetes master.

⚠️ Rules of the Exit Exam

  • You must complete ALL 10 challenges in a single Kind cluster.
  • Each challenge builds on the previous one - order matters.
  • Minimal guidance is provided - you should know the commands by now.
  • The final password is assembled from tokens collected in each challenge.

Challenge 1: Cluster Bootstrap

Token: k8

Create a Kind cluster named final-exam with:

  • 1 control-plane node
  • 2 worker nodes
  • Port mappings: host 80 → container 30080, host 443 → container 30443

Verify all nodes are Ready.

Expected: 3 nodes in Ready state

Challenge 2: Namespace Architecture

Token: s

Create these namespaces with appropriate labels:

Namespace Label
frontend tier=web
backend tier=api
data tier=storage
monitoring tier=ops

Apply a default deny-all NetworkPolicy to each namespace, then selectively allow:

  • frontend → backend (port 8080)
  • backend → data (port 5432)
  • monitoring → all namespaces (port 9090)

Challenge 3: RBAC & Security

Token: m

Set up these service accounts and permissions:

Service Account Namespace Permissions
frontend-sa frontend Full access to own namespace only
backend-sa backend Full access to own namespace only
platform-admin default Read-only access to ALL namespaces

Verify:

  • frontend-sa can list pods in frontend but NOT in backend
  • platform-admin can list pods everywhere but cannot delete anything

Challenge 4: Stateful Application

Token: a

Deploy a StatefulSet in the data namespace:

  • Name: exam-db
  • 3 replicas
  • Headless Service: exam-db-headless
  • Each pod gets a 1Gi PVC
  • Pods must start in order (0, 1, 2)

Verify:

  • All 3 pods are running with stable network identities
  • exam-db-0.exam-db-headless.data.svc.cluster.local resolves

Challenge 5: Application Deployment

Token: s

Deploy in the frontend namespace:

  • Deployment: web-app with 3 replicas
  • Rolling update: maxUnavailable=1, maxSurge=1
  • Readiness probe: HTTP GET / port 80, every 5s
  • Liveness probe: HTTP GET /healthz port 80, every 10s
  • Resource requests: 50m CPU, 64Mi memory
  • Resource limits: 100m CPU, 128Mi memory

Deploy in the backend namespace:

  • Deployment: api-server with 2 replicas
  • Environment from ConfigMap api-config and Secret api-secret
  • Anti-affinity: prefer spreading across nodes

Create services for both deployments.


Challenge 6: Ingress & Traffic

Token: t

Install the NGINX Ingress Controller and create ingress rules:

Host Path Backend
exam.local / frontend/web-app:80
exam.local /api backend/api-server:80

Test with:

curl -H "Host: exam.local" http://localhost/
curl -H "Host: exam.local" http://localhost/api


Challenge 7: Jobs & CronJobs

Token: e

Create in the backend namespace:

  • Job: db-migration - runs once, must complete within 60s, retry up to 3 times
  • CronJob: health-check - runs every 5 minutes, checks if api-server is responding, keeps last 3 successful and 1 failed job

Verify the Job completes and the CronJob schedules correctly.


Challenge 8: Autoscaling

Token: r

Configure:

  • HPA for web-app: min 2, max 10, target CPU 50%
  • HPA for api-server: min 1, max 5, target CPU 60%

Generate load and verify the HPAs scale up:

kubectl run load-gen --image=busybox:1.36 --restart=Never -- \
  sh -c "while true; do wget -q -O- http://web-app-svc.frontend.svc.cluster.local; done"

Verify pods scale beyond the initial replica count.


Challenge 9: Observability

Token: 5

Set up:

  • Metrics-server (patched for Kind with --kubelet-insecure-tls)
  • Resource monitoring: kubectl top nodes and kubectl top pods -A must work
  • Log aggregation: Create a DaemonSet that collects container logs from /var/log/containers/ and writes summaries to a shared volume

Verify:

  • kubectl top nodes shows CPU and memory usage
  • kubectl top pods -A shows all pod metrics
  • The log aggregator DaemonSet has a pod on every node

Challenge 10: Disaster Recovery

Token: 6

Prove you can recover from failure:

  1. Take an etcd snapshot (from the Kind control-plane node).
  2. Delete the frontend namespace and all its resources.
  3. Restore from the etcd snapshot.
  4. Verify the frontend namespace and web-app deployment are back.

OR (if etcd restore is not feasible in Kind):

  1. Export all resources from frontend namespace to YAML.
  2. Delete the namespace.
  3. Recreate everything from the exported YAML.
  4. Verify full recovery.

Assemble the Password

Collect all tokens from the 10 challenges:

Challenge Token
1 - Cluster Bootstrap k8
2 - Namespace Architecture s
3 - RBAC & Security m
4 - Stateful Application a
5 - Application Deployment s
6 - Ingress & Traffic t
7 - Jobs & CronJobs e
8 - Autoscaling r
9 - Observability 5
10 - Disaster Recovery 6

Final Password: k8smaster56


⏱️ Time Target

A Kubernetes expert should complete this exam in under 90 minutes. If this is your first attempt, take your time - mastery is about understanding, not speed.


🏆 Congratulations!

If you’ve reached this point and assembled the password, you have demonstrated mastery across:

  • Cluster setup and management (Kind)
  • Namespace architecture and multi-tenancy
  • RBAC and security
  • StatefulSets and persistent storage
  • Deployments, probes, and resource management
  • Ingress and traffic routing
  • Jobs and CronJobs
  • Horizontal Pod Autoscaling
  • Observability and monitoring
  • Disaster recovery

You are a Kubernetes Master. 🎓


🔑 Password

Assemble all tokens: k8smaster56 → enter this with prefix: k8smaster