Kubernetes for platform engineers: printable course notes
Run a shared Kubernetes cluster as a platform team: Deployments, Services and Ingress, ConfigMaps and Secrets, requests, limits and quotas, probes and disruption budgets, namespaces and RBAC, NetworkPolicy and Pod Security, five debugging labs, and a capstone.
These pages are the same content as the interactive course, on one page per module, for reading and printing.
Four pieces
| Piece | What it is |
|---|---|
| See the end result | Not the first step: a 30-minute preview with few explanations. Build the cluster, run checkout, fence it, and watch one failure. Useful to know where you are heading. |
| Full course | 9 modules from an empty laptop to a cluster shared by three teams: workloads, config, sizing, probes, RBAC, network walls, Pod Security, five debugging labs and a capstone. |
| Reference repo | The finished implementation: the cluster, three tenants, three apps, the lab pods and the docs. You copy from it. |
| Your repo | k8s-platform: what should exist in your cluster, one folder per owner. You create it in module 00. |
Your setup
Commands in these notes use these values (shared with the interactive course, stored only in this browser).
Outline
| Module | Part | Time | You are | You will |
|---|---|---|---|---|
| 00 Orientation: what a platform team owns in Kubernetes | Orientation | 30 min | Platform and product | Create a three-node cluster and your repo of manifests, and declare team-checkout's namespace from Git. |
| 01 One app, three objects: Deployment, Service, Ingress | Run a workload | 45 min | Platform and product | Run checkout as a Deployment with 2 replicas, reachable by name inside the cluster and by hostname from your laptop. |
| 02 Configuration and secrets, and where the line is | Run a workload | 40 min | Platform and product | Give checkout its settings from a versioned ConfigMap and its password from a Secret that is not in Git. |
| 03 Sizing: requests, limits, and a quota per team | Keep it healthy | 45 min | Platform and product | Size checkout's pods and cap what team-checkout's namespace can take from the cluster. |
| 04 Probes and disruption budgets: staying up while things change | Keep it healthy | 45 min | Platform and product | Make checkout safe to restart, roll out and drain, and prove it by draining a node under load. |
| 05 Two teams, one cluster: namespaces and RBAC | Share the cluster | 50 min | Platform team | Give two teams a namespace each, with permissions that stop at the namespace, and prove it with kubectl auth can-i. |
| 06 Walls: NetworkPolicy and Pod Security | Share the cluster | 50 min | Platform team | Isolate each team's network and enforce the restricted Pod Security level on both namespaces, without breaking either app. |
| 07 Debugging labs: five ways a pod does not run | Share the cluster | 60 min | Platform and product | Diagnose five common pod failures from their signals, fix each one through Git, and write one runbook entry. |
| 08 Capstone: a third team, on your own | Share the cluster | 60 min | Platform and product | Onboard team-payments end to end without step-by-step commands: an internal service that only checkout may call. |
Between you and production
- A controller applies Git: Argo CD (or Flux) applies every merge and removes what Git no longer holds. Nobody runs `kubectl apply` by hand.
- Pull requests and CODEOWNERS: `tenants/` reviewed by the platform team, `apps/<team>/` by the team; `main` protected.
- Single sign-on: People log in through your identity provider; groups map to the same RoleBindings.
- Secrets from a store: External Secrets Operator and a real secret store; encryption at rest in etcd.
- Admission policies: ValidatingAdmissionPolicy or Kyverno for your own rules: no ClusterRoleBinding for teams, budgets that allow a drain, images from your registry only.
- Requests from measurements: metrics-server and Prometheus; requests and quotas reviewed against real use.
- Alerts: NotReady nodes, Services with zero endpoints, quotas over 80 %, rollouts past their deadline, budgets stuck at 0.
- TLS at the edge: cert-manager certificates on the ingress controller, or the Gateway API.
- Upgrade runbook: Node image and Pod Security versions bumped together, nodes drained one at a time, with a named owner per tenant.
- More than one cluster: Separate clusters for prod, built and configured from code: [Fleet GitOps](/learn/fleet-gitops/).