KidsCast Native (Podcast)
A cartoon podcast from the Duvall lab, made for kids and anyone else who likes a thing explained by its own shape. Waku the orca hosts. One cloud-native or AI concept per episode, two to five minutes, explained through a character built from the thing's own shape. Literalism, not decoration.
Made entirely on the lab's own machines: the rig is Python and Pillow, the narration is a built-in system voice, the cut is ffmpeg. No studio, no stock footage, no third-party player. Waku is drawn in curves; everything he explains is drawn in facets, so you always know who is narrating and who is being narrated about.
The logo
The same crayon lettering the title uses, with the backwards K. In the SVG the letters are outlines, not text, so it looks right whether or not you have the handwriting font installed.
SVG · PNG 1024 · PNG 2048 · PNG 4096
PNGs have a transparent background and sit on light or dark. Please don't restretch it, recolour it, or straighten the letters — the wobble is the point.
Episode 1: ConfigMap vs Secret
Two identical objects, same shape, same place in the cluster. One is called a ConfigMap and reads its own contents out loud, because that is the job. The other is called a Secret and wears a mask. Waku takes the mask off with one command and reads the password out loud. Then the room does what the mask could not: encryption at rest, RBAC, and a lid on the logs. Nothing about the Secret changes. The only thing that moved was the building.
The costume matters. A lockbox or a redacted face would teach the exact falsehood the episode exists to kill. From the Kubernetes documentation, checked the day this was made: Secrets are, by default, stored unencrypted in etcd, and anyone with API access can retrieve or modify one. Base64 is a disguise anybody can take off, so the costume is a mask.
Transcript
These two are the same object.
Same shape, same size, same place in the cluster. One of them is called a ConfigMap. The other one is called a Secret. That is very nearly the whole difference, and the rest of this is about the word "nearly."
Here is the ConfigMap. It will tell you what it holds if you ask. Database host, postgres dot prod. Log level, info. Feature flag, on. It is not being careless. That is the job. A ConfigMap exists so that configuration lives outside your container image, where you can change it without rebuilding anything.
Here is the Secret. Same body. It is wearing a mask.
The mask is the interesting part, so let us take it off.
That is it. That is the whole mask. kubectl get secret, dash o yaml, and the value comes back as base64. One more command and it is a password again, out loud, in your terminal, in your shell history.
Base64 is not encryption. It is not a lock, it is not a safe, it is not a vault. It is an encoding, and it exists so that binary data survives being written into a text file. Anyone can undo it. Everyone can undo it. There is no key.
And the Secret is fine with this, because the Secret was never the security. Read the Kubernetes documentation and it says so in a warning box: Secrets are, by default, stored unencrypted in the API server's underlying data store. Anyone with API access can retrieve or modify a Secret. Anyone who can create a pod in a namespace can read every Secret in that namespace.
So what actually protects it?
Not the object. The room.
Turn on encryption at rest, and the floor under etcd goes solid, so a stolen disk is no longer a stolen password. Write RBAC rules, and the doorway narrows, so most of the things that could have asked can no longer ask. Keep Secrets out of your logs and out of environment variables where a crash dump will find them, and put a lid on it.
None of that changes the Secret. The Secret is identical at the end of this. Still the same body, still wearing the mask, still perfectly readable to anyone standing close enough.
The only thing that moved was the building.
So use a Secret, because it is the right object and it signals intent to every human who reads your manifests. Just do not mistake the label for the protection. A Secret tells the cluster this value is sensitive. It does not tell the cluster to keep it.
How it was made
The script was written first and measured against a narration pace, not guessed. Each paragraph is narrated separately so every beat has an exact start time, and the RMS envelope of the finished track drives Waku's jaw, so the mouth closes between syllables instead of gaping. The characters are parts, not poses: a pose is a dictionary of numbers, and the same eight orca parts from the first probe draw every frame here. The twins, the mask, the doorway, the floor, and the lid are polygons on the same canvas. Frames are piped straight into ffmpeg; nothing touches a disk until the mp4 does.
Episode 2: Pod
Kubernetes will not run a container for you. Not one, not ever. It runs Pods, and a Pod is a husk that sits there doing nothing interesting until it opens. When it does, the containers are inside, and the teaching is the shape: everything in there shares one address, shares storage, and shares a fate. The Pod starts, they all start. The Pod dies, they all die.
This is a thing-episode, so the character is the concept — no room, no props, just the object changing shape. The sidecar rides along. The Pod gets replaced rather than repaired, because Pods are not pets, and the payoff is the part people find rude: you almost never make one yourself. A Deployment does it for you, and everything above a Pod is a nicer way of asking for one.
Transcript
Everybody says containers. Containers this, containers that. Here is the strange part. Kubernetes will not run a container for you. Not one. Not ever.
It runs these instead. This is a Pod. It is the smallest thing Kubernetes knows how to put on a machine.
So what is a Pod? Looks like a seed pod. Sits there. Does nothing interesting. Until you open it.
There they are. Containers. A Pod is a wrapper, and the containers live inside it.
Now here is the thing worth remembering. Everything in that Pod shares one address. One IP. They talk to each other on localhost, like neighbours sharing a hallway.
They share storage too. Mount a volume into the Pod and every container inside can reach the same files.
And they share a fate. The Pod starts, they all start. The Pod dies, they all die. Nobody gets left behind and nobody survives alone.
Most of the time a Pod holds exactly one container. That is normal. That is boring. Boring is good.
Sometimes there is a second one, riding along. A sidecar. It ships the logs, or handles the traffic, so the main container can do one job well.
Now the part people find rude. Pods are not pets. They get replaced. When one dies, Kubernetes does not repair it. It builds a fresh one.
Which means you almost never make a Pod yourself. You describe what you want, and a Deployment makes the Pods, watches them, and replaces them when they go.
So why learn the Pod at all, if something else builds them? Because everything above it is just a nicer way of asking for one.
A Pod is one or more containers, sharing an address, sharing storage, sharing a fate. That is the whole idea.
Next time somebody says they are running a container, you can be insufferable about it. Kubernetes is running a Pod.
How it was made
A thing-episode needs a rig nothing else can reuse, so the Pod was built from scratch: a husk that splits on a hinge, and containers on independent phases inside it, because three things starting on the same frame read as one object. The first cut of this episode failed the series' own animation gate — a third of the frame given to Waku in a bounded water panel left two thirds of it a still daylight ground, and whole-frame motion fell by a third against Episode 1. The fix was staging, not scoring: wider pod bob and sway, the containers desynchronised, sky drift pushed. Motion came back above Episode 1 without animating background purely to feed the metric, which was the thing worth refusing.
Episode 3: Mesh
Episode 2 named the sidecar and walked straight past it. This one goes back for it. A service calls another service, the second one dies, Kubernetes builds a fresh one somewhere else with a new address, and the first is left calling a house that is not there. Do that a hundred times an hour and you have a volatile environment — not broken, working exactly as designed.
The old answer is that every service learns to cope: each one retries, each one keeps a list, the same logic written a hundred times in nine languages, slightly differently every time. The other answer is to take it out of the service and put it next to the service. A small proxy beside every service, nothing in or out except through it, and the proxies talking to each other. That is a mesh — not a new network, the same network with a layer of doormen laid over it. Then Knative, which scales to zero and makes addresses change constantly by design, and finally agents, which are services that improvise. An agent is unreliable on purpose. Put the retry in the doorman, not in the improviser. And because every call went through a proxy, every call was recorded: you get a map of who actually asked whom, not what an agent said it did.
Transcript
Last time we opened a Pod. Inside were containers, sharing one address, sharing storage, sharing a fate.
One thing in there we named and walked straight past. The sidecar. The second container, riding along, doing a job for the first one.
Today the sidecar does the whole episode.
Start with the problem, because the problem is the interesting part.
A service is a program that sits there, waiting to be asked something.
It runs in a container, inside a Pod, like everything else we have met.
Here is a service. Here is another one. The first needs to ask the second a question.
Easy. It knows where the second one lives. It calls the address. Done.
Now watch what actually happens.
The second one dies. Kubernetes builds a fresh one somewhere else, with a new address.
The first one is still holding the old address. It is calling a house that is not there.
Now do that a hundred times an hour. Things starting. Things stopping. Things moving between machines because a machine got busy.
That is a volatile environment. Not broken. Working exactly as designed. Nothing stays where you left it.
So how does anything find anything?
Here is the old answer. Every service learns to handle it. Each one retries. Each one keeps a list. Each one carries its own map.
That works, and it is a quiet disaster. The same logic, written a hundred times, by a hundred people, in nine languages, slightly differently every time.
And on the day the rule changes, you change it in a hundred places.
Here is the other answer.
Take it out of the service. Put it next to the service.
Every service gets a small proxy standing beside it. A sidecar. Nothing goes in or out except through that proxy.
The service does not know it is there. It thinks it is calling the address directly. It is calling its own doorman.
Now do that everywhere. Every service, its own proxy.
And the proxies talk to each other.
That is a mesh. Not a new network. The same network, with a layer of doormen laid over it.
Now look at what the doormen can do, since every conversation goes through them.
Nobody talks to an address anymore. They talk to a name. The proxy knows where that name lives right now.
The house moved? The proxy already knows. The service never noticed.
Something failed? The proxy retries, and gives up on a clock, so one slow thing cannot pile up behind it and take everything down.
And every proxy knows exactly who it is. Every conversation is encrypted and identified at both ends.
Not "I trust you because you are inside the building." Trust because you proved who you are, on every single call.
There is one more piece, and it is the one that makes it a system instead of a pile of proxies.
The proxies do not decide the rules. There is a control plane. One place where you say what the rules are.
You say it once. Every doorman hears it. That is the whole difference between a mesh and a hundred sidecars.
Now bring in the part that moves fastest.
Knative. Three pieces sitting on top of Kubernetes. Serving, which starts a thing when a request arrives. Eventing, which routes events between them. And functions.
Serving does something that sounds impossible until you see it. It scales to zero.
No traffic, nothing running, nothing costing anything. A request arrives, and the thing comes up to answer it.
Every version is a revision, and a revision is frozen. You never edit one. You make a new one and move traffic to it.
Which means the addresses are not just changing sometimes. They are changing constantly, by design. Things vanish when nobody is asking.
A mesh does not merely tolerate that. That is the environment it was built for.
Network as a service. You stop building the network and start asking for it.
Names, rules, identity, and a record of every call. Handed to you as a thing you request.
And now the part that is actually new.
An agent is a service. It runs somewhere, it answers requests. So far, nothing special.
But agents call other agents. One asks a second to do a piece of work, which asks a third.
And none of them were told the shape of that conversation in advance.
That is a volatile environment made of software that improvises.
Here is why the mesh matters more there than anywhere.
An agent is unreliable on purpose. Allowed to be slow. Allowed to fail. Allowed to change its mind.
If you write the retry logic inside the agent, you are asking the improviser to also be the safety system.
Put it in the doorman instead. The agent improvises. The proxy enforces the timeout, the retry, the limit.
And identity stops being a nicety.
When an agent asks another agent for something, you want to know exactly which one asked. On that exact call. Proved.
Then the last thing, and it is the best one. Every call went through a proxy, so every call was recorded.
You get a map of who asked whom. Not what an agent said it did. What it actually did.
Cloud native spent fifteen years learning how to run things that will not hold still.
Then we built something that will not hold still and argues back.
The strange part is that the answer was already sitting there. It was the second container, riding along, that we walked straight past.
How it was made
Four times the beat count of anything before it — 58 staged beats across six minutes, against 14 in Episode 2 — because at this length an audience notices repetition long before it notices frame rate. Twenty new part functions were needed: the service, the proxy, the empty lot, the control plane, the revisions, the call graph. Pickles' standing note from Episode 2 is finally settled: the hard line dividing the host's panel from the scene is gone, replaced by an actual water tank, so the boundary is a breathing curve with a rim, a specular streak and bubbles climbing the inside rather than a drawn edge.
The series gate cleared on every animation axis — motion up 7% overall against Episode 2, and the useful part is where it came from: character motion up 15% and the host panel up 84% while background motion fell 19%. Episode 2 left an open question about whether whole-frame motion was just rewarding a busy background; this answers it with the split. Thirty probe stills were rendered and inspected before the full render, which caught five faults invisible in the source — the worst being the sidecar sliding behind the Pod husk on the first and last beats, the callback that opens the episode and the payoff that closes it. Every metric was green while that image was broken.
Two kinds of episode
- Thing-episodeThe character is the concept itself, and the teaching comes from the character changing shape. Pod, HelmChart, Service Mesh.
- Room-episodeThe character is static and honest about it. The teaching comes from the environment changing around it. ConfigMap vs Secret, Ingress.
Pod and Service Mesh have aired. Next up, in this order: Deployment, Service, Ingress, HelmChart. The expensive resource is rigs, not frames, so thing-episodes are rationed. Want a concept explained this way? Ask for it.