Skip to content

2016 — the census

90 posts, 2016-01-11 to 2016-12-23. The largest of the twelve years and 12% of the whole corpus, within eight posts of 2015 and 2024 combined. Kubernetes 1.1 through 1.5 — four releases inside twelve months. Most of this year's nouns still exist and mean something different, which is the third staleness case and the reason 2016 was censused after the two ends: Deployments arrive, PetSet is introduced and renamed to StatefulSet nine months later, RBAC goes alpha, CRI is proposed, and Minikube, Helm and kubeadm all launch — see the method.

Yield: 15 walk, at the ceiling of the 8–15 band and inside it. 34 read, 3 dated, 38 skip.

The ceiling was reached but did not bind. Seventeen posts had a case for an exercise; both that lost it lost on a rule rather than on space. High performance network policies is hands-on, measurable, and its numbers would move — and it is a vendor post, which the genre rule keeps out of the exercise set on principle. Tail Kubernetes with Stern is a clean, small diff that lost to fourteen larger ones. Both are read, with the reason written into the row.

The three dated rows are all storage, all in a seven-week stretch, and each fails on a different kind of unobtainable. A Thousand Instances of Cassandra is scale the post itself calls its largest ever. Stateful Applications Using Kubernetes and Datera needs a storage appliance — and FlexVolume, the mechanism it uses, is still compiled into the kubelet at the pin, which makes it the cleanest illustration in the corpus of dated being about the hardware and not the API. Create a Couchbase cluster is the softest of the three: one node would fit under the ceiling and a cluster would not.

The 38 rejects are seven weekly meeting notes, four SIG introductions, three release-series index posts, two monthly news digests, two conference announcements, a two-part build log for one CI job, a survey, a birthday post, a partner-program announcement, a Dashboard release-notes post, a hosted-agent tutorial, and thirteen vendor or ecosystem posts that record no decision. That is 42% of the year — below 2015's 48% and more than twice 2024's 19% — and the growth in absolute terms is almost entirely vendor volume rather than noise: 19 posts carry an ecosystem tag against 4 in 2015.

etcd is the only tag with no rows. 2016 predates the etcd2-to-etcd3 migration the blog would later cover, and the storage layer is not discussed this year.

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
Simple leader election with Kubernetes and Docker 01-11 1.1 walk api The post's election runs in a sidecar image and parks the winner in an annotation on an Endpoints object. Leader election is now an API object — Lease in coordination.k8s.io/v1 — and the control plane holds its own in kube-system, where you can watch it change hands.
Why Kubernetes doesn’t use libnetwork 01-14 1.1 read net The case for CNI over Docker's CNM, written while the outcome was still open. Both halves of the premise are gone: CNI won, and Docker itself left the node when dockershim was removed.
Kubernetes Community Meeting Notes - 20160114 01-28 — skip meta Raw meeting notes. Records a bare-metal provisioning demo, as minutes.
Kubernetes Community Meeting Notes - 20160121 01-28 — skip meta Raw meeting notes. Carries the corpus's first mention of PetSet — the name that became StatefulSet eleven months later — as an agenda item.
State of the Container World, January 2016 02-01 — skip meta Monthly news digest and survey plug.
Kubernetes Community Meeting Notes - 20160128 02-02 — skip meta Raw meeting notes.
Kubernetes Community Meeting Notes - 20160204 02-09 — skip meta Raw meeting notes. Records an rkt demo, as minutes.
ShareThis: Kubernetes In Production 02-11 — skip ecosystem A migration narrative with a four-point summary of outcomes. It names no alternative it rejected, so the vendor rule holds it here.
Kubernetes Community Meeting Notes - 20160211 02-16 — skip meta Raw meeting notes.
Kubernetes Community Meeting Notes - 20160218 02-23 — skip meta Raw meeting notes.
KubeCon EU 2016: Kubernetes Community in London 02-24 — skip meta Conference announcement.
Kubernetes Community Meeting Notes - 20160225 03-01 — skip meta Raw meeting notes.
State of the Container World, February 2016 03-01 — skip meta Monthly news digest.
ElasticBox introduces ElasticKube to help manage Kubernetes within the enterprise 03-11 — skip ecosystem Product announcement for a self-service management layer over Kubernetes. No decision recorded, no alternatives weighed.
Kubernetes in the Enterprise with Fujitsu’s Cloud Load Control 03-11 — skip ecosystem Product announcement for a hosted control layer. No decision recorded.
Kubernetes 1.2: Even more performance upgrades, plus easier application deployment and management 03-17 1.2 read meta The 1.2 announcement: ConfigMap, Deployments, DaemonSet, Ingress, and a 1000-node ceiling. Read it as the index it is — the five deep-dive posts that follow it carry the exercises.
Scaling neural network image classification using Kubernetes with TensorFlow Serving 03-23 1.2 read ecosystem The first machine-learning-on-Kubernetes post. What it teaches is how to run a model server, which is a Deployment; the Kubernetes content is thin and the images and gcloud steps are of their moment.
1000 nodes and beyond: updates to Kubernetes performance and scalability in 1.2 03-28 1.2 read api A scalability report: 1000 nodes, and 99th-percentile API latency in tens of milliseconds for everything except LIST. The number moved to 5000, but the more interesting change is that the fix for LIST became API machinery — the watch cache, protobuf, and priority-and-fairness queues.
Five Days of Kubernetes 1.2 03-28 1.2 skip meta Index post for the 1.2 deep-dive series.
How container metadata changes your point of view 03-28 — read obs Not a product tour but an argument: monitoring keys off labels, not hostnames. That argument won so completely that it is now how relabelling works in every Kubernetes metrics pipeline.
AppFormix: Helping Enterprises Operationalize Kubernetes 03-29 — skip ecosystem Product announcement for an operations dashboard. No decision recorded.
Building highly available applications using Kubernetes new multi-zone clusters (a.k.a. 'Ubernetes Lite') 03-29 1.2 walk sched The feature is multi-zone clusters; the name is "Ubernetes Lite", which survives nowhere. Spreading was implicit and best-effort behind failure-domain.beta.kubernetes.io/zone — a label still served at the pin, deprecated since v1.17 and never removed — and is now an explicit field, topologySpreadConstraints, under a renamed key.
Using Spark and Zeppelin to process big data on Kubernetes 1.2 03-30 1.2 read ecosystem A Spark-and-Zeppelin walkthrough built on ReplicationControllers and an examples tree that has moved. Spark now has a native Kubernetes scheduler backend, so the whole approach was superseded rather than updated.
Kubernetes 1.2 and simplifying advanced networking with Ingress 03-31 1.2 walk net Ingress at beta, in extensions/v1beta1, with spec.backend and a bare serviceName. That group-version is not served, the backend is restructured, every path needs a pathType, and the class moved from an annotation to a field and then to its own object. Then Ingress was frozen and Gateway API became the place new work goes.
Using Deployment objects with Kubernetes 1.2 04-01 1.2 walk api Deployments at beta, and the post's own comparison is against kubectl rolling-update — a command that no longer exists. Two traps: extensions/v1beta1 is not served, and spec.selector flipped from helpfully-defaulted to required-and-immutable, so the post's manifest is one that used to validate and mean something.
Configuration management with Containers 04-04 1.2 walk api The rare 2016 post whose manifests still apply unchanged — ConfigMap has been v1 since it arrived. The payload is the half the post does not mention and which is still true: a value injected as an environment variable never updates, while the same value mounted as a volume does, on the kubelet's own schedule.
Adding Support for Kubernetes in Rancher 04-08 — skip ecosystem Vendor integration announcement. No decision recorded.
Container survey results - March 2016 04-08 — skip meta Survey results.
How to deploy secure, auditable, and reproducible Kubernetes clusters on AWS 04-15 — skip ecosystem Tool announcement for a CloudFormation-based AWS installer. It gestures at "a more manual way" but weighs no alternative, and the provisioning lineage it belongs to is carried far better by the kubeadm post in September.
SIG-Networking: Kubernetes Network Policy APIs Coming in 1.3 04-18 1.2 walk net Network policy before it had an API of its own: extensions/v1beta1, and isolation switched on by annotating the namespace with net.beta.kubernetes.io/network-policy. The annotation is gone entirely and the group-version with it; turning isolation on is now a default-deny policy object, which is a different thing to reason about.
SIG-ClusterOps: Promote operability and interoperability of Kubernetes clusters 04-19 — skip meta SIG introduction. The SIG itself was later wound down.
SIG-UI: the place for building awesome user interfaces for Kubernetes 04-20 — skip meta SIG introduction.
Introducing the Kubernetes OpenStack Special Interest Group 04-22 — skip meta SIG introduction.
CoreOS Fest 2016: CoreOS and Kubernetes Community meet in Berlin (& San Francisco) 05-03 — skip meta Conference announcement.
Hypernetes: Bringing Security and Multi-tenancy to Kubernetes 05-24 1.2 read security The argument for a hypervisor boundary per pod, made by a project that lost. The argument itself won: it is Kata Containers now, selected by runtimeClassName, which turned a custom distribution into a field. Nested virtualisation puts the exercise past a laptop.
Bringing End-to-End Kubernetes Testing to Azure (Part 1) 06-06 — skip tooling A build log for one nightly end-to-end job. The job and the infrastructure under it are both replaced.
The Illustrated Children's Guide to Kubernetes 06-09 1.2 read history The children's guide, and still accurate on every concept it draws, which is why it is the most durable post in the year.
Container Design Patterns 06-21 1.2 read api Brendan Burns on sidecar, ambassador and adapter, with the sharper framing that probes and lifecycle hooks are an API the platform calls on your container. 2015's toolkit-patterns exercise already carries the diff that matters — the sidecar became an initContainers entry with restartPolicy: Always.
Kubernetes 1.3: Bridging Cloud Native and Enterprise Workloads 07-06 1.3 read meta The 1.3 announcement. An index; the deep dives carry the exercises.
Updates to Performance and Scalability in Kubernetes 1.3 -- 2,000 node 60,000 pod clusters 07-07 1.3 read api A scalability report at 2000 nodes, plus Kubemark. Note the filename: this post lives at a URL about Windows Server containers and is not about Windows Server containers.
Five Days of Kubernetes 1.3 07-11 1.3 skip meta Index post for the 1.3 deep-dive series.
Minikube: easily run Kubernetes locally 07-11 1.3 read tooling The launch of the only 2016 tool in this year still shipping under its own name. What changed is underneath it — the localkube binary it was built on is gone and it bootstraps with kubeadm — and the lab provisions its clusters a different way, so there is no diff here to run.
rktnetes brings rkt container engine to Kubernetes 07-11 1.3 read nodes rkt as a second runtime, wired in as a kubelet flag. The project ended, the flag was removed, and the code went with it — but the exercise of supporting two runtimes at once is exactly why CRI was designed, which makes this the argument the December CRI post answers.
Autoscaling in Kubernetes 07-12 1.3 walk sched Horizontal and cluster autoscaling, with Heapster as the metrics source. Heapster does not exist; kubectl top and the HPA read metrics.k8s.io from metrics-server, the flag that used to switch that off is gone from the controller manager, and HPA manifests from this era are rejected rather than warned about.
Kubernetes in Rancher: the further evolution 07-12 — skip ecosystem Vendor progress update. No decision recorded.
Stateful Applications in Containers!? Kubernetes 1.3 Says “Yes!” 07-13 1.3 skip ecosystem A vendor opinion piece on stateful workloads. Poses the question PetSet was already answering that quarter, and answers it with a product.
Thousand Instances of Cassandra using Kubernetes Pet Set 07-13 1.3 dated storage A thousand Cassandra instances, run to prove Pet Set could take it, and the post says plainly that it was the largest deployment they had ever made. The scale is the whole point of the post and it is far past the lab ceiling; the API it exercises is read in the December StatefulSet row instead.
Citrix + Kubernetes = A Home Run 07-14 — skip ecosystem Vendor integration announcement. No decision recorded.
Cross Cluster Services - Achieving Higher Availability for your Kubernetes Applications 07-14 1.3 read net Federated services: one name, backed by pods in several clusters, resolved by DNS. Federation v1 was withdrawn and its successor archived, so this is the clearest statement in the corpus of a promise Kubernetes made and then took back.
Steering an Automation Platform at Wercker with Kubernetes 07-15 — skip ecosystem Platform narrative. No decision recorded and no mechanism named.
Dashboard - Full Featured Web Interface for Kubernetes 07-15 1.3 read tooling The Dashboard's first full release. The Dashboard still ships, but everything about reaching it changed: this post predates RBAC, so it describes an interface with no account behind it.
Bringing End-to-End Kubernetes Testing to Azure (Part 2) 07-18 — skip tooling Part two of the same build log.
A Very Happy Birthday Kubernetes 07-21 — skip meta Birthday post.
Happy Birthday Kubernetes. Oh, the places you’ll go! 07-21 1.3 read history A maintainer's year-one letter, naming what shipped and what was still called PetSet and Ubernetes. Worth reading as a dated inventory written by someone who owned part of it.
The Bet on Kubernetes, a Red Hat Perspective 07-21 1.3 read history Red Hat's account of why it bet a product line on Kubernetes rather than building its own orchestrator, written by someone who owned code on both sides of that decision.
Why OpenStack's embrace of Kubernetes is great for both communities 07-26 — skip ecosystem Vendor commentary on an ecosystem announcement.
Challenges of a Remotely Managed, On-Premises, Bare-Metal Kubernetes Cluster 08-02 1.3 read ecosystem An honest engineering write-up of one hard problem: a control plane in a SaaS, the cluster on someone else's hardware, and the reconciliation between them. That problem is now Cluster API's, and this post is the shape of it before anyone had a name for it.
Create a Couchbase cluster using Kubernetes 08-15 1.3 dated storage A walkthrough for a multi-node Couchbase Server cluster — a managed-cache database that wants gigabytes of RAM per node. One node would fit under the ceiling and a cluster would not, which makes this the softest dated call in the year.
Kubernetes Namespaces: use cases and insights 08-16 1.3 read api Namespaces, with quota and limit ranges hung off them. 2015's namespaces-as-environments exercise carries the walk. The line worth taking from here is the one the post makes carefully — a namespace is not a security boundary — which is still true and now has an enforcement mechanism, since Pod Security Admission is configured by labelling the namespace.
SIG Apps: build apps for and operate them in Kubernetes 08-16 — skip meta SIG introduction.
Scaling Stateful Applications using Kubernetes Pet Sets and FlexVolumes with Datera Elastic Data Fabric 08-29 1.3 dated storage Pet Sets on a Datera elastic data fabric via FlexVolume. FlexVolume itself is still compiled into the kubelet at the pin — what is unobtainable is the hardware behind it, and there is no software substitute for a storage appliance.
Security Best Practices for Kubernetes Deployment 08-31 1.3 walk security The post carries its own editor's note saying the advice is no longer current, which is a rare and useful admission. Run its checklist against a modern cluster: the item at the centre of it, PodSecurityPolicy, is not merely deprecated but a hard error, and half the rest became defaults.
Cloud Native Application Interfaces 09-01 1.3 read history A standards essay on what a portable application interface would have to specify. Read it against what actually happened, which is that the interface became the API server and the packaging argument went to Helm and then to OCI.
Deploying to Multiple Kubernetes Clusters with kit 09-06 — skip ecosystem An in-house multi-cluster deploy tool. Mentions an orchestrator evaluation but does not record it.
Creating a PostgreSQL Cluster using Helm 09-09 1.4 read tooling A PostgreSQL walkthrough that is also a vendor chart tour. The Helm mechanics it teaches are the ones the October Helm post carries, and the vendor rule keeps the exercise off a chart someone else maintains.
High performance network policies in Kubernetes clusters 09-21 1.3 read net Measures what a network policy costs: iptables rule counts and the latency they add. Genuinely hands-on and the numbers would move — kube-proxy has an nftables backend now and eBPF datapaths bypass the question — but it is a vendor post, and vendor posts do not carry exercises.
Kubernetes 1.4: Making it easy to run on Kubernetes anywhere 09-26 1.4 read meta The 1.4 announcement: kubeadm, scheduled jobs, Helm. An index; the deep dives carry the exercises.
How Qbox Saved 50% per Month on AWS Bills Using Kubernetes and Supergiant 09-27 1.3 read ecosystem A cost post that does record its decision and the alternative: bin-packing containers onto fewer instances instead of the per-customer VM model its competitors used. The tool it used is gone; the argument is now the cluster autoscaler's.
How we made Kubernetes insanely easy to install 09-28 1.4 walk tooling kubeadm at alpha, and the three-stage model it introduced — provision, bootstrap, add-ons — is still exactly how a cluster comes up. The commands are not: joining with a token alone was a trust-on-first-use hole, so --discovery-token-ca-cert-hash is now mandatory and the post's kubeadm join line fails without it.
How we improved Kubernetes Dashboard UI in 1.4 for your production needs​ 10-03 1.4 skip tooling Dashboard release notes. The Dashboard row in July covers what is worth covering.
Dynamic Provisioning and Storage Classes in Kubernetes 10-07 1.4 walk storage Dynamic provisioning at beta, and the post offers two ways to ask for it. They did not age the same way: the alpha annotation has been silently ignored since v1.6, so a manifest using it produces a classless PVC rather than an error, while the beta annotation is still honoured at the pin with a deprecation warning. Neither is the field you would write, and binding is lazy now.
Helm Charts: making it simple to package and deploy common applications on Kubernetes 10-10 1.4 walk tooling Helm's charts post, and the first command in it installs a cluster-wide component that was removed for being a cluster-wide component. Tiller is gone, helm init with it, and the chart repository the post points at was retired — so this is a packaging story where the client survived and everything it talked to did not.
Building Globally Distributed Services using Kubernetes Cluster Federation 10-14 1.4 read api The fullest technical treatment of federation in the corpus: federated ReplicaSets, secrets, namespaces and ingress, with a control plane of their own. All of it was withdrawn. Read it beside the July cross-cluster post to see how much was built before the retreat.
How We Architected and Run Kubernetes on OpenStack at Scale at Yahoo! JAPAN 10-24 1.4 read ecosystem A substantial architecture write-up — Kubernetes on OpenStack, with the security, networking, storage and CI decisions each stated and defended. One of the few case studies in the year that clears the vendor bar.
Introducing Kubernetes Service Partners program and a redesigned Partners page 10-31 — skip meta Partner program announcement.
Tail Kubernetes with Stern 10-31 1.4 read tooling A tool that existed because kubectl logs could not tail several pods at once. It can now, with a label selector, --all-containers and --prefix, which makes this a small and clean diff — small enough to lose its exercise slot to the fourteen larger ones.
Bringing Kubernetes Support to Azure Container Service 11-07 — skip ecosystem Managed-service announcement. The service was replaced by a differently-named one.
Modernizing the Skytap Cloud Micro-Service Architecture with Kubernetes 11-07 1.4 read ecosystem A long and unusually candid microservice-migration write-up, including the parts that went badly. Clears the vendor bar on the strength of what it says it got wrong.
CNCF Partners With The Linux Foundation To Launch New Kubernetes Certification, Training and Managed Service Provider Program 11-08 1.4 read history The announcement of the certification program the CKA and CKS come from, which makes it the origin document for a lot of what this repository is for.
Visualize Kubelet Performance with Node Dashboard 11-17 1.4 walk obs The post's tool was retired and its repository deprecated, and the post says so at the top. What replaced it is the kubelet's own Prometheus surface, which is not one endpoint but four — the kubelet's own metrics, cAdvisor's, resource metrics and probes — and telling which one answers which question is the whole exercise.
Kubernetes Containers Logging and Monitoring with Sematext 11-18 1.4 skip obs A logging and monitoring tutorial for a hosted agent. The mechanism it uses is still the right one, but the post is a product tour, and 2015's cluster-logging exercise carries the mechanism.
Kompose: a tool to go from Docker-compose to Kubernetes 11-22 1.4 read tooling Compose files translated into Kubernetes objects. kompose up was removed on the argument that a translator should not also be a control loop, and what convert emits today is a different set of apiVersions — a real but narrow diff.
From Network Policies to Security Policies 12-08 1.5 read net The argument that addresses are the wrong identity for a policy and that labels and L7 are the right one. Read it against the outcome: the argument won, and it is the premise of every service mesh and of Gateway API's route matching.
Kubernetes 1.5: Supporting Production Workloads 12-13 1.5 read meta The 1.5 announcement: StatefulSet at beta, PodDisruptionBudget at beta. An index; the deep dives carry the exercises.
Introducing Container Runtime Interface (CRI) in Kubernetes 12-19 1.5 walk nodes CRI introduced as one option among several, selected by a kubelet flag. It is now the only option, which is why the flag was removed rather than defaulted — a kubelet given it fails to start. The visible consequence on a node is that inspecting containers is crictl, and docker ps is not a fallback.
Five Days of Kubernetes 1.5 12-19 1.5 skip meta Index post for the 1.5 deep-dive series.
StatefulSet: Run and Scale Stateful Applications Easily in Kubernetes 12-20 1.5 walk api The rename. PetSet's group-version was deleted outright rather than converted, so the 1.5 notes tell you to migrate existing objects by hand — the only place in the corpus where an upgrade path was simply declined. The post's own apps/v1beta1 is not served either, while volumeClaimTemplates and the headless-service requirement are unchanged.
Windows Server Support Comes to Kubernetes 12-21 1.5 read nodes Windows Server containers at alpha. Windows nodes are supported at the pin, but the lab has no Windows host to add, so this is a read for the shape of the problem — a second OS behind one API.
Cluster Federation in Kubernetes 1.5 12-22 1.5 read api Federation's maturity post, arriving weeks before the subsystem's decline. Read it for the tone: this is what a component sounds like when it is being described as ready and is about to be withdrawn.
Kubernetes supports OpenAPI 12-23 1.5 walk api OpenAPI arrives, replacing hand-maintained Swagger 1.2. The interesting part is that the post announces the middle rung: v2 is still served at the pin, v3 was added and is now the preferred one, and only the endpoint the post replaced is a 404. kubectl explain and CRD schemas read v3, so which rung you fetch changes what you get.

Exercises

Fifteen walk verdicts, numbered in publication order. All fifteen are written. The rubric they are authored against was ratified in #57; the section order and the ladder they use were amended in #78.

# exercise state
01 The trick in this post is now an API kind, and the object it borrowed is deprecated written
02 The label in this post is still served, the name is gone, and the spreading it calls automatic is not a guarantee written
03 Nothing in this post's fences ran as printed, and the manifest they were meant to create is three kinds of dead written
04 Every command in this post still runs, the one that made a Deployment now makes a Pod, and the field behind its rollback is gone written
05 Neither manifest in this post applies as printed, the API now accepts the defect it used to catch, and the behaviour the post leaves out is the only one that changes written
06 The annotation in this post still applies cleanly and has never done anything, and the architecture it describes is now on the API's own list of what it cannot do written
07 The closing promise of this post is now a documented pattern, every command in it fails, and the error it prints survives in the current documentation in three incompatible forms written
08 The project marked this post partly obsolete without saying which part, its one still-exact snippet is the one nobody should use, and its example manifest contradicts its own table written
09 The three stages in this post are still exactly right, all five of its own links are dead, and the hole its join command left open was renamed rather than closed written
10 This post became the current documentation almost word for word, and both annotations it printed outlived the removal notice it printed for one of them written
11 The canonical location this post promoted is unreachable from every page of the current documentation, and what outlived it is a label set the same documentation says nothing reads written
12 The dashboard this post built is gone, every latency segment it had to parse out of kubelet logs is now a histogram the kubelet emits directly, and all four of them are still alpha written
13 Both switches this post asks you to set have been removed — one because what it enabled became mandatory, the other because what it enabled was abandoned written
14 Nothing in the documentation admits PetSet ever existed, and the smaller rename inside this post’s own tutorial was left half-done in a sentence that still names an object nobody creates written
15 The endpoint this post tells you to fetch has moved twice, an authorization page still tells you to permit the version before the one this post announced, and the section describing the version that replaced it wears a badge from a switch that no longer exists written