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.
- Install per 10.11 (Option A). Verify nodes Ready, pods in kube-system Running. (20 min)
- Read 10.12 - Core Concepts. Do not skim the worked example, trace it. (40)
- Smoke tests:
kubectl run,kubectl create deployment, port-forward, exec, logs. Delete everything. (30) - Practice
kubectl explain deployment.spec.replicas,deployment.spec.template.spec.containers[0].image. (10) - 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.
- Read 10.32 - YAML Reference (deployment, service sections only). (30)
- Write
hello.yaml(nginx deployment + ClusterIP service) from scratch. Apply, verify. (40) - Rolling update: change image tag to a different nginx version, watch
kubectl rollout status. (20) - Rollback:
kubectl rollout undo, and inspect revisions withkubectl rollout history. (15) - Scale 1 -> 5 -> 3. Watch ReplicaSet create/delete pods. (15)
- 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.
- Read 10.41 - Networking and Ingress. (30)
- Deploy
api+webwith a Service each; exec into web, curlapi.default.svc.cluster.localby name. (40) - NodePort service, hit it from the host. (20)
kubectl port-forward svc/web 8080:80, hit localhost. (10)- Re-enable Traefik on alternate ports per 10.41, deploy an Ingress with host/path routing. (20)
- 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.
- Read 10.43 - Config and Secrets. (25)
- ConfigMap -> env vars; ConfigMap -> mounted file; update it and see the mounted file update (env vars do NOT update). (45)
- Secret -> env; note how it is stored (base64 is encoding, not encryption). (30)
kubectl create configmap --from-fileand--from-literal. (20)- 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.
- Read 10.42 - Storage and Stateful Workloads. (25)
- PVC + Deployment: write a file, delete the pod, file is still there via the new pod. (40)
- StorageClass: inspect k3s’s
local-path, whyWaitForFirstConsumermatters. (20) - 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)
- 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.
- Read 10.32 - YAML Reference (daemonset, job, cronjob, resources, HPA sections). (35)
- DaemonSet: deploy one, confirm one pod per node. (25)
- Job that runs once and completes; CronJob that fires every minute (watch it, then delete it). (30)
- Resource requests/limits: deploy an app with limits, check
kubectl describe nodefor how the scheduler accounts for them. (20) - HPA: enable metrics-server-backed autoscaling, put load on a pod (hey,
abor a loop), watch replicas climb. (30) - 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.
- Read 10.51 - Observability and Debugging. (30)
- Break things on purpose (per 10.51 section “Break it on purpose”) and find each root cause with describe/events/logs. (40)
- Add liveness/readiness probes to an app; watch kubelet kill and restart a pod whose liveness fails. (20)
- 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
- 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.