10.21 - Week 1 Plan

7 days, roughly 2 hours a day. Each day: read (short), then DO (the bulk). Every challenge number references 10.22 - Challenges. End of the week you will have a working cluster with a multi-service app, persistent storage, config management, and basic debugging skills.

Prereqs: 10.11 - Install and First Cluster done, cluster Ready.

Day 1 - Cluster up, mental model (2h)

Goals: cluster running, kubectl comfortable, you can explain what a pod is and why controllers exist.

  1. Install per 10.11 (Option A). Verify nodes Ready, pods in kube-system Running. (20 min)
  2. Read 10.12 - Core Concepts. Do not skim the worked example, trace it. (40)
  3. Smoke tests: kubectl run, kubectl create deployment, port-forward, exec, logs. Delete everything. (30)
  4. Practice kubectl explain deployment.spec.replicas, deployment.spec.template.spec.containers[0].image. (10)
  5. Challenges: C1, C2, C3. (20)

Done when: kubectl get nodes Ready, and you can say what happens when you delete a pod owned by a Deployment, in one breath.

Day 2 - Workloads: Deployments, rollouts, scaling (2h)

Goals: write manifests by hand, do a rolling update, roll it back, scale.

  1. Read 10.32 - YAML Reference (deployment, service sections only). (30)
  2. Write hello.yaml (nginx deployment + ClusterIP service) from scratch. Apply, verify. (40)
  3. Rolling update: change image tag to a different nginx version, watch kubectl rollout status. (20)
  4. Rollback: kubectl rollout undo, and inspect revisions with kubectl rollout history. (15)
  5. Scale 1 -> 5 -> 3. Watch ReplicaSet create/delete pods. (15)
  6. Challenges: C4, C5, C6. (rest)

Done when: you can deploy, update, rollback, and scale a Deployment without looking anything up.

Day 3 - Networking: Services, DNS, Ingress (2h)

Goals: pods talk to pods by DNS name, services route traffic, you understand port-forward vs NodePort vs Ingress.

  1. Read 10.41 - Networking and Ingress. (30)
  2. Deploy api + web with a Service each; exec into web, curl api.default.svc.cluster.local by name. (40)
  3. NodePort service, hit it from the host. (20)
  4. kubectl port-forward svc/web 8080:80, hit localhost. (10)
  5. Re-enable Traefik on alternate ports per 10.41, deploy an Ingress with host/path routing. (20)
  6. Challenges: C7, C8, C9.

Done when: you can explain to someone why curl web:80 works inside the cluster but not on your host, and what each Service type changes.

Day 4 - Config: ConfigMaps and Secrets (2h)

Goals: config injected as env and as files; secrets not in the image.

  1. Read 10.43 - Config and Secrets. (25)
  2. ConfigMap -> env vars; ConfigMap -> mounted file; update it and see the mounted file update (env vars do NOT update). (45)
  3. Secret -> env; note how it is stored (base64 is encoding, not encryption). (30)
  4. kubectl create configmap --from-file and --from-literal. (20)
  5. Challenges: C13, C14.

Done when: you can get config out of a container image and into your app without rebuilding.

Day 5 - Storage: PVCs, StatefulSets (2h)

Goals: data survives pod deletion; a StatefulSet behaves differently from a Deployment.

  1. Read 10.42 - Storage and Stateful Workloads. (25)
  2. PVC + Deployment: write a file, delete the pod, file is still there via the new pod. (40)
  3. StorageClass: inspect k3s’s local-path, why WaitForFirstConsumer matters. (20)
  4. StatefulSet: deploy a 3-replica StatefulSet (e.g. per-pod PVC), observe stable names db-0/db-1/db-2 and per-pod volumes. (35)
  5. Challenges: C15, C16, C17.

Done when: you can explain “a Deployment shares nothing, a StatefulSet gives each pod identity + its own disk”.

Day 6 - Other controllers and scale (2h)

Goals: DaemonSet, Job/CronJob, resource limits, HPA.

  1. Read 10.32 - YAML Reference (daemonset, job, cronjob, resources, HPA sections). (35)
  2. DaemonSet: deploy one, confirm one pod per node. (25)
  3. Job that runs once and completes; CronJob that fires every minute (watch it, then delete it). (30)
  4. Resource requests/limits: deploy an app with limits, check kubectl describe node for how the scheduler accounts for them. (20)
  5. HPA: enable metrics-server-backed autoscaling, put load on a pod (hey, ab or a loop), watch replicas climb. (30)
  6. Challenges: C18, C19, C20.

Done when: you can pick the right controller kind for “one per node”, “run once”, “every night at 2am”.

Day 7 - Debugging, observability, final project (2h+)

Goals: diagnose a broken cluster, then glue everything together.

  1. Read 10.51 - Observability and Debugging. (30)
  2. Break things on purpose (per 10.51 section “Break it on purpose”) and find each root cause with describe/events/logs. (40)
  3. Add liveness/readiness probes to an app; watch kubelet kill and restart a pod whose liveness fails. (20)
  4. FINAL PROJECT (the rest): build “my blog” -
    • 1 Deployment (nginx serving a static page with your name on it) with liveness/readiness probes and resource limits
    • 1 Service (ClusterIP or NodePort)
    • 1 ConfigMap holding the page content, mounted in
    • 1 PVC-backed Deployment for a file upload volume (any tiny app)
    • 1 CronJob backing up that volume’s file to a ConfigMap-less location (or just echo a timestamp to a PVC, keep it simple)
    • everything in its own namespace blog
    • verify with port-forward or NodePort from the host
    • clean up with kubectl delete namespace blog
  5. Review: re-read 10.12 - Core Concepts. It will read differently now. (10)

Done when: the final project survives a pod delete, a namespace delete rebuilds it, and you can hand-debug an unknown crashloop using only describe/events/logs.

After the week

10.53 - Next Steps: Helm, kustomize, operators, GitOps (ArgoCD), and how to map this onto your homelab (deploy the PaperMC server to k3s, put Grafana behind Traefik, etc.).

If you have more time per day

  • kubernetes.io tutorials (nginx example, guestbook) are a good hour-long add-on for day 2/3.
  • Killercoda browser clusters are good for days 3-6 if your host is busy.
  • Book: Kubernetes in Action 2nd ed., chapters 1-15 map day-for-day.

This site uses Just the Docs, a documentation theme for Jekyll.