2021 — the census¶
53 posts, 2021-03-09 to 2021-12-22. Kubernetes 1.21, 1.22 and 1.23 are in scope, and three is the whole year: the release cadence changed from four a year to three in July. This is the year the blog stopped being about the project and became about the software — see the method.
Yield: 11 walk, mid-band and the highest of any year since 2016. 31
read, 0 dated, 11 skip.
The reject rate halves, and the shape of the year explains why. 21%, against 48%, 42%, 38%,
40%, 37%, 41% for the six years before it — the lowest of the chronological sweep and beaten only
by 2024's 19%. meta falls to 11 rows and 21%, its lowest share in the census, 2024's 30%
included. The mechanism is visible in the dates. In 2018, 2019 and 2020 the three busiest months
carried 46%, 44% and 43% of the year's posts; in 2021 they carry 62%, and they are April,
August and December — the three release months, exactly. The pinned tree holds no 2021 post before
9 March and only four between then and the end of June. The blog stopped filling the quiet months
with community writing and started clustering feature posts around the release train, which is
also the shape 2024 has (65%). There are no hangout notes this year, no KubeCon recaps, no case
studies and no memorials: 42 of the 53 posts are about how the software behaves.
The largest removal event in the archive, and it is not close. The pin's deprecation guide gives v1.22 twelve subsections — Webhook resources, CustomResourceDefinition, APIService, TokenReview, SubjectAccessReview, CertificateSigningRequest, Lease, Ingress, IngressClass, RBAC resources, PriorityClass and Storage resources. v1.16, the removal 2019's walk is built on, has six. Every removal release after v1.22 put together — v1.25's seven, v1.26's two, and one each at v1.27, v1.29 and v1.32 — comes to twelve as well. One release removed as much as the following ten years, and it has its own post here.
The ladder shows its whole range inside one year. PodSecurity went alpha in 1.22 and stable
in 1.25: three releases, announcement to done. In the same two releases the project shipped
MemoryQoS, alpha from 1.22 through 1.36 and beta only at 1.37 — fifteen releases on the first
rung, graduating on the newest release the pin carries; CSIVolumeHealth, alpha from 1.21 with
no end version and no later stage recorded at all; and GracefulNodeShutdown, beta from 1.21 with
no stable stage, sixteen releases on. MemoryManager took ten releases to cross beta. 2020
produced one stationary rung and read as an anomaly. 2021 produces three, alongside the fast
graduations that make them legible, and the anomaly turns out to be the distribution.
Self-annotation stops being an event and becomes a habit. 2019 gave the archive its first
later-added editorial note; 2020 gave the first strikethrough. 2021 carries four, and three of
them retire something other than a version.
PodSecurityPolicy Deprecation: Past, Present, and Future
opens with a {{% pageinfo %}} Update saying its subject was removed in v1.25.
Spotlight on SIG Usability
opens with a {{< note >}} saying the SIG has been inactive since August 2023 — an interview
annotated with the end of the group it interviews.
A Closer Look at NSA/CISA Kubernetes Hardening Guidance
carries an Update from November 2023 pointing at version 1.2 of a guide the post reviews at 1.0:
the annotation moves the source on, not the post.
Dockershim removal is coming. Are you ready?
opens with a Poll closed alert and has both links to its survey wrapped in <del>.
Several subjects left no trace. networking.x-k8s.io — the API group
Evolving Kubernetes networking with the Gateway API
is written in — has zero occurrences at the pin; the API shipped as gateway.networking.k8s.io/v1,
and that rename is a walk. The other three are absences that stayed absent. kpng, a SIG Network
subproject with a post explaining how to write proxier backends against it, has zero occurrences;
kube-proxy still ships as kube-proxy and the backend that did arrive, nftables, arrived in tree.
a8r.io, a proposed annotation convention for Services, has zero. ClusterClass has zero, in a
tree that references Cluster API in six files. Three ideas the blog put its weight behind in one
year, none of which reached the documentation.
dated is empty for the second time, and for the same reason as 2017.
Kubernetes-in-Kubernetes and the WEDOS PXE bootable server farm
is the only candidate and it passes both tests on its face: a complete procedure, and two data
centres of bare metal underneath it. The vendor rule reaches it first and makes it a read. That
ordering was raised when 2017 came out empty and was left as it stood; this is the second year it
has cost the verdict its only row. dated remains at 11 rows in 472.
Three things in the topic tallies are worth the taxonomy's attention. storage takes 9 rows and
3 walks, both records for the sweep — a year of 1.22 and 1.23 storage alphas, three of which
have since gone stable and are still observable in a single-node cluster. tooling drops from 7
rows to 3 and takes zero walks for the second year running: the year's two substantial tooling
posts are about writing software, not about running a cluster, and the walk machinery has nothing
to grip. And ecosystem falls again, to 2 rows and 4% — 9%, 21%, 28%, 14%, 12%, 5%, 4% — a new
low on top of last year's low. sched and etcd are both empty.
Census¶
Verdicts and topics are defined in ../README.md. Every post has a
row, and a row's title always links the post — never the exercise file, so the row never
changes once written. The Exercises table below is the progress record.
| post | date | k8s | verdict | topic | why |
|---|---|---|---|---|---|
| The Evolution of Kubernetes Dashboard | 03-09 | — | read |
history |
The Dashboard's own six-year retrospective, written from inside the project: three rewrites, a change of framework, and the reasoning behind each. At the pin the Dashboard has one task page in the whole documentation tree. Read for the account of a component the core stopped owning; there is no cluster operation in it. |
| PodSecurityPolicy Deprecation: Past, Present, and Future | 04-06 | 1.21 | read |
security |
The deprecation announcement, and the post now carries a {{% pageinfo %}} Update on top of itself saying PodSecurityPolicy was removed in v1.25 — a post annotated with the death of its own subject. The pin's deprecation guide lists PodSecurityPolicy under the v1.25 removals, four releases after this was written. The migration it promises is the one 47 actually teaches, so the discontinuity is booked there and this reads for the reasoning. |
| Kubernetes 1.21: Power to the Community | 04-08 | 1.21 | skip |
meta |
Release announcement. Everything in 1.21 that matters to this census — CronJob at GA, PodSecurityPolicy deprecated, graceful node shutdown to beta — has its own post below. |
| Kubernetes 1.21: CronJob Reaches GA | 04-09 | 1.21 | walk |
api |
CronJob reaches GA on batch/v1, with a rewritten controller behind the CronJobControllerV2 gate. At the pin that gate is gone from the feature-gate list entirely and the deprecation guide lists CronJob under the v1.25 removals: batch/v1beta1 stopped being served four releases after this post. Copy the post's manifest as written and the apiserver refuses it; change one line and it runs. |
| Introducing Suspended Jobs | 04-12 | 1.21 | read |
api |
Suspended Jobs, alpha behind SuspendJob. At the pin the gate is stable-then-removed and spec.suspend is ordinary API named in fourteen files, so the only expired part of the post is its --feature-gates preamble. One field and one patch is thin material for an exercise when 04 already opens the batch group. |
| kube-state-metrics goes v2.0 | 04-13 | — | read |
obs |
kube-state-metrics v2.0, an out-of-tree add-on's major release, with a breaking-change list: renamed flags, dropped metrics, a new --metric-labels-allowlist. The pin names kube-state-metrics in four files and documents none of those flags. Read for what a metric rename costs whoever built a dashboard on it. |
| Local Storage: Storage Capacity Tracking, Distributed Provisioning and Generic Ephemeral Volumes hit Beta | 04-14 | 1.21 | read |
storage |
Three storage features to beta in one release: capacity tracking (CSIStorageCapacity), distributed provisioning, and generic ephemeral volumes (GenericEphemeralVolume). Both gates are stable-then-removed at the pin, so every beta caveat in the post is spent. Generic ephemeral volumes already carry a 2020 exercise; what is left is a graduation announcement. |
| Three Tenancy Models For Kubernetes | 04-15 | — | read |
security |
Three tenancy models — namespaces, virtual control planes, a cluster per tenant — argued as a design space rather than a procedure. Nothing in it is a version, so nothing in it expired. The value is the vocabulary for the trade-off. |
| Volume Health Monitoring Alpha Update | 04-16 | 1.21 | read |
storage |
Volume health monitoring, alpha behind CSIVolumeHealth. The gate's entry at the pin has fromVersion: "1.21", no toVersion, and no later stage: five years on the first rung with no movement recorded at all. That is a finding about the ladder rather than a lab exercise — observing it needs a CSI driver that implements the health RPCs. |
| Introducing Indexed Jobs | 04-19 | 1.21 | read |
api |
Indexed Jobs, alpha behind IndexedJob. At the pin the gate is removed, completionMode: Indexed is ordinary API in three files, and JOB_COMPLETION_INDEX works exactly as the post writes it. A post that aged so well it left nothing to discover. |
| Annotating Kubernetes Services for Humans | 04-20 | — | skip |
ecosystem |
A proposal to standardise a8r.io/* annotations on Services. The string a8r.io has zero occurrences anywhere in the pin's documentation tree: the convention was never adopted. Vendor advocacy for something that did not happen. |
| Defining Network Policy Conformance for Container Network Interface (CNI) providers | 04-20 | — | read |
net |
Defining NetworkPolicy conformance for CNI providers, with the cyclonus fuzzer and a matrix of which plugin fails which case. cyclonus has zero occurrences at the pin. The finding survives the tool: identical NetworkPolicy YAML behaved differently on different CNIs, which is why conformance had to be defined at all. |
| Graceful Node Shutdown Goes Beta | 04-21 | 1.21 | read |
nodes |
Graceful node shutdown to beta, configured with shutdownGracePeriod in the kubelet. At the pin the gate still reads fromVersion: "1.21" with no toVersion, no stable stage and no removal — sixteen releases on the middle rung. Second only to 09 as a stationary rung, but the observable needs a systemd inhibitor lock and a real node shutting down, which is past the lab ceiling. |
| Evolving Kubernetes networking with the Gateway API | 04-22 | — | walk |
net |
The Gateway API introduced as the successor to Ingress, in API group networking.x-k8s.io. That group has zero occurrences at the pin: the API shipped as gateway.networking.k8s.io/v1, so every kind in the post has to be re-grouped before it applies. Install the CRDs at the pin's version and diff GatewayClass, Gateway and HTTPRoute against what the post prints. |
| Kubernetes 1.21: Metrics Stability hits GA | 04-23 | 1.21 | read |
obs |
The metrics stability framework at GA: ALPHA and STABLE labels on metrics, and a deprecation policy that governs them. The policy is the payload and it still holds at the pin. Reading it explains why a metric name is allowed to move; running it explains nothing. |
| Using Finalizers to Control Deletion | 05-14 | — | walk |
api |
The one 2021 post that is a tutorial first: create an object, add a finalizer, delete it, watch the deletion hang, remove the finalizer, watch it complete. The pin still documents the same semantics at concepts/overview/working-with-objects/finalizers.md, so the commands run verbatim five years on. This year's proof that some of the archive did not move. |
| Writing a Controller for Pod Labels | 06-21 | — | read |
tooling |
Writing a controller for Pod labels: a full controller-runtime walkthrough with a mutating webhook and certificate wiring. Substantial and still conceptually correct, but the Go module versions are five years stale and the exercise it implies is write a controller, not run a cluster. Read for the shape of a reconcile loop. |
| Announcing Kubernetes Community Group Annual Reports | 06-28 | — | skip |
meta |
Announcement that community groups now file annual reports. Governance process. |
| Kubernetes API and Feature Removals In 1.22: Here’s What You Need To Know | 07-14 | 1.22 | walk |
api |
The removal notice for the largest removal event in the archive. The pin's deprecation guide gives v1.22 twelve subsections — Webhook resources, CustomResourceDefinition, APIService, TokenReview, SubjectAccessReview, CertificateSigningRequest, Lease, Ingress, IngressClass, RBAC resources, PriorityClass and Storage resources — exactly as many as every removal release after it put together, and twice the six of v1.16. None of them overlaps the extensions/v1beta1 workloads that 2019's removal walk covers. Take each row of the post's table, apply the old apiVersion at the pin, and record the refusal. |
| Spotlight on SIG Usability | 07-15 | — | skip |
meta |
SIG Usability spotlight. The post now carries a {{< note >}} saying the SIG was deprecated and has been inactive since August 2023 — an interview whose subject is the thing that ended. Kept in the census as evidence of self-annotation; skipped as a process interview, the same call as 2020's SIG-Windows spotlight. |
| Kubernetes Release Cadence Change: Here’s What You Need To Know | 07-20 | — | skip |
meta |
The move from four releases a year to three. Process change, and the reason this year's census carries three release announcements where 2020's carried four. |
| Updating NGINX-Ingress to use the stable Ingress API | 07-26 | — | read |
net |
Porting ingress-nginx off extensions/v1beta1 and onto the stable Ingress API ahead of the v1.22 removal. A useful migration note, but the discontinuity it prepares for belongs to 19, and the controller's own versions have moved five years on. |
| Roorkee robots, releases and racing: the Kubernetes 1.21 release interview | 07-29 | 1.21 | read |
meta |
The 1.21 release lead on the release, on the record. read on the maintainer-interview rule, as with every release interview from 2018 onward. |
| Kubernetes 1.22: Reaching New Peaks | 08-04 | 1.22 | skip |
meta |
Release announcement for the release that owns this year's removal event and four of its walks. |
| Kubernetes 1.22: Server Side Apply moves to GA | 08-06 | 1.22 | read |
api |
Server Side Apply at GA. At the pin the gate is stable from 1.22 and then removed, so this is simply how kubectl apply --server-side works now. Field management and conflict forcing already carry a 2020 exercise; this is the graduation notice for it. |
| New in Kubernetes v1.22: alpha support for using swap memory | 08-09 | 1.22 | walk |
nodes |
Alpha swap support, configured with swapBehavior: UnlimitedSwap in the kubelet. At the pin UnlimitedSwap has zero occurrences: the accepted values are LimitedSwap and NoSwap, and NodeSwap went beta off-by-default at 1.28, beta on at 1.30 and stable at 1.34. The post's central configuration line is the one thing in it that no longer parses — set it at the pin and read the kubelet's refusal. |
| Kubernetes 1.22: CSI Windows Support (with CSI Proxy) reaches GA | 08-09 | 1.22 | read |
storage |
CSI support on Windows nodes at GA, by way of csi-proxy. The pin mentions csi-proxy in a single file. Windows nodes are past the lab ceiling and the post is an announcement rather than a procedure. |
| Kubernetes Memory Manager moves to beta | 08-11 | 1.22 | read |
nodes |
Memory Manager to beta: NUMA-aware memory pinning alongside the CPU manager. At the pin the gate is beta from 1.22 and stable only at 1.32 — ten releases on the middle rung, and still listed rather than removed. Observing it needs a node with more than one NUMA domain. |
| Alpha in v1.22: Windows HostProcess Containers | 08-16 | 1.22 | read |
nodes |
Windows HostProcess containers, alpha in 1.22. At the pin the gate is stable from 1.26 and removed. Windows nodes are past the lab ceiling. |
| Enable seccomp for all workloads with a new v1.22 alpha feature | 08-25 | 1.22 | walk |
security |
SeccompDefault: one kubelet flag that moves every workload on the node from Unconfined to RuntimeDefault. The gate went stable at 1.27 and left the list, but --seccomp-default is a live kubelet flag at the pin, named in three files. Turn it on in a single-node cluster's kubelet configuration and diff a Pod's effective seccomp profile before and after; the entire change is observable in one cluster. |
| Minimum Ready Seconds for StatefulSets | 08-27 | 1.22 | read |
api |
minReadySeconds for StatefulSets, alpha in 1.22. At the pin the gate is stable from 1.25 and removed, and the field is ordinary API in thirteen files. One field, one behaviour, and the behaviour never changed. |
| Kubernetes 1.22: A New Design for Volume Populators | 08-30 | 1.22 | read |
storage |
Volume populators redesigned around AnyVolumeDataSource and a registry of VolumeDataSource kinds — the second design for the same problem. The gate reached stable at 1.33, so the redesign landed, but exercising it needs a populator controller and a CSI driver. Read for why the first design had to be withdrawn. |
| Alpha in Kubernetes v1.22: API Server Tracing | 09-03 | 1.22 | read |
obs |
API server tracing, alpha in 1.22, exported to an OpenTelemetry collector. The gate is beta from 1.27 and stable at 1.34, so the feature arrived intact. Running it means standing a collector next to the apiserver; the post's value is the argument for tracing a control plane at all. |
| Introducing Single Pod Access Mode for PersistentVolumes | 09-13 | 1.22 | walk |
storage |
ReadWriteOncePod: the access mode that finally means one Pod, after ReadWriteOnce had meant one node since 2015. Alpha here, stable at 1.29, gate removed, and the mode is named in thirteen files at the pin. Two Pods and one claim is the whole experiment, and the second Pod's refusal is the payload. |
| Spotlight on SIG Node | 09-27 | — | skip |
meta |
SIG Node spotlight: how the SIG is organised, what its subprojects are, how to join. Process rather than engineering, and skipped on the same reading as 2020's SIG-Windows spotlight. |
| How to Handle Data Duplication in Data-Heavy Kubernetes Environments | 09-29 | — | read |
storage |
A vendor argument for hardware-offloaded snapshots instead of copying volumes through compute. It names the alternative it rejects — download to compute, push back to the provider — so it reads under the vendor rule rather than skipping. It never becomes a walk. |
| A Closer Look at NSA/CISA Kubernetes Hardening Guidance | 10-05 | — | read |
security |
SIG Security going through the NSA/CISA hardening guidance section by section, adding what the guidance left out. The post now carries a {{% pageinfo %}} Update from November 2023 pointing at version 1.2 of a guide this post reviews at 1.0 — the annotation moves the source on, not the post. Argument, not procedure. |
| Introducing ClusterClass and Managed Topologies in Cluster API | 10-08 | — | read |
tooling |
ClusterClass and managed topologies in Cluster API: a cluster becomes a templated object with a class behind it. ClusterClass has zero occurrences in the pin's documentation and Cluster API appears in six files as a reference to an out-of-tree project. Read for the idea; it is not a k8s-academy lab. |
| Use KPNG to Write Specialized kube-proxiers | 10-18 | — | read |
net |
KPNG: kube-proxy refactored into a library so you can write your own proxier backend. kpng has zero occurrences at the pin — five years on, kube-proxy still ships as kube-proxy, and the new backend that did land, nftables, landed in tree. Read as a design that lost. |
| Announcing the 2021 Steering Committee Election Results | 11-08 | — | skip |
meta |
Steering Committee election results. |
| Non-root Containers And Devices | 11-09 | — | read |
nodes |
Why a device node's ownership defeats runAsNonRoot, and the device-plugin path around it. The problem is real at the pin and the explanation is good, but reproducing it needs a device to plug in. |
| Dockershim removal is coming. Are you ready? | 11-12 | — | skip |
meta |
The dockershim readiness survey. Both links to the form are wrapped in <del>, and the post opens with a {{% alert %}} titled Poll closed. A call to action whose action is over. |
| Quality-of-Service for Memory Resources | 11-26 | 1.22 | walk |
nodes |
Memory QoS: requests and limits mapped onto cgroup v2's memory.min and memory.high instead of being scheduling hints only. At the pin MemoryQoS is alpha from 1.22 through 1.36 and beta only at 1.37 — fifteen releases on the first rung, graduating on the newest release the pin carries. Enable the gate on a cgroup v2 node and read the values the kubelet writes into the Pod's cgroup; the slowest climb in the archive is observable in one cat. |
| Contribution, containers and cricket: the Kubernetes 1.22 release interview | 12-01 | 1.22 | read |
meta |
The 1.22 release lead on the release that removed twelve API groups. read on the maintainer-interview rule. |
| Kubernetes 1.23: The Next Frontier | 12-07 | 1.23 | skip |
meta |
Release announcement. It deprecates FlexVolume, which the pin still names in fourteen files, and deprecates the klog-specific flags. |
| Kubernetes 1.23: Dual-stack IPv4/IPv6 Networking Reaches GA | 12-08 | 1.23 | read |
net |
Dual-stack IPv4/IPv6 at GA, seven releases after the alpha. The gate is stable from 1.23 and removed at the pin. Exercising dual-stack needs a CNI and a host network configured for both families; the post is the announcement of a migration that had already finished. |
| Kubernetes 1.23: Pod Security Graduates to Beta | 12-09 | 1.23 | walk |
security |
Pod Security admission to beta — the replacement whose arrival 02 promises. At the pin the gate is stable from 1.25 and removed, the configuration API is pod-security.admission.config.k8s.io/v1, and the three namespace labels are ordinary API. Label a namespace restricted, apply a Pod that violates the standard, and read the rejection: the whole PodSecurityPolicy migration collapses into one exercise. |
| Kubernetes 1.23: Kubernetes In-Tree to CSI Volume Migration Status Update | 12-10 | 1.23 | read |
storage |
A status table for in-tree to CSI migration, driver by driver, taken mid-flight. Every row of it has since resolved. Read for what a five-year migration costs, not for anything to run. |
| Kubernetes 1.23: Prevent PersistentVolume leaks when deleting out of order | 12-15 | 1.23 | walk |
storage |
Deleting a PersistentVolume before its claim used to leak the backing volume. HonorPVReclaimPolicy fixes it with a finalizer; at the pin the gate is stable from 1.33 and removed, and external-provisioner.volume.kubernetes.io/finalizer appears in four files. Delete in both orders on a cluster that has the fix and the difference is a finalizer you can watch appear. |
| Kubernetes 1.23: StatefulSet PVC Auto-Deletion (alpha) | 12-16 | 1.23 | walk |
storage |
persistentVolumeClaimRetentionPolicy on StatefulSets, with whenDeleted and whenScaled. Alpha here, stable at 1.32, and the field is documented in five files at the pin. Scale a StatefulSet down under each policy and count the claims left behind; the default is still the 2021 behaviour, which is the part worth finding out by hand. |
| What's new in Security Profiles Operator v0.4.0 | 12-17 | — | skip |
ecosystem |
Release notes for an out-of-tree operator. |
| Using Admission Controllers to Detect Container Drift at Runtime | 12-21 | — | read |
security |
A vendor engineering post on catching kubectl exec drift with a validating webhook. It states the decision and the alternatives it rejected — audit logs, runtime agents — so it reads under the vendor rule. Its own tooling, kube-applier, has zero occurrences at the pin. |
| Kubernetes-in-Kubernetes and the WEDOS PXE bootable server farm | 12-22 | — | read |
tooling |
Kubernetes running inside Kubernetes, with compute nodes PXE-booted from the cluster that manages them. The most complete procedure published all year and the only 2021 post that walks a reader end to end — but it wants two data centres, and the vendor rule reaches it before the dated tests do. The second year that rule order has cost dated its only candidate. |
Exercises¶
Eleven walk verdicts, numbered in publication order. All eleven are written. The rubric they are
authored against was ratified in
#57.
| # | exercise | state |
|---|---|---|
| 01 | The gate that was removed for winning | written |
| 02 | Re-grouped, and refused anyway | written |
| 03 | The delete that hangs, exactly as promised | written |
| 04 | Eight bullets, twelve removals, one manifest at a time | written |
| 05 | The setting the kubelet no longer has a word for | written |
| 06 | One flag, and every Pod's profile changes | written |
| 07 | Once per node, and then once per Pod | written |
| 08 | Fifteen releases on the first rung | written |
| 09 | The default for a namespace nobody labelled | written |
| 10 | Delete them in the wrong order and the file is still there | written |
| 11 | The claim whose owner is the Pod that is leaving | written |