OpenAI's published account of its December 2024 incident describes a new telemetry service, deployed across a large Kubernetes fleet, whose API calls overwhelmed the Kubernetes control plane; DNS-based service discovery then degraded, and because DNS results were cached the impact appeared gradually. Remediation required the same control plane that was unavailable. Reconstruct the failure and name the design decisions that allowed it.
Show the full answer Hide the answer
The trigger
A monitoring change, not a product change. A new telemetry service was rolled out fleet-wide and its configuration caused every node's agent to make expensive calls to the Kubernetes API servers. The aggregate load exceeded what the control plane could serve.
The shape worth noting: this was an observability improvement, which is the change class least likely to be treated as risky and most likely to be deployed everywhere at once.
Why it propagated
Because the control plane was a shared dependency of something on the data path. Service discovery in the cluster resolved through DNS that depended on the Kubernetes control plane for its records. When the API servers degraded, DNS records stopped being refreshed, and services progressively lost the ability to find each other.
The decisive design decision is here: a data-plane function depending on a control-plane component. The usual expectation is that a control plane manages change and a data plane serves traffic, so a control-plane outage should stop deployments and not stop requests. Service discovery sitting across that line converts a management-plane failure into a serving failure.
Why detection and attribution lagged
DNS caching. Cached results kept working until their time-to-live expired, so the impact arrived staggered across services and nodes rather than all at once. A gradual, partial, service-by-service degradation looks like many independent problems, and the natural first hypothesis is a dependency or a network issue rather than a single root cause.
Caching delayed the symptom and did not prevent it, which is the general property: a cache in front of a failing dependency converts an immediate outage into a slow one, buying time only if somebody uses the time.
Why remediation was blocked
The fix required scaling down or reconfiguring the telemetry agents, and the mechanism for doing that is the Kubernetes control plane, which was the thing that was unavailable. This is the circular dependency that turns a short incident into a long one: the tool needed to apply the fix runs on the system being fixed.
Recovery therefore required reducing load on the API servers by other means to get enough control plane back to issue the real fix, which is slower and more delicate than either step alone.
The structural fix versus the tempting local fix
Tempting: rate-limit the telemetry agent's API calls. Necessary, and it fixes this instance rather than the class.
Structural, in order:
- Break-glass access that does not depend on the data plane or the control plane being healthy. Direct node access, a mechanism to stop a daemon fleet-wide without the orchestrator, and a documented, rehearsed path. If the only way to change the system is the system, recovery time is unbounded.
- Treat observability changes as deployments. Staged rollout across a fraction of nodes, a bake period, and an automatic abort on control-plane health. The change class that monitors the system is not exempt from the controls that protect it.
- Isolate the control plane's failure domain from data-path functions. Service discovery and DNS should survive a control-plane outage, which means caching with long or static fallback records, or a discovery mechanism that does not read from the orchestrator on the request path.
- Admission or quota limits on what any agent may ask of the API servers, enforced by the platform rather than by the agent's own configuration.
- Load-test the control plane, which almost nobody does. Capacity planning tends to cover request-serving tiers and treats the orchestrator as infrastructure that simply works.
When this is the wrong lesson to draw
Do not conclude that observability agents should be rolled out slowly in general. A security or telemetry agent that lags behind the fleet is its own risk, and a staged rollout measured in days leaves nodes unmonitored or unprotected. The control that matters is a bake period long enough for control-plane health to move — minutes, not days — plus an automatic abort, not a slow schedule.
Also do not build full break-glass machinery for a single small cluster one team can reach directly. The trigger is a fleet large enough that the orchestrator is the only practical way to change anything, which is where the circular dependency becomes expensive.
The general lesson
Your management plane is a production dependency, and anything deployed to every node at once has the blast radius of the whole fleet — including agents, collectors and security tooling, which are usually rolled out fleet-wide by design.
The test to apply: list everything that is deployed to every node simultaneously, and for each one ask what happens if its next configuration is wrong. The list is usually short, surprising, and owned by teams that do not think of themselves as shipping to production.