👨🏻 Brother Talk — Phase 07, Off the Record

No slides, no certification blueprint. This is me, your brother, telling you the things people only say after the second coffee. Read it once now, and again the week before your interview.


Listen. Containers are the part of the stack everyone thinks they understand because they've run docker build and kubectl apply a hundred times. And that's exactly why this phase matters: the gap between "I can run the commands" and "I understand the mechanism" is invisible until a senior architect asks you one question and watches you reach for the portal instead of the model. Let me save you that moment.

Here's the secret the whole phase turns on: an image is content named by a hash, and a tag is just a sticky note pointing at it. Once that clicks, you stop being surprised. You stop being surprised that two big images barely grow the registry (same layers, stored once). You stop being surprised that deleting a thousand tags frees nothing (you deleted the sticky notes, not the boxes). You stop being surprised that :latest "changed by itself" (someone moved the sticky note). The engineers who panic at these are the ones who memorised commands. The ones who shrug and say "yeah, content addressing, that's expected" are the ones who get the staff offer. The difference is one mental model, and you're building it this week.

So let me give you the mindset shifts, brother to brother.

Stop deploying tags. Deploy digests. I mean it. app:latest in a production manifest is a loaded gun pointed at a future incident, because a tag is mutable and someone will re-push it — a teammate, a CI job, a "quick fix" at 4 p.m. on a Friday. When you pin app@sha256:1d4f…, you've turned "what's running" from a question into a fact. The first time you debug an outage and can say "the running digest is X, the tag now points at Y, here's exactly when it diverged" — while everyone else is guessing — you'll feel the room shift. Digests are how you make "what's deployed" legible. Legibility is seniority.

Garbage collection is where careful people get burned, so respect it. The instinct "delete old stuff to save money" is right; the execution is where it goes wrong. Deleting tags doesn't reclaim bytes — GC does, and GC only sweeps what no live image references. The flip side is the scarier one: run an over-eager purge without understanding reachability and you can delete a base layer ten current images depend on, and now nothing pulls. The principal move is to know the closure: which blobs are exclusive to the thing you're deleting, and which are shared. The lab makes you compute that closure by hand. Do it until it's boring, because the day you run a real acr purge you want it to be boring.

Fall in love with the boring force again: a Pending pod is not a mystery. This is the single most common thing you'll debug on a cluster, and ninety percent of engineers treat it like weather — they stare at the dashboard, restart things, scale up randomly. Don't be them. A Pending pod is arithmetic: the scheduler packs by requests against allocatable capacity, under taints. kubectl describe pod, read the Events, and it literally tells you: Insufficient cpu (the requests don't fit) or untolerated taint (the node pool is reserved). That's it. Those are the two answers. When the room is panicking about "why won't it schedule," and you calmly read the describe output and say "the committed requests on every node already sum to allocatable — we're not out of CPU, we're out of requestable CPU; right-size the requests or add a node" — you're not smarter than them. You just read the machine instead of the dashboard. That's the whole flex.

Learn the requests-vs-limits distinction cold, because almost nobody has. Requests are what the scheduler uses to place; limits are what the kubelet uses to enforce. CPU over the limit gets throttled; memory over the limit gets OOM-killed — silently, brutally, at 3 a.m. The relationship between them sets your QoS class, which decides who gets evicted first when a node runs out of memory. If you set limits but not requests, you've quietly opted into BestEffort and you'll be the first one killed. Most "random restarts" and "the pod just disappeared" tickets are an OOM-kill or an eviction nobody understood. Understand it, and you fix in five minutes what costs other teams a week.

Don't put everything on Kubernetes because it's the cool one. This is a career-shaping judgment call, not a tech preference. AKS is a platform — you own node pools, upgrades, the whole sprawling Kubernetes surface, and the on-call that comes with it. For a bursty queue worker that's idle half the day, Azure Container Apps with scale-to-zero costs nothing overnight and you run no cluster. For a nightly batch, ACI spins up one container and bills by the second. The engineer who reflexively reaches for AKS for everything is the one whose team is perpetually busy operating infrastructure that a managed service would have run for free. Naming the operability/cost dial out loud — "this doesn't need a cluster, it needs scale-to-zero" — is exactly the principal-level judgment the interviewer is listening for.

The honest truth about this phase's difficulty: it's not deep, it's deceptively simple. The whole thing is a hash function and some set operations and a bin-packing loop. There's no scary math. The difficulty is that the simplicity hides behind a mountain of tooling — Docker, BuildKit, OCI, ACR, AKS, kubelet, scheduler, KEDA — and most people learn the tools and never extract the model. You're doing it backwards on purpose: build the 30-line registry and the 15-line scheduler, watch dedup and Pending emerge from nothing, and then every product is just "oh, this is that model with a billing page and a portal."

One more thing, and it's the one that lasts. The reason we obsess over digests and immutability and supply chain isn't pedantry — it's that containers are how code gets from your laptop to production, and that path is exactly where attackers and accidents live. A poisoned base image, a re-pushed tag, an unsigned manifest — these are real breaches that have hit real companies. When you pin digests, sign manifests, scan for CVEs, pull with a managed identity instead of a password, and rebuild automatically when a base CVE drops, you're not checking compliance boxes. You're being the person who made the supply chain defensible. That person is who the org trusts with production. That's the ladder.

Go build the registry and the scheduler. Then come find me in Phase 08 — that's where we take these digests and wire them into a CI/CD pipeline with approval gates and OIDC federation, and the "secure supply chain" stops being a buzzword and becomes a thing you can draw.

— your brother 👨🏻