footer trimmed to the credit line; podman and oc throughout (Containerfile, podman docs links)
This commit is contained in:
+15
-17
@@ -11,7 +11,7 @@
|
|||||||
<p class="kt">Index</p>
|
<p class="kt">Index</p>
|
||||||
<ol>
|
<ol>
|
||||||
<li><a href="#c0"><b>Course 00</b><span>Aperitif - three commands, and what actually just happened</span></a></li>
|
<li><a href="#c0"><b>Course 00</b><span>Aperitif - three commands, and what actually just happened</span></a></li>
|
||||||
<li><a href="#c1"><b>Course I</b><span>Docker - an image is a stack of frozen diffs</span></a></li>
|
<li><a href="#c1"><b>Course I</b><span>Podman - an image is a stack of frozen diffs</span></a></li>
|
||||||
<li><a href="#c2"><b>Course II</b><span>Kubernetes - a cluster is a promise, not a place</span></a></li>
|
<li><a href="#c2"><b>Course II</b><span>Kubernetes - a cluster is a promise, not a place</span></a></li>
|
||||||
<li><a href="#c3a"><b>Course III</b><span>The node - where intent becomes a process</span></a></li>
|
<li><a href="#c3a"><b>Course III</b><span>The node - where intent becomes a process</span></a></li>
|
||||||
<li><a href="#c3b"><b>Course III</b><span>The pod - one IP, shared fate</span></a></li>
|
<li><a href="#c3b"><b>Course III</b><span>The pod - one IP, shared fate</span></a></li>
|
||||||
@@ -52,15 +52,15 @@
|
|||||||
<img class="flat" src="__HERO_SURROUND__"
|
<img class="flat" src="__HERO_SURROUND__"
|
||||||
alt="Six dark armour fragments with neon seams framing a large empty centre - the
|
alt="Six dark armour fragments with neon seams framing a large empty centre - the
|
||||||
casing of a machine caught the instant before it comes apart.">
|
casing of a machine caught the instant before it comes apart.">
|
||||||
<div class="crt" role="img" aria-label="A terminal transcript: docker build, docker push,
|
<div class="crt" role="img" aria-label="A terminal transcript: podman build, podman push,
|
||||||
kubectl apply, kubectl get pods showing Running - then the question: but what
|
oc apply, oc get pods showing Running - then the question: but what
|
||||||
actually just happened?">
|
actually just happened?">
|
||||||
<p class="line">$ docker build -t shop/api:1.4.2 .</p>
|
<p class="line">$ podman build -t shop/api:1.4.2 .</p>
|
||||||
<p class="line ok">=> exported image sha256:9f2c41...</p>
|
<p class="line ok">=> exported image sha256:9f2c41...</p>
|
||||||
<p class="line">$ docker push shop/api:1.4.2</p>
|
<p class="line">$ podman push shop/api:1.4.2</p>
|
||||||
<p class="line">$ kubectl apply -f deploy.yaml</p>
|
<p class="line">$ oc apply -f deploy.yaml</p>
|
||||||
<p class="line ok">deployment.apps/api created</p>
|
<p class="line ok">deployment.apps/api created</p>
|
||||||
<p class="line">$ kubectl get pods</p>
|
<p class="line">$ oc get pods</p>
|
||||||
<p class="line ok">api-7d4b9c6-x2k4f 1/1 Running</p>
|
<p class="line ok">api-7d4b9c6-x2k4f 1/1 Running</p>
|
||||||
<p class="line q">...but what actually just happened?</p>
|
<p class="line q">...but what actually just happened?</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -78,7 +78,7 @@
|
|||||||
<!-- ============ COURSE I ============ -->
|
<!-- ============ COURSE I ============ -->
|
||||||
<section class="course" id="c1" data-scene="docker" aria-labelledby="c1h">
|
<section class="course" id="c1" data-scene="docker" aria-labelledby="c1h">
|
||||||
<header class="chead">
|
<header class="chead">
|
||||||
<p class="eyebrow">Course I · Docker</p>
|
<p class="eyebrow">Course I · Podman</p>
|
||||||
<h2 id="c1h" class="thesis">An image is not a box.<br><em>It is a stack of frozen diffs.</em></h2>
|
<h2 id="c1h" class="thesis">An image is not a box.<br><em>It is a stack of frozen diffs.</em></h2>
|
||||||
<p class="lede">Scroll, and the thing you keep calling "a container image" comes apart in your
|
<p class="lede">Scroll, and the thing you keep calling "a container image" comes apart in your
|
||||||
hands. Four layers. Each one only stores what changed from the layer under it - and here they
|
hands. Four layers. Each one only stores what changed from the layer under it - and here they
|
||||||
@@ -108,17 +108,17 @@
|
|||||||
<p>The builder caches layer by layer, and a cached layer survives only while everything
|
<p>The builder caches layer by layer, and a cached layer survives only while everything
|
||||||
beneath it is unchanged. Put <span class="mono">COPY . .</span> above your dependency
|
beneath it is unchanged. Put <span class="mono">COPY . .</span> above your dependency
|
||||||
install and you have told the builder to throw the dependency cache away every time one
|
install and you have told the builder to throw the dependency cache away every time one
|
||||||
line of code changes. Dependencies first, code last - a Dockerfile is a cache policy that
|
line of code changes. Dependencies first, code last - a Containerfile is a cache policy that
|
||||||
happens to build software.</p>
|
happens to build software.</p>
|
||||||
<p class="fieldnote"><b>Field note.</b> A rebuild that takes twenty minutes and one that
|
<p class="fieldnote"><b>Field note.</b> A rebuild that takes twenty minutes and one that
|
||||||
takes twenty seconds are usually the same Dockerfile with the lines swapped.</p>
|
takes twenty seconds are usually the same Containerfile with the lines swapped.</p>
|
||||||
<p class="closeline">This stack explains the whole ecosystem above it: sharing explains why
|
<p class="closeline">This stack explains the whole ecosystem above it: sharing explains why
|
||||||
pulls are fast, immutability explains why a digest can name the exact bytes (Course VII),
|
pulls are fast, immutability explains why a digest can name the exact bytes (Course VII),
|
||||||
and the throwaway top layer explains why state needs volumes. One idea - frozen diffs -
|
and the throwaway top layer explains why state needs volumes. One idea - frozen diffs -
|
||||||
all the way down.</p>
|
all the way down.</p>
|
||||||
<p class="reads"><b>Pre-reads:</b> none - start here
|
<p class="reads"><b>Pre-reads:</b> none - start here
|
||||||
 <b>Further:</b> <a href="https://docs.docker.com/get-started/">Docker get-started</a> ·
|
 <b>Further:</b> <a href="https://podman.io/get-started">Podman get-started</a> ·
|
||||||
<a href="https://docs.docker.com/build/">Docker build + layers</a></p>
|
<a href="https://docs.podman.io/">Podman docs + builds</a></p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
@@ -146,7 +146,7 @@
|
|||||||
<div class="prose">
|
<div class="prose">
|
||||||
<h3>Desired against actual, forever</h3>
|
<h3>Desired against actual, forever</h3>
|
||||||
<p>The habit underneath everything: the <b>reconciliation loop</b> - compare desired state
|
<p>The habit underneath everything: the <b>reconciliation loop</b> - compare desired state
|
||||||
against actual state, fix the difference, repeat. That <span class="mono">kubectl apply</span>
|
against actual state, fix the difference, repeat. That <span class="mono">oc apply</span>
|
||||||
didn't launch anything; it filed paperwork. The machine took it from there, and it never
|
didn't launch anything; it filed paperwork. The machine took it from there, and it never
|
||||||
stops taking it from there: kill a pod and it returns, not because something noticed the
|
stops taking it from there: kill a pod and it returns, not because something noticed the
|
||||||
crash but because the loop noticed the difference.</p>
|
crash but because the loop noticed the difference.</p>
|
||||||
@@ -340,7 +340,7 @@
|
|||||||
<h2 id="c6h" class="thesis">Nobody deploys anything.<br><em>The cluster syncs itself.</em></h2>
|
<h2 id="c6h" class="thesis">Nobody deploys anything.<br><em>The cluster syncs itself.</em></h2>
|
||||||
<p class="lede">The mental model everyone arrives with: someone with credentials pushes manifests
|
<p class="lede">The mental model everyone arrives with: someone with credentials pushes manifests
|
||||||
at the cluster. In GitOps nothing is pushed. A repository holds the desired state, an agent
|
at the cluster. In GitOps nothing is pushed. A repository holds the desired state, an agent
|
||||||
inside the cluster watches it, and the cluster pulls its own future from git. kubectl is for
|
inside the cluster watches it, and the cluster pulls its own future from git. oc is for
|
||||||
looking; git is for changing.</p>
|
looking; git is for changing.</p>
|
||||||
</header>
|
</header>
|
||||||
<div class="pin">
|
<div class="pin">
|
||||||
@@ -362,7 +362,7 @@
|
|||||||
revision - watch this branch of this repository - and the controller renders what it finds
|
revision - watch this branch of this repository - and the controller renders what it finds
|
||||||
there, compares it against the live cluster, and syncs the difference. The deploy button is a
|
there, compares it against the live cluster, and syncs the difference. The deploy button is a
|
||||||
git commit; the audit log is git log; code review <i>is</i> change control.</p>
|
git commit; the audit log is git log; code review <i>is</i> change control.</p>
|
||||||
<p class="sayit">kubectl apply is for archaeology, not for change.</p>
|
<p class="sayit">oc apply is for archaeology, not for change.</p>
|
||||||
<h3>Pull, not push - the security inversion</h3>
|
<h3>Pull, not push - the security inversion</h3>
|
||||||
<p>The cluster <b>pulls</b>. No CI system, no laptop, no build pipeline holds a credential that
|
<p>The cluster <b>pulls</b>. No CI system, no laptop, no build pipeline holds a credential that
|
||||||
can touch it - the agent inside holds a read-only deploy key, and the trust arrow points out.
|
can touch it - the agent inside holds a read-only deploy key, and the trust arrow points out.
|
||||||
@@ -645,8 +645,6 @@
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
<footer class="outro">
|
<footer class="outro">
|
||||||
<p>The Exploded Cluster · every scene is one generated hero, sliced and scrubbed -
|
|
||||||
no diagrams were harmed.</p>
|
|
||||||
<p>© 2026 Jonathon Wright · <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">CC BY-NC-SA 4.0</a>
|
<p>© 2026 Jonathon Wright · <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">CC BY-NC-SA 4.0</a>
|
||||||
· built with GSAP, shipped via GitOps · <a href="https://www.bztmon.com/">bztmon.com</a></p>
|
· built with GSAP, shipped via GitOps · <a href="https://www.bztmon.com/">bztmon.com</a></p>
|
||||||
</footer>
|
</footer>
|
||||||
|
|||||||
@@ -457,7 +457,7 @@
|
|||||||
{
|
{
|
||||||
"name": "console",
|
"name": "console",
|
||||||
"title": "oc + console",
|
"title": "oc + console",
|
||||||
"blurb": "kubectl, extended - the operator's handheld.",
|
"blurb": "The CLI and the web console - the operator's handheld.",
|
||||||
"z": 0,
|
"z": 0,
|
||||||
"points": [
|
"points": [
|
||||||
[
|
[
|
||||||
|
|||||||
Reference in New Issue
Block a user