Skip to main content
RunBook Academy

← All assessments

Final assessment · advanced · ~150 min · pass ≥ 80%

Kubernetes for Production Sysadmins — Final Assessment

Objectives

  • Demonstrate theoretical mastery of the control plane, etcd, and reconciliation model
  • Demonstrate workload, networking, and storage troubleshooting judgement
  • Demonstrate production security discipline: RBAC, PSS, Secrets, supply chain
  • Demonstrate observability and capacity-planning reasoning
  • Demonstrate upgrade, backup, and disaster-recovery competence
  • Demonstrate scheduling, placement, and node-lifecycle judgement
  • Demonstrate multi-tenancy, resource-governance, and packaging discipline
  • Demonstrate capacity, autoscaling, and performance reasoning

60 graded questions · last verified 2026-08-16

Assessment questions

Objective questions are scored automatically. Scenario answers use a second-stage rubric for evidence, remediation, and rollback.

Knowledge check · 60 questions

  1. Q1. Which component is the only one that talks to etcd in a Kubernetes cluster?

  2. Q2. A 3-replica Deployment is scaled to 0 then back to 3. ReplicaSet A had revision 5; ReplicaSet B with revision 6 is created. Two Pods come up under RS-B and report Ready. What does the third Pod do?

  3. Q3. A Pod has been Pending for 20 minutes. The events show `FailedScheduling: 0/12 nodes are available: 12 Insufficient cpu`. The Pod's container requests `cpu: 16` and `memory: 32Gi`. The cluster has 12 worker nodes, each 8 cores. What is the root cause?

  4. Q4. Which probe decides whether to remove a Pod from the EndpointSlice of its Service?

  5. Q5. A PodDisruptionBudget guarantees that a Deployment will remain available during a node failure.

  6. Q6. A NetworkPolicy with an empty `podSelector` in a namespace becomes the namespace's default-deny.

  7. Q7. A CSI snapshot of a running PostgreSQL database is application-consistent by default.

  8. Q8. The default ServiceAccount in a namespace has full cluster permissions by default.

  9. Q9. The kubelet must run within two minor versions of the kube-apiserver.

  10. Q10. Explain the difference between the control plane's HA topology and the worker node's HA topology. What does each protect against, and what does each NOT protect against?

  11. Q11. List three production failure modes that arise from running a stateful workload on a Deployment instead of a StatefulSet, and explain how each manifests.

  12. Q12. What is the relationship between a CSI snapshot, a Velero backup, and an application-consistent backup? Which one protects which failure mode?

  13. Q13. Explain the difference between a liveness probe and a readiness probe. Give one example where each should be used, and one example where each should be misused.

  14. Q14. A 5-node kubeadm cluster loses two control-plane nodes simultaneously: etcd is at 3 of 5 members, so quorum is preserved, but `kubectl get nodes` returns a connection refused. Describe the evidence you would collect, the order in which you would investigate, and the recovery actions you would take.

    Three-node etcd cluster inside the control plane, two of the three control-plane nodes are unreachable. The remaining control-plane node serves API requests for a while, then refuses connections.

  15. Q15. A 200-replica Deployment's Pods are CrashLoopBackOff after a rolling update. The application logs show the new container version panicking on startup: `FATAL: config file not found`. The ConfigMap mounted as a file is empty. Describe the diagnostic, the remediation, and the prevention.

    Standard stateless web tier. The new image references a config file path that does not exist in the ConfigMap. The ConfigMap has been updated for the new version of the application but the volume mount in the Deployment spec was not updated.

  16. Q16. Which kubectl command simulates a server-side apply without persisting anything?

  17. Q17. Which of the following is the recommended way to ship a Secret to a production workload?

  18. Q18. A namespace has the `pod-security.kubernetes.io/enforce: restricted` label. A Pod spec requests `securityContext.privileged: true`. What happens?

  19. Q19. A Service of type `LoadBalancer` is created on a bare-metal cluster without MetalLB. What happens?

  20. Q20. A DaemonSet with `updateStrategy.type: RollingUpdate` and `maxUnavailable: 0` guarantees zero-downtime rollouts of node-local agents.

  21. Q21. Describe the kubeadm upgrade sequence for a 3-node control plane. Include the pre-upgrade safety checks.

  22. Q22. What is the production difference between `kubectl auth can-i list pods -n prod` and `kubectl auth can-i list pods -n prod --as=system:serviceaccount:prod:deployer`? Why does this distinction matter?

  23. Q23. Why does the production reading of `kubectl describe pod` come before `kubectl logs`? List three pieces of evidence each gives that the other does not.

  24. Q24. A Pod is in `Running` state but every health check from the load balancer is failing. The Pod's readiness probe is configured against `/healthz` and the container is returning HTTP 503. The Service routes traffic to the Pod. Describe the diagnostic, the likely root causes, and the remediation.

    A stateless API tier, version 7.2, deployed as a Deployment with 6 replicas. Rolling update to version 7.3 succeeded; replicas are 6. The load balancer health check fails for all 6. The container logs are full of HTTP 503 responses from the readiness endpoint.

  25. Q25. A cluster has just lost its only etcd member. etcd had three members; one failed hardware; one is in a quorum- losing partition; one is healthy. Describe the recovery.

    3-member etcd cluster. Members A, B, C. A is dead (hardware failure). B is partitioned (network outage). C is healthy but quorum is 1 of 3 — etcd refuses writes.

  26. Q26. Which of the following is the most appropriate storage class for a high-IOPS PostgreSQL database?

  27. Q27. A coreDNS Pod is OOMKilled every few hours. The cluster has 5,000 Services and 30,000 Pods. What is the most likely fix?

  28. Q28. A pod's `priorityClassName: system-cluster-critical` guarantees it will never be evicted from a node.

  29. Q29. What does the production reading of `kubectl get events --sort-by=.lastTimestamp -A` tell you that `kubectl describe` on individual objects does not?

  30. Q30. A Security team reports that a Pod in the `payments` namespace is making outbound connections to an unknown IP address. Describe the immediate response and the follow-up.

    Anomalous outbound traffic from a Pod in `payments`. The Pod is part of a Deployment called `payment-gateway`. The Pod IP is 10.244.1.42. The destination IP is 198.51.100.99.

  31. Q31. A 9-replica Deployment carries one topology spread constraint: `maxSkew: 1`, `topologyKey: topology.kubernetes.io/zone`, `whenUnsatisfiable: DoNotSchedule`. The cluster has three zones with three nodes each and ample free capacity everywhere. The three nodes in zone-c were cordoned an hour ago for firmware work. What happens when the Deployment is rolled out?

  32. Q32. Namespace `team-b` has a ResourceQuota setting `requests.cpu: "20"`, `requests.memory: 40Gi`, and `limits.memory: 80Gi`. There is no LimitRange. A team applies a Deployment that works in another cluster and whose containers declare no `resources` block at all. The Deployment object is created without error. What does the operator see next?

  33. Q33. A Deployment runs 4 replicas, each container requesting `cpu: 500m`. Its HPA targets `averageUtilization: 60` on CPU with an otherwise default spec. Metrics Server reports a steady 450m of CPU per Pod. What does the HPA compute, and how quickly does it act?

  34. Q34. A node group sits at 40 nodes with average request-based utilisation of 30%. The Cluster Autoscaler is running with default scale-down settings and no node has been removed for weeks. Which of the following, present on a node, prevents that node from being removed?

  35. Q35. A Pod in namespace `web` resolves `api.example.com` on every request. tcpdump on the node shows four DNS queries per resolution, three of them NXDOMAIN. Which change removes the amplification without breaking resolution of the in-cluster short name `billing`?

  36. Q36. A ConfigMap named `app-config` is mounted as a volume at /etc/app in a 12-replica Deployment and also supplies two environment variables. An operator applies the ConfigMap with new values and watches `kubectl get pods`. What happens?

  37. Q37. A `helm upgrade` of a 40-object chart fails because one Deployment never becomes ready. The release is left in `pending-upgrade`, roughly half the objects are on the new version, and the next `helm upgrade` refuses to run. Which flag on the original command would have prevented that state?

  38. Q38. An Argo CD Application manages namespace `prod-web` with `syncPolicy.automated` set, `selfHeal: false`, and `prune: false`. During an incident an engineer runs `kubectl scale deployment/web --replicas=20`. Git still says 6. What does Argo CD do?

  39. Q39. A bare-metal cluster runs MetalLB in L2 mode. The Ingress controller Service of type LoadBalancer holds 198.51.100.10 and its 6 replicas are spread across 6 nodes. At 3 Gbit/s of ingress one node's NIC saturates while the other five sit near idle. Why?

  40. Q40. A Go service with `requests.cpu: 200m` and `limits.cpu: 500m` shows a p99 latency of 900 ms against a p50 of 12 ms. `kubectl top pod` reports 180m, the node is at 45% CPU, and `container_cpu_cfs_throttled_periods_total` is rising by about 40 out of every 100 periods. What is happening?

  41. Q41. A worker node loses network at 10:00:00 and its kubelet stops renewing its Lease. kube-controller-manager runs with defaults and the Pods on that node set no tolerations of their own. When do those Pods start being deleted and recreated elsewhere?

  42. Q42. A Pod with `priorityClassName: high-trading` is Pending. Its events read `0/8 nodes are available: 8 Insufficient memory`, followed by `preemption: 0/8 nodes are available: 8 No preemption victims found for incoming pod`. Every node is full of lower-priority Pods belonging to one 8-replica Deployment whose PodDisruptionBudget is `minAvailable: 8`. What is the fix?

  43. Q43. Two tenants separated by namespaces, per-tenant RBAC, ResourceQuota, and a default-deny NetworkPolicy still share the node kernel and every cluster-scoped object, including CustomResourceDefinitions and PersistentVolumes.

  44. Q44. `kubectl drain node-7` evicts the node's DaemonSet Pods along with everything else running on it.

  45. Q45. Running the VPA in `updateMode: Auto` on the same Deployment as an HPA that targets CPU utilisation produces an oscillation, and the combination is not supported.

  46. Q46. cert-manager renews a certificate by rewriting the same Secret, so a server that reads its key material once at start-up will go on serving the expired certificate after the renewal has succeeded.

  47. Q47. A Helm release's revision history lives in the cluster as Secrets in the release namespace, so deleting those Secrets during a tidy-up breaks `helm rollback` and `helm history`.

  48. Q48. With `imagePullPolicy: IfNotPresent` and an image referenced by the tag `:2.4`, two nodes running Pods of the same Deployment can be running different image contents.

  49. Q49. The Cluster Autoscaler decides that a node is underutilised from the sum of its Pods' resource requests, not from the node's measured CPU and memory usage.

  50. Q50. A tenant namespace has both a LimitRange and a ResourceQuota. Describe the order in which admission applies them to a new Pod, what each contributes, and what breaks if the LimitRange is removed.

  51. Q51. Compare `podAntiAffinity` with `topologySpreadConstraints`. Give one case where anti-affinity is the correct tool, one where topology spread is, and explain what each costs the scheduler at 500 replicas.

  52. Q52. Trace what a Pod in namespace `web` does to resolve `billing`, and then `api.example.com`, with the default resolv.conf. Name two production mitigations for the latency the second lookup adds.

  53. Q53. At 02:14 an engineer ends an outage by running `kubectl set image deployment/api api=api:2.4.7` in a cluster reconciled by Flux. Service is restored. Describe what must still happen before the incident can be closed, and why each step matters.

  54. Q54. Distinguish the HPA, the VPA, and the Cluster Autoscaler: the signal each consumes, the object each mutates, and two combinations that conflict.

  55. Q55. What must be true before a Kubernetes maintenance window opens, and what evidence closes it? Name the artefacts an auditor would expect to find afterwards.

  56. Q56. A 40-node cluster costs 30% more each month than the capacity model predicted. Request-based utilisation across the pool averages 34%, measured usage averages 11%, and the Cluster Autoscaler has not removed a node in six weeks. No Pod is Pending and nothing is alerting. Describe the investigation, the remediation, and the guardrails you would leave behind.

    One node group, minimum 6, maximum 60, currently sitting at 40. Cluster Autoscaler with default flags. Workloads are 90% Deployments; a logging DaemonSet runs everywhere and a Prometheus StatefulSet uses an emptyDir for its TSDB. Several Deployments were copied from a template that requests 4 CPU and 8Gi per container.

  57. Q57. A cluster built with kubeadm 361 days ago starts losing workers: three go NotReady at 03:04, eleven more by 03:40. The control plane is healthy and kubectl works from the admin kubeconfig. The kubelet log on an affected node repeats `Unable to register node ... x509: certificate has expired or is not yet valid`. Describe the response.

    kubeadm cluster, three control-plane nodes and sixty workers. Kubelet certificate rotation is enabled but has never been verified. The estate was powered off for a two-week site maintenance shutdown that spanned the rotation window, and the nodes have been failing in the order they were powered back on. Pods are draining as nodes are tainted unreachable.

  58. Q58. In a shared 24-node cluster the `analytics` namespace launches a 300-Pod batch job at 09:00. By 09:12 Pods in `payments` are Pending with Insufficient cpu, the payments HPA cannot add replicas, and CoreDNS has been evicted on four nodes. Describe the immediate response and the governance you would put in place afterwards.

    Soft multi-tenancy: one namespace per team with its own RBAC, but no ResourceQuota, no LimitRange, and no PriorityClasses beyond the built-in system ones. All 24 nodes are a single pool. `payments` runs twelve Deployments; `analytics` runs batch Jobs whose containers declare no resources at all. Both teams own their manifests.

  59. Q59. A checkout service's p99 rises from 140 ms to 2.6 s two days after the cluster grew from 20 to 60 nodes. The errors are `context deadline exceeded` on calls to `payments.payments.svc.cluster.local`. CoreDNS reports its own p99 at 8 ms and is not restarting. Describe the investigation and the fix.

    Sixty nodes, roughly 4,000 Pods, 700 Services. CoreDNS is a two-replica Deployment with the default Corefile and no NodeLocal DNSCache. The checkout service resolves several external payment providers on every request as well as the in-cluster payments Service. dmesg on the busiest nodes shows a rising count of `nf_conntrack: table full, dropping packet`.

  60. Q60. A `helm upgrade` from chart 4.2.0 to 5.0.0 completes and reports the release `deployed`. All eight Pods are Running and Ready, no container has restarted, and the Deployment reports 8/8. The Ingress returns 503 for every request. Describe the diagnostic path and the remediation.

    Chart 5.0.0 changed its fullname helper, so Helm created a Deployment named `api-server` labelled `app.kubernetes.io/name: api` and deleted the old Deployment named `api`, which was labelled `app: api`. The chart's own Service was renamed with it. Production traffic arrives through an Ingress that routes to a Service called `api-legacy`, hand-written outside the chart during last year's migration, whose selector is still `app: api`.

Passing score: 80%. Answers are checked in this browser.

Kubernetes for Production Sysadmins — Final Assessment

The final assessment has fourteen sections. Each section opens with production reasoning the student should be able to demonstrate from memory, followed by questions that exercise it. A passing score is 80%.

The theory is closed-book. The scenarios are open-book and open-shell: what matters is the evidence you capture and the reasoning you show. Every scenario answer should include:

  • the symptom and its impact
  • the evidence you collected, in order
  • the most likely root cause, with justification
  • the remediation you applied
  • the verification you used to confirm recovery
  • the rollback you kept ready if the fix did not work

A high-quality answer is specific, references the API objects involved, and identifies a concrete change in the operator’s practice. An answer that names a controller without naming the object it watches is incomplete; an answer that names the object without naming the controller is incomplete.

Section 1 — Control Plane and Reconciliation

The control plane is the cluster’s brain: kube-apiserver holds every object and is the only component that talks to etcd; kube-scheduler filters and scores nodes for every unscheduled Pod; kube-controller-manager runs the ReplicaSet, Node, EndpointSlice, ServiceAccount, Job, and dozens of other control loops. Reconciliation is the operating model — observed state drives toward desired state via control loops, and every production action is best understood as “set the desired state correctly and let the controllers converge”. HA means three (or five) control-plane nodes behind a load balancer; quorum loss in etcd is unrecoverable without restoring from a snapshot.

A passing student reasons about the control plane as one system: a Deployment manifest does not “create” Pods — it changes the desired state, the Deployment controller creates a ReplicaSet, the ReplicaSet controller creates Pods, the scheduler binds them, the kubelet runs them, kube-proxy programs the data plane, and CoreDNS publishes the Service endpoints. Every failure in that chain shows up as Pods not Ready, not as an “error” anywhere.

Section 2 — Workloads and Pod Lifecycle

Pods have phases (Pending, Running, Succeeded, Failed, Unknown) and containers have states (Waiting, Running, Terminated). A Pending Pod is a scheduling problem; a CrashLoopBackOff is an application or configuration problem; an OOMKilled is a memory problem. Three probe kinds matter: liveness (restart the container when stuck), readiness (route traffic only when the container can serve it), startup (give the container time to initialise before liveness kicks in). Probes are per-container, not per-Pod.

Deployments are stateless; StatefulSets carry stable identity (ordinal, DNS, per-Pod storage); DaemonSets run one Pod per node; Jobs run to completion; CronJobs schedule Jobs. Each workload has a different rollout discipline: Deployments do rolling updates, StatefulSets do ordered updates (with PDB guards), DaemonSets do node-by-node rollouts, Jobs do retry policies. Production anti-patterns include running stateful workloads on Deployments, missing requests, missing probes, and missing PodDisruptionBudgets.

Section 3 — Networking and Services

The Kubernetes networking model promises: every Pod gets a routable IP; Pods can reach every other Pod without NAT; agents on a node can reach Pods without NAT; Pods in a cluster can reach every other Pod without NAT; the IP a Pod sees for itself is the IP others see for it. CNI implements the first link; kube-proxy implements Services (iptables, IPVS, or eBPF); CoreDNS implements name resolution. The Service API has four flavours: ClusterIP (in-cluster), NodePort (each node, high port), LoadBalancer (cloud-provisioned), and ExternalName (DNS CNAME).

Gateway API is the modern replacement for Ingress: explicit roles (infrastructure provider, cluster operator, application developer), CRDs instead of annotations, cross-namespace routing, and traffic splitting as first-class primitives. NetworkPolicy is namespace-scoped L3/L4 policy: default behaviour with no policy is allow-all, and the smallest default-deny is one empty podSelector policy. NetworkPolicy depends on the CNI enforcing it — Flannel does not.

Section 4 — Storage

Storage in Kubernetes flows from CSI through StorageClasses to PVCs to Pods. The StorageClass names a provisioner and parameters (fsType, type, iopsPerGB, encrypted); the StorageClass default flag avoids storageClassName on every PVC. A PVC is bound to a PV by the PV controller; the Pod mounts the PVC. Volume expansion is a StorageClass capability (allowVolumeExpansion: true) and a CSI driver capability (online or offline). Snapshots are CSI snapshots — they are crash-consistent by default and application-consistent only if the application (or an operator helper) flushes.

Stateful workloads (databases, message queues, key-value stores) belong on StatefulSets with per-Pod PVCs. A StatefulSet alone is not a backup — volumeClaimTemplates create PVCs, but the application data inside them needs an application-consistent backup. Backups of stateful workloads usually combine CSI snapshots (for fast recovery) with application-level dump tools (for point-in-time and logical restores).

Section 5 — Security and RBAC

Authentication is who you are (certificates, bearer tokens, OIDC, ServiceAccount tokens, webhooks); authorization is what you can do (always RBAC in production, never ABAC or legacy-Authorizer); admission is what we let you change it to (built-in plugins plus webhooks). Pod Security Standards replaces PodSecurityPolicy with three namespace profiles (privileged, baseline, restricted); restricted is the goal. Secrets deserve their own discipline: encryption-at-rest in etcd, RBAC on get/list of Secrets, no Secrets in environment variables, External Secrets Operator for the things that should never live in etcd.

ServiceAccounts are the Pod’s identity. Default ServiceAccounts carry no rights by default but still expose a token via automount; production workloads should disable automount (automountServiceAccountToken: false) when not needed and otherwise bind narrowly scoped Roles. Supply chain is the last leg: tag → digest pinning, vulnerability scanning, image signing (Cosign, Notary v2), SBOM, admission policies that reject unsigned images.

Section 6 — Observability

A production cluster emits three signals: metrics, logs, and traces — and three object-state streams: Kubernetes events, audit logs, and controller-runtime logs from kube-scheduler, kube-controller-manager, and kubelet. Metrics Server feeds kubectl top and HPA. kube-state-metrics turns Kubernetes object state into Prometheus metrics (Deployment replicas, Node Ready, PVC phase, Pod restart count). Prometheus scrapes kube-state-metrics, the kubelet, CoreDNS, and the application workloads. Loki ships and indexes logs; Tempo stores traces; Grafana dashboards tie them together.

Alerting discipline: alert on user-visible symptoms and recovery actions, not on internal-state noise. Top-tier alerts on a cluster: API server 5xx, etcd cluster size less than quorum, kubelet certificate expiry < 30 days, Node NotReady

15 minutes, Deployment AvailableReplicas < DesiredReplicas, PVC Phase Pending > 10 minutes. Avoid alert storms on per-Pod restarts; aggregate.

Section 7 — HA and Upgrades

HA for the control plane means three (or five) nodes behind a load balancer, etcd quorum = 2 (or 3) of 3 (or 5), and leader-elected controller-manager and scheduler. A worker node failure is a pod-replacement problem, not a control-plane problem. Loss of one etcd member in a 3-member cluster is survivable; loss of two is not (quorum loss); recovery requires restoring from snapshot.

Upgrades follow kubeadm’s strict sequence: control plane first (one node at a time, with etcd backup before each), then workers (drain, upgrade kubelet, uncordon; surge a new node and decommission the old for zero-impact rollouts). Version skew is bounded: kubelet must be within three minor versions of the API server, kubectl within one. API deprecation is caught with pluto and kubent against the manifests before the upgrade; CI gates prevent the deprecated API from shipping in the first place.

Section 8 — Disaster Recovery

A backup strategy covers three things: cluster state (etcd snapshot, ideally daily with hourly incrementals and 30-day retention); workload configuration (the Git repo, plus a Velero backup of namespace resources); persistent data (CSI snapshots and application-consistent exports, ideally to a separate bucket and account). Velero is the canonical tool for namespace-scoped backup of resources; it does NOT backup PV contents unless paired with a CSI snapshotter or Restic / Kopia.

Recovery is two distinct exercises. Restore means rebuilding the same cluster onto the same hardware. DR means rebuilding onto different hardware (or a different region) when the primary is gone. Etcd restore: stop the control plane on every node, run etcdutl snapshot restore on each member with its own --name and --initial-advertise-peer-urls plus the shared --initial-cluster, restart etcd, restart kube-apiserver, verify. Validate the restored cluster: API reachable, all nodes Ready, Pods Scheduled, no PVCs Pending. Schedule game days monthly; an untested backup is a wish.

Section 9 — Scheduling, Placement and Node Lifecycle

Scheduling is a two-phase decision: filtering removes the nodes that cannot host the Pod (insufficient allocatable capacity, an unmatched nodeSelector or nodeAffinity, an untolerated taint, a PVC bound to the wrong zone), then scoring ranks whatever survives. Placement policy is written with nodeAffinity (which nodes), podAffinity and podAntiAffinity (which neighbours), and topologySpreadConstraints (how evenly across a domain). maxSkew is an imbalance budget measured against the least populated domain, and whenUnsatisfiable: DoNotSchedule turns that budget into a hard admission rule, so an empty or unschedulable domain will wedge an entire rollout.

Node lifecycle is the other half. The kubelet renews its Lease every ten seconds; the node controller declares Ready=Unknown after —node-monitor-grace-period (40s by default) and taints the node node.kubernetes.io/unreachable:NoExecute; Pods leave 300 seconds later under the toleration that admission gave them. Under memory, disk, or PID pressure the kubelet evicts locally instead, ranked by QoS class and by usage above requests. A passing student can look at a Pending Pod, a NotReady node, and an evicted Pod and say which of those three systems produced it, and therefore which knob changes the outcome.

Section 10 — Multi-Tenancy and Resource Governance

A namespace is a naming and policy scope, not a security boundary. Soft multi-tenancy is four things working together: RBAC per tenant, a default-deny NetworkPolicy, ResourceQuota for the budget, and LimitRange for the defaults that make the budget enforceable. A quota on requests.cpu rejects every Pod that does not declare a CPU request, so the LimitRange that supplies the default is what keeps the tenant’s existing manifests working. PriorityClass decides who wins when the budget runs out, and preemption is bounded by the PodDisruptionBudgets of the candidate victims.

What a namespace does not isolate matters as much as what it does: the node kernel, the container runtime, and every cluster-scoped object — CustomResourceDefinitions, PersistentVolumes, StorageClasses, ClusterRoles — are shared, along with the control plane itself. Hard multi-tenancy means separate clusters, or virtual control planes such as vCluster, plus policy enforcement with Kyverno or a ValidatingAdmissionPolicy and a restricted Pod Security Standard. A passing student can state which risks the namespace stack retires and which it merely documents.

Section 11 — Packaging, GitOps and Declarative Delivery

Helm renders YAML from values and records each release as a revision stored in Secrets in the release namespace, which is what helm rollback reads and what a Secret-pruning job destroys. Kustomize patches plain YAML with no template language, and its configMapGenerator appends a content hash to the generated name so that changing configuration changes the Pod template and therefore triggers a rollout — the exact failure a hand-written ConfigMap has, where the data changes and nothing restarts. helm upgrade —atomic rolls a failed release back instead of leaving it half-applied; unpinned chart versions and floating image tags are the two packaging habits that destroy reproducibility.

GitOps closes the loop: Git holds the desired state and Argo CD or Flux reconciles the cluster toward it. Drift is the central operational concept — an out-of-band kubectl edit leaves the Application OutOfSync, and self-heal decides whether the controller reverts it or waits for a human. Every emergency change made with kubectl is a debt against the repository, and it is paid back by committing the same change before the incident is closed. A passing student treats an uncommitted hotfix as an open incident action, not as a fix.

Section 12 — DNS, TLS and the Cluster Edge

CoreDNS answers from the Corefile plugin chain, and the Pod resolv.conf ships ndots:5, so any name with fewer than five dots walks the search path first — several NXDOMAIN round trips for one external hostname. The mitigations are NodeLocal DNSCache as a DaemonSet, fully-qualified names or a trailing dot, dnsConfig options that lower ndots, and enough CoreDNS replicas with the cache plugin tuned. Watch conntrack as well: UDP DNS at scale exhausts the node’s table before CoreDNS itself struggles. On bare metal there is no cloud controller to allocate a LoadBalancer address, so MetalLB in L2 mode elects one node to answer ARP for the VIP (failover, not distribution) and BGP mode peers with the routers for ECMP across nodes.

TLS at the edge is managed, not manual. cert-manager turns a Certificate into a CertificateRequest, an Order, and a Challenge, and writes the result into a Secret that the Ingress controller or Gateway reads; the issuer may be ACME, an internal CA, or Vault PKI. Renewal rewrites the same Secret in place, so a workload that loads its key material once at start-up needs a watcher or a reload path or it will serve an expired certificate. Registries are the other edge: pull-through caches for availability, namespace-scoped imagePullSecrets, and digests rather than tags for reproducibility.

Section 13 — Capacity, Autoscaling and Performance

Three autoscalers act on three different signals. The HPA changes the replica count from a metric, computing desired replicas as the current count multiplied by the ratio of current to target and rounded up, immediately on the way up and after a 300-second stabilisation window on the way down. The VPA changes requests and limits from observed usage, and applying them means evicting the Pod. The Cluster Autoscaler changes the node count, and it reasons about the sum of Pod requests against allocatable — never about measured usage, which is why an over-requested, idle fleet never shrinks.

Performance work starts where capacity planning ends. A CPU limit is a CFS quota granted every 100 ms, so a container can be throttled hard while its 30-second average looks idle; container_cpu_cfs_throttled_seconds_total is the evidence, not kubectl top. Memory limits have no such elasticity — the kernel OOM-kills at the limit and the restart is the only symptom. Storage appears as tail latency rather than as errors, and the network as retransmits, dropped conntrack entries, and retries. A passing student names the metric that proves a bottleneck before changing a single field in a manifest.

Section 14 — Troubleshooting Method and Production Architecture

The method is the deliverable: state the symptom and its impact, inspect the object, read the events, read the logs, map the dependencies, name the component responsible, form one hypothesis, test it, restore service, validate against the user-visible path, and write it down. Evidence is collected before anything is changed, and restoration precedes root cause whenever users are affected. The production anti-patterns are the inverse of that method: no requests, no probes, no PodDisruptionBudget, floating tags, cluster-admin everywhere, manual changes with no repository behind them, and a backup nobody has ever restored.

Production architecture is the sum of the preceding thirteen sections: three control-plane nodes across three failure domains behind a load balancer, separate worker pools for infrastructure and application workloads, topology spread on every critical Deployment, a CNI that actually enforces NetworkPolicy, CSI-backed storage with tested snapshots, an observability stack that alerts on symptoms rather than on internal state, and a change process with pre-change gates, canary fleets, and a post-incident review that produces an artefact. A passing student can defend each of those choices and say what it costs.