all longreads
Longread#PlatformEngineering#SRE

Who Made Kubernetes So Complex? How Complexity Moved into Platforms and AI Agents

Kubernetes became a standard and even earned the highest engineering compliment: boring. It did not become simple. Some complexity came from the APIs themselves, some from our requirements, and almost all of it moved one floor up—into networking, platform teams, golden paths, and agent governance. This article separates necessary complexity from the layers we created and asks how to avoid building another system nobody can sustain.

July 21, 2026≈ 30 min

Project status and time-sensitive figures were reviewed on July 21, 2026. Community surveys, vendor telemetry, and practitioner opinions are kept distinct: no narrow benchmark or commercial report is treated as a universal fact. The final scorecard is an author heuristic, not an industry standard.

01

Infrastructure for half the market, maintained by two volunteers

In November 2025, SIG Network and the Kubernetes Security Response Committee announced the retirement of ingress-nginx. Maintenance ended in March 2026. There would be no more releases, bug fixes, or security patches. Existing installations would keep running, which made the risk easy to miss. In its January statement, the Steering Committee cited internal Datadog research indicating that ingress-nginx was present in roughly half of cloud-native environments.

The scale matters less than the reason. For years, one or two people maintained the project in their spare time after work. Its flexibility, especially the ability to inject arbitrary NGINX configuration through snippet annotations, slowly changed from an advantage into technical debt that the retirement notice called insurmountable. A 2021 vulnerability had already shown that snippets could expose cluster secrets. In March 2025, the IngressNightmare chain escalated the same class of design risk to unauthenticated remote code execution.

This is not merely one controller that went wrong. It is a model for the ecosystem: a small API fails to cover the production problem, an escape hatch becomes an informal programming language, adoption grows faster than ownership, and accumulated complexity becomes visible only after the layer is too important to remove cleanly.

There is therefore no single defendant in the case of Kubernetes complexity. Upstream shipped APIs with imperfect boundaries. Vendors and users extended them for production. Organizations demanded centralized compliance, multi-tenancy, meshes, custom control planes, and new workload types. Platform teams promised that another abstraction would hide the previous one. Complexity did not disappear; it changed owners.

diagram 01 · complexity rises with the abstraction layer
Kubernetes complexity moved upwardcomplexity was relocated, not removedKubernetes corescheduler · API · reconciliationExtensionsCRDs · operators · policiesPlatformgolden paths · portals · guardrailsAgent governanceidentity · authority · auditownershipand cognitiveload rise
02

Two complexity budgets: the problem and our solutions

Kubernetes manages a distributed system in which processes fail, networks partition, configuration changes asynchronously, and actual state must converge on desired state. That complexity is essential. It existed in Borg, in home-grown schedulers, and in shell scripts. Removing Kubernetes does not remove service discovery, rollout, isolation, capacity planning, or recovery. It only changes where those problems are solved.

There is also accidental complexity. PodSecurityPolicy lived for years, was deprecated in 1.21, and disappeared in 1.25. NetworkPolicy deliberately omitted deny rules and cluster-wide defaults, so centralized governance later required a separate AdminNetworkPolicy API. Policy engines grew outside core; Kubernetes then brought part of that work back into the API server through CEL-based ValidatingAdmissionPolicy. These are not merely business requirements. They are architectural decisions, some of which had to be reversed.

PeriodShiftWhat changed
2014–2015Kubernetes is open-sourced and reaches 1.0A common orchestration API becomes the industry's bet
2016–2019Operators and CRDsThe platform becomes a toolkit for building other platforms
2021–2024PSP exits; CEL entersCore revises its APIs and takes back part of the policy layer
2025–2026Ingress NGINX retires; Gateway API reaches 1.6Hidden annotation complexity gives way to explicit roles and policies

Tim Hockin, one of the project's founders, describes a finite complexity budget. Every feature spends more than lines of code: it spends the project's ability to explain, test, and eventually change behavior. The problem is particularly sharp in an extensible system. CRDs are among Kubernetes' strongest mechanisms and also the easiest way to turn a cluster into a distribution of dozens of independent products with unrelated upgrade cycles.

Why is Kubernetes called boring, then?

The CNCF Annual Survey 2025 reports that 82% of container users run Kubernetes in production, while 34% name complexity as a blocker. Culture, training, and security rank higher. That is an important counterweight to the disaster narrative: APIs stabilized, managed services became routine, operational patterns became known, and Kubernetes stopped being an experiment.

Adoption surveys and operating cost answer different questions. “We are no longer afraid to adopt Kubernetes” does not mean “Kubernetes is cheap and simple to run.” Once a dedicated platform function owns the burden, product teams genuinely stop seeing much of it. The system becomes more boring for its users and thicker for its owners.

03

Ingress to Gateway API: complexity becomes explicit

The original Ingress API was intentionally small: host, path, backend, and TLS. It had no common language for timeouts, retries, canaries, external authorization, header rewriting, or WAF behavior. Controllers filled the gap with annotations. By July 2026, ingress-nginx documented roughly 130 unique keys, while snippets allowed raw NGINX configuration. A locally simple API produced a global, non-portable domain language.

Gateway API does not answer with less YAML. It answers with an explicit model. GatewayClass belongs to the infrastructure provider, Gateway to a cluster operator, and Route to an application team. ReferenceGrant constrains cross-namespace references, status exposes what a controller actually accepted, and policy gets a formal attachment point instead of a string in metadata. As of this article, the current line is 1.6.x, with TCPRoute and UDPRoute graduated to GA.

diagram 02 · an annotation escape hatch gives way to an explicit model
From hidden Ingress complexity to explicit Gateway APIsimpler syntax did not mean a simpler systemSmall Ingress APIhost · path · backendAnnotation escape hatch~130 keys + snippetsSecurity debt2021 warning → 2025 RCEGateway API 1.6roles · routes · policiesGateway API is more verbose — and makes ownership, attachment, and status visible

The cost is explicit too. One route may now depend on several resources, while policy attachment must handle inheritance, conflicts, discoverability, and status fanout. GEP-713 itself acknowledges that the mechanism is more complex than its authors would like. Yet this is a different kind of complexity: it can be validated, observed, and divided between roles. An annotation looked simpler only until the first incident.

eBPF does not invalidate the argument

eBPF gave Cilium a powerful data plane and solved real hyperscale problems, but it is not the universal answer to Kubernetes networking. kube-proxy's nftables mode reached GA in Kubernetes 1.33 and removed the linear iptables lookup without replacing the entire CNI. Istio ambient removed per-pod sidecars through the Rust-based ztunnel rather than mandatory eBPF. Dramatic gains measured at a million containers should not be projected automatically onto a fifty-node cluster. A new data plane is justified when it solves a measured constraint, not because the previous layer looks unfashionable.

04

Many clusters are not the same as many failure boundaries

Cluster separation is useful for blast radius, versions, regions, tenants, and upgrade requirements. The number of control planes alone guarantees nothing. In March 2023, Datadog lost networking on more than 60% of its instances across five regions and three cloud providers. A systemd security update, distributed through one shared policy, removed Cilium routes. The fleet was geographically and commercially diverse but still correlated through its OS image and update mechanism.

diagram 03 · correlated layers cross cluster boundaries
Cluster count does not define blast radiusfour clusters can still share one failurecluster 1cluster 2cluster 3cluster 4Correlated shared layersOS image · CNI · GitOps hub · supply chain · update policyindependence is an architectural property, not an object count

The same trap appears in hub-and-spoke GitOps, a single registry, a global identity provider, a common admission webhook, or one Cluster API template. A hundred clusters updated by one policy within an hour are one failure domain with a hundred control planes. Independence requires separation not just of runtime but of change delivery, trust, artifacts, and authority.

Cluster count also has a direct price. EKS charges $0.10 per hour for a control plane under standard support and $0.60 under extended support for an old version. Across fifty clusters, delayed upgrades become a budget line rather than a minor inconvenience. Multi-cluster should be a deliberate isolation model, not a reflex to “create one more.”

A useful architecture-review question is: which five shared layers can still change every cluster at once? That list reveals more than a diagram containing many regions.
05

The IDP absorbed complexity and became a system of its own

Platform engineering did not emerge because developers wanted another portal. Kubernetes standardized runtime but left product teams with too many decisions: charts, policy, networking, observability, secrets, rollout, and ownership. An internal developer platform assembled those decisions into a golden path and offered self-service instead of tickets. Team Topologies supplied the right goal—reduce cognitive load—and a useful constraint: a Thinnest Viable Platform may be curated agreements and templates rather than a portal.

Backstage demonstrated the product form: catalog, templates, documentation, and plugins. That form is natural at large scale. Avito's platform serves thousands of services and hides Kubernetes behind anapp.toml file and a CLI. Ozon values uniformity over local perfection. T-Bank has built its internal platform since late 2020 with a team of roughly fifty engineers. These examples do not prove that every company needs an IDP. They demonstrate the scale and sustained ownership required to operate a real internal PaaS.

Better for the developer, not necessarily for the system

DORA 2024 found a paradox. Internal-platform use was associated with 8% higher individual productivity and 10% higher team performance, while change throughput fell by 8% and change stability by 14%. The report offers a cautious J-curve interpretation: an immature platform creates transition costs before its benefits arrive. Less comfortable explanations are also possible—a new queue, an abstraction that is too thick, or a platform optimized for satisfaction rather than flow.

diagram 04 · local developer experience and system delivery can diverge
The internal developer platform paradoxthe developer can feel faster while delivery gets worseLocal experience+8% individual productivity+10% team performanceDelivery system−8% change throughput−14% change stabilityA golden path stays legitimate only while it measuresoutcomes, preserves escape hatches, and earns adoption

This is the boundary between a golden path and a golden cage. Sam Newman warns that a mandatory platform loses its incentive to be good because users cannot leave. Yet security, compliance, and audit do not work as optional suggestions. Permitting everything is not product thinking; banning every alternative is not product thinking either. A legitimate mandate protects verifiable invariants rather than one implementation of every delivery step.

  • identity, audit trail, encryption, and policy evidence are mandatory;
  • service templates, CI/CD, and the self-service interface are preferred but replaceable;
  • exceptions have an owner, an expiry date, and an explicit support cost;
  • the platform measures lead time, reliability, and safely completed intents—not the number of generated components.
06

The next cycle: GPUs and agents replacing kubectl

AI workloads exposed another boundary in Kubernetes' original model. The device plugin framework arrived in 1.8 but treated a GPU as a whole integer for years. MIG, time-slicing, separate schedulers, and the GPU Operator filled the gap in different ways. Dynamic Resource Allocation reached GA in 1.34 after an API redesign, while fractional capacity continued separately. It is the same cycle again: a small primitive, expanding requirements, an ecosystem of workarounds, and eventually a more explicit model in core.

CNCF calls Kubernetes the de facto operating system for AI, while vendor reports simultaneously show low utilization of expensive GPUs. Those numbers cannot be merged. The first describes adoption among container users; the second describes telemetry from a particular optimization vendor and its sample. Together they pose a useful question: does the standard help manage the workload, or merely provide a familiar interface to a new inefficiency?

The industry wanted humans away from kubectl before LLMs

In 2017, Kelsey Hightower compared kubectl to the new SSH: direct human control of production was evidence that a higher-level interface was missing. K8sGPT, kubectl-ai, HolmesGPT, kagent, and MCP servers now compete for that role. Assistance, however, is not autonomy. IBM Research'sITBench contains 94 reproducible SRE, CISO, and FinOps scenarios. The strongest agents in the original study solved 13.8% of SRE tasks, 25.2% of security tasks, and none of the FinOps tasks. That is far from a general license to modify production.

A useful agent starts with read-only diagnosis, inherits the user's identity and RBAC, presents evidence, and can hand the investigation to a human. The widely used Kubernetes MCP Server in the containers organization talks directly to the API server and exposes--read-only and --disable-destructive modes. A flag is not governance, but it marks the correct product boundary: reading a cluster and changing it require different contracts and evals.

diagram 05 · agent authority grows only with evidence
Governance ladder for Kubernetes agentsauthority must grow slower than capability01read02recommend03approve04act05rollbackevery step needs identity · policy · evidence · a human handoff

The read → recommend → approve → act → rollback ladder must apply to a specific capability, not to a model's general intelligence. Restarting a pod, performing rollout undo, and draining a node need different policies, sandboxes, blast radii, and stop conditions. Every level retains identity, a policy decision, a trace, human handoff, and a tested rollback. Otherwise the agent becomes the next snippet: a convenient escape hatch that later turns into an ungovernable API.

07

How to avoid adding the next layer too early

“Do we need Kubernetes?” is too coarse a question. The real choice is the thickness of the operating model. A ten-person team may need Docker and managed deployment. Dozens of teams may need a common Kubernetes API without an internal portal. A full IDP is justified when repeated demand, compliance, and coordination cost exceed the cost of another platform product.

diagram 06 · scale helps only when platform maturity grows with it
When Kubernetes is justified
Number of services and teamsPlatform maturityNot yet neededStrong candidateToo earlyDanger zoneMature PaaS exists and variance is lowMany services and a platform team existsComplexity exceeds the actual valueScale is here, maturity is missing
ModelWhen it fitsWhat it providesMain risk
Simple deploymentFew services, one team, predictable trafficThe smallest failure surfaceManual operations and a growth ceiling
Managed KubernetesYou need the orchestration API and ecosystem, not your own control planeA standard, managed foundationYou still own the operating layer above it
Thin platformSeveral teams repeat the same delivery pathTemplates, policy, and self-service without an internal SaaSThe platform must stay deliberately thin
Full IDPMany teams, heavy compliance, and a dedicated platform product functionOne interface and governed golden pathsMonopoly, leaky abstractions, and another product to operate

A scorecard before the next platform layer

This is not a maturity benchmark or a universal developer-count threshold. It is a set of six questions that expose ownership cost before another mandatory API exists.

CheckQuestionSufficient evidence
ProblemWhich observed pain does the new layer remove?Not 'we need a portal,' but median lead time and manual approval rate
OwnerWho operates and upgrades it three years from now?A team, budget, SLO, on-call rotation, and escalation path
BoundaryWhat remains shared and correlated?OS, CNI, GitOps hub, registry, identity, and policy engine
ExitCan teams bypass the abstraction safely?A documented escape hatch and an explicit exception cost
MetricWhat must improve for the whole delivery system?Throughput and stability alongside developer experience
RemovalHow will the layer be retired if it fails?A shutdown criterion, state export, and reversible migration

If there is no measured problem, durable owner, or removal plan, the safest choice is not to build the layer. If the problem is real but the audience is small, start with a TVP: documentation, a template, and one observable capability. A portal, control plane, or agent comes only after repeated demand has been demonstrated.

Takeaways

What to carry into the next design review

  1. 01Kubernetes contains both the essential complexity of distributed systems and accidental complexity created by its own APIs. Blaming everything on requirements is as misleading as blaming YAML alone.
  2. 02Maturity made Kubernetes familiar, not free. Much of its complexity moved into operations, platform teams, and shared guardrails.
  3. 03Gateway API is not necessarily shorter than Ingress. Its advantage is that roles, relationships, status, and policy become explicit and governable.
  4. 04Many clusters do not automatically create many independent failure domains. Blast radius follows correlated shared layers and common update mechanisms.
  5. 05IDPs and AI agents work when they bound authority, preserve a debugging path, and improve system-level delivery metrics—not when they hide Kubernetes at any cost.
Sources

Primary material, research, and practitioner positions

Kubernetes evolution

Market research

Networking and routing

Fleet reliability

Platform engineering

Russian case studies

AI workloads and agents

Share