Every source behind this page, graded and dated. Two tiers are absent and
the absence is explained below rather than hidden.
Postmortem
Zalando2019-02
Total DNS outage in Kubernetes cluster
A complete incident write-up with timeline, six contributing factors, lessons and
action items. Names the memory limit, the query amplification from the default search
domain setting, and the monitoring path that shared the failure domain.
Carry forwardCluster-wide singletons need locality, not headroom; the target is a blast radius of one node.
github.com/zalando-incubator/kubernetes-on-aws
Postmortem
Zalando2019-06
Build errors of the continuous delivery platform
Short and unusually precise: a default rate limit on the node agent, exposed by pod
churn on a single node, surfacing as a credential failure three components away. Links
the permanent fix as a configuration change.
Carry forwardAudit the defaults of adopted components for the cluster size they assume, and expect the symptom to appear far from the cause.
github.com/zalando-incubator/kubernetes-on-aws
Decision record
ZalandoAccepted
ADR-001: store cluster versions in the Cluster Registry
Defines the three version strings and argues for an opaque concatenated format so the
registry never learns the provisioner's internals. Lists rollback via the last working
version as a consequence rather than a feature.
Carry forwardA fleet reconciler is restartable only if every piece of its state is in a store it does not own.
docs/dev-guide/arch/cluster-lifecycle/adr-001.rst
Decision record
ZalandoUndated
ADR-003: organize cluster versions in branches
Maps configuration channels onto git branches and draws the promotion graph. Ends with
three explicit open questions about when promotion happens, how it is triggered and
what approval it needs, which the later record answers.
Carry forwardA decision record that ships its unresolved questions is more useful than one that pretends completeness.
adr-003-organize-cluster-versions.rst
Decision record
ZalandoUndated
ADR-005: how to use channels
Settles three channels, requires end-to-end tests on a freshly provisioned cluster per
pull request, and puts a human approval on the final promotion. Also states that the
first cluster updated after merge must be one with applications already running.
Carry forwardTest the update on a used cluster, not only a new one; upgrade bugs live in accumulated state.
adr-005-channels-usage.rst
Source
Zalando2026-09-08
delivery.yaml, the pipeline that gates every change
Shows the build triggering on dev, alpha, beta and stable plus pull requests, and a
step that creates a cluster on the cloud provider for end-to-end tests using a named
lifecycle-manager role.
Carry forwardWhere a record and a pipeline disagree, the pipeline is the architecture.
delivery.yaml
Source
Zalando2026-09-08
cluster/config-defaults.yaml
Around 1,540 lines of fleet defaults: Karpenter feature gates and excluded instance
families, a second provider named zalando-eks, control plane logging and IP family
settings, proxy migration flags, and the machine image carrying Kubernetes v1.36.3.
Carry forwardA defaults file is the most honest architecture document a platform has, because it is executed.
cluster/config-defaults.yaml
Source
Zalando2026-09-08
cluster/manifests, sixty-three component directories
The whole platform inventory in one listing: upstream components taken as-is next to
in-house controllers for ingress, identity, downscaling, cleanup, disruption budgets,
stacksets and metrics adaptation.
Carry forwardSort your own platform inventory into mechanism and policy; only the policy half justifies in-house code.
cluster/manifests
Source
Zalando2026-09-08
The in-house ingress controller, still deployed
Deployment arguments show network load balancer zone affinity, ALPN policy,
deregistration delay, container network interface target mode and a pod label selector
pointing at the proxy. Nine years of accumulated operational detail.
Carry forwardLongevity in a platform component correlates with how much local policy it encodes, not with how clever it is.
ingress-controller/deployment.yaml
Source
Zalando2026-09-08
Branch listing of the configuration repository
dev, alpha, beta and stable all updated on the same day, alongside standing
dev-to-alpha and beta-to-stable promotion branches and several component update
branches named after container images.
Carry forwardPromotion implemented as a long-lived pull request gives you an audit trail and a place to argue, for free.
branches/all
Source
Zalando2019-06-21
Pull request 2247: increase QPS for kubelet and controller manager
The structural fix from the June 2019 incident, with the author's description of the
default as ridiculously low. Merged on 21 June and promoted through alpha and beta to
stable by 25 June.
Carry forwardA four-day path from merge to production is a design output of the channel model, and it is measurable.
pull/2247
Source
Zalando2025-03
A pull request opened in order to fail
Titled as an update of the node provisioner to a specific version with the note that
this should fail. Closed without merging. Evidence that the gate is itself tested
rather than assumed.
Carry forwardProve your change gate rejects a known-bad change on a schedule, or you are trusting an untested control.
pull/9078
Source
Zalando2026-03
A closed proposal to disable AMD instance types by default
Opened and closed without merging in March 2026, in the same period as several other
node provisioning experiments. The exclusion list in the defaults file shows which of
these arguments ended up as configuration.
Carry forwardClosed pull requests are the only public record of what a platform team decided not to do.
pull/10710
Source
Zalando2019
Commit history of the postmortem directory
Four commits in total, between 4 February and 29 June 2019, by two authors. Nothing
since, while the repository as a whole took a change today.
Carry forwardPublication practices decay unless a pipeline enforces them; the artefacts that survive are the ones produced as a by-product of the work.
commits/dev/docs/postmortems
Case study
Zalando2017 era
Running Kubernetes in Production
The team's own operational account from the early migration: more than eighty
production clusters, one cluster per cloud account, an adapted provisioning tool,
Container Linux nodes, and five stated goals including no manual operations and no pet
clusters. Now a historical document contradicted by the configuration beside it.
Carry forwardDate every platform document at the top, or it will be read as current for a decade.
docs/admin-guide/kubernetes-in-production.rst
Source
ZalandoChecked 2026-09-08
Cluster Lifecycle Manager README
States that the component has been developed internally since January 2017, operates
more than two hundred clusters, and has carried the oldest cluster from Kubernetes v1.4
to v1.24 by continuous update. Describes the reentrant design and non-disruptive
rolling node updates.
Carry forwardIn-place continuous upgrade is achievable for a fleet, and the enabling property is that the reconciler holds no state of its own.
cluster-lifecycle-manager README
Source
ZalandoChecked 2026-09-08
Skipper, the layer-seven proxy
Self-reported production figures: 350,000 route definitions, more than one hundred
production clusters, daily traffic between 500,000 and 7 million requests per second,
15,000 ingress objects and 3,750 route groups, at a stated cost below five cents per
million requests.
Carry forwardThe one published unit cost in this corpus comes from a README, with no method attached; treat vendor-style numbers from your own teams the same way.
github.com/zalando/skipper
Source
CommunityChecked 2026-09-08
Patroni, after the handover
The PostgreSQL high-availability template written at Zalando now describes itself as
formerly known as Zalando's Patroni and as a fork of Governor, with no company
ownership language and support for several coordination stores.
Carry forwardGeneric mechanism can be given away and keeps working; company policy cannot, which is the same line that decides build versus rent.
github.com/zalando/patroni
Source
Zalando2023-03-27
Senza, from the platform that came before
The command line tool of the pre-Kubernetes in-house platform, carrying a shouted
notice that the project is not actively maintained any more. Its final tag is dated
March 2023, years after the successor platform was in production.
Carry forwardReplaced platforms do not stop; budget for the overlap, which here ran to several years.
zalando-stups/senza tags
Source
ZalandoChecked 2026-09-08
The deprecation notice on the previous platform
The tool that generated and executed CloudFormation templates for the pre-Kubernetes
platform still describes what it does at length, under a single shouted line saying
the project is not actively maintained any more. No date, no successor named, no
migration guidance.
Carry forwardA deprecation notice without a date and a successor is an unanswered question for whoever finds it in five years; write both.
github.com/zalando-stups/senza