Platform Engineering on Kubernetes, Why Your Developers Shouldn't Know EKS Exists | PulseSoft
PulseSoft

Platform Engineering on Kubernetes, Why Your Developers Shouldn't Know EKS Exists

PulseSoft Team · September 22, 2026 · 8 min read

Introduction

I once watched a senior backend engineer spend four hours debugging a failed deployment because of an imagePullBackOff caused by an ECR repository policy she didn't know existed and had no reason to know existed. She wasn't a bad engineer. She was a product engineer who'd been handed a Kubernetes manifest template and told "just edit this and apply it," which is the platform engineering equivalent of handing someone a car engine and telling them to drive.

That afternoon is the entire argument for platform engineering. Not as a buzzword, not as a rebrand of "DevOps" with a new org chart, as a genuine architectural discipline where the platform team's job is to make Kubernetes invisible to the people building product. If your developers can recite kubectl flags from memory, your platform engineering effort has already failed, no matter how good your cluster looks in a diagram.

This post covers what it actually takes to build a self-service developer platform on top of EKS: the abstraction layers that work, the ones that don't, and where teams consistently over- or under-invest.

The Core Problem: Kubernetes Exposes Infrastructure Concerns to People Who Shouldn't Own Them

Kubernetes was built for people running infrastructure, not people building product features. Every core primitive (Deployments, Services, Ingress, ConfigMaps, resource requests and limits, node affinity), assumes the person writing the YAML understands cluster topology, networking behavior, and failure modes. Most product engineers don't, and expecting them to is a misallocation of who should own what.

The pattern breaks down predictably. A team adopts Kubernetes, initially with good intentions around consistency and portability. Early on, a handful of infrastructure-literate engineers write the manifests and everything works because those engineers understand the underlying behavior. As the org grows, more product teams get onboarded, and the "just copy this YAML and change the values" pattern spreads. Nobody explicitly decided that every backend engineer should now understand pod resource limits, readiness probe semantics, and ECR authentication: it just happened by default, because nobody built the abstraction layer that should have prevented it.

The realistic failure mode I've seen most often: a product engineer sets resources.requests.memory too low because the YAML template had a placeholder value and nobody explained what it meant. The pod gets scheduled fine in a low-traffic staging environment, ships to production, and gets OOMKilled under real load: not because the engineer wrote bad application code, but because they were handed a Kubernetes concept without the platform context to use it correctly. That's not a training problem. That's a platform design problem: the platform should have set safe defaults and validated the request against known service tiers before it ever reached a developer's hands.

The fix isn't "make Kubernetes simpler", Kubernetes' complexity exists for legitimate reasons at the infrastructure layer. The fix is building a layer between developers and the cluster that absorbs that complexity on their behalf, so a developer's interaction with "deploying to production" looks like a git push and a service name, not a YAML review.

AWS Deep Dive: Building the Abstraction Layer on EKS

Golden Paths: Constraining the API Surface, Not Just Documenting It

A golden path is a pre-approved, opinionated way of deploying a specific workload shape (a stateless web service, a background worker, a scheduled job), that hides the underlying Kubernetes and AWS resources behind a much narrower interface. The mistake most platform teams make is treating a golden path as documentation ("here's our recommended pattern, please follow it") instead of as an enforced constraint. Documentation gets ignored under deadline pressure. Enforced constraints don't.

On EKS, the practical way to enforce this is through a combination of a templating or scaffolding tool (Backstage software templates, or a simpler internal CLI backed by Cookiecutter-style templates) that generates the Kubernetes manifests, paired with admission control that rejects anything that doesn't conform. Kyverno or OPA Gatekeeper policies enforcing required labels, resource limit ceilings, and disallowing hostNetwork or privileged containers mean a developer literally cannot deploy something that violates the golden path, even if they bypass the scaffolding tool and hand-write YAML.

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-resource-limits
spec:
  validationFailureAction: Enforce
  rules:
    - name: check-resource-limits
      match:
        any:
          - resources:
              kinds: ['Pod']
      validate:
        message: 'CPU and memory limits are required on all containers.'
        pattern:
          spec:
            containers:
              - resources:
                  limits:
                    memory: '?*'
                    cpu: '?*'

The non-obvious gotcha here: validationFailureAction: Enforce will block deployments outright, which is correct for production but will generate immediate pushback if you turn it on retroactively against an existing cluster full of non-compliant workloads. Roll new policies out in Audit mode first, generate a compliance report, fix the backlog, and only then flip to Enforce, otherwise you'll take down someone's Friday deploy and burn political capital you need for the rest of the platform rollout.

IAM and Secrets: Making Least-Privilege the Default, Not an Opt-In

The single biggest security win in a self-service platform is making least-privilege IAM the automatic outcome of using the golden path, rather than something a developer has to remember to configure. When a developer scaffolds a new service, the platform should provision a scoped IAM role via EKS Pod Identity automatically, tied to a naming convention, with permissions limited to a pre-approved policy template for that service tier, read/write to a specific S3 prefix, access to a specific Secrets Manager path, nothing else by default.

aws eks create-pod-identity-association \
  --cluster-name production \
  --namespace team-checkout \
  --service-account checkout-worker \
  --role-arn arn:aws:iam::123456789012:role/platform-generated/checkout-worker-role

Secrets access should follow the same pattern: the External Secrets Operator syncing from AWS Secrets Manager into Kubernetes Secrets based on a naming convention tied to the service and environment, so a developer references a secret by logical name and never touches an ARN or an IAM policy directly. The platform team owns the mapping; the developer owns the reference.

Multi-Tenancy: Namespace-per-Team vs Cluster-per-Team, and Where That Decision Actually Bites

This is the architecture decision that most platform teams get wrong early and pay for later. Namespace-per-team on a shared EKS cluster is cheaper to run and easier to manage centrally, but it requires disciplined network policy enforcement (Kubernetes NetworkPolicy or a CNI-level equivalent like Cilium) to prevent lateral movement between teams' workloads, and it means a single cluster upgrade or control plane incident affects every team simultaneously.

Cluster-per-team (or cluster-per-business-unit) isolates blast radius completely and lets teams with genuinely different compliance requirements operate independently, but multiplies your control plane count, your EKS version-upgrade operational burden, and your cost: each cluster carries its own control plane cost and its own baseline node capacity for system workloads. Most orgs land on namespace-per-team with strict NetworkPolicy and ResourceQuota enforcement up to a certain scale, then peel off specific teams (usually ones with distinct compliance boundaries, like payments or health data) into dedicated clusters once the isolation requirement becomes non-negotiable.

Rendering diagram…

Enjoying this so far?

Join thousands of engineers receiving practical engineering, Cloud, Distributed Systems, Infrastructure and AI engineering insights.

No spam. Unsubscribe anytime.

Tradeoffs & Decision Framework

Build vs buy for the platform layer: Backstage and similar internal developer portal frameworks give you a real foundation, but they require ongoing platform engineering investment to customize and maintain: it is not a drop-in solution. Managed platform-as-a-service options (including simpler PaaS layers on top of ECS or App Runner) trade flexibility for a much smaller build burden, and are often the right call for teams under 20-30 engineers where the platform engineering investment wouldn't pay for itself yet.

How much abstraction is too much: Over-abstracting so developers can never see or touch the underlying Kubernetes resources creates its own failure mode, when something breaks in a way the abstraction doesn't cover, developers have no mental model to debug it and everything escalates to the platform team, which becomes the bottleneck the platform was supposed to eliminate. The right level of abstraction hides configuration complexity but preserves observability, developers should be able to see their pod status and logs even if they never write a Deployment spec by hand.

Enforcement timing: Enforcing golden paths and admission policies too early, before you have organizational buy-in and a reasonable exception process, creates friction that turns developers against the platform team. Enforcing too late means you're retrofitting constraints onto years of inconsistent, hand-written manifests, which is a much larger and more painful project. The right timing is: build the golden path, get one or two willing teams to adopt it voluntarily and prove the developer experience is genuinely better, then enforce for new services immediately and give existing services a defined migration window.

What breaks at small team size vs what breaks at scale: At small team size, over-investing in a platform layer before you have enough services to justify it is the common mistake (you end up maintaining a platform for a platform team of one, which is a poor use of a scarce senior engineer. At scale, under-investing in enforcement), relying on documentation and tribal knowledge instead of admission control: is what causes the slow drift into inconsistent, insecure, hard-to-audit clusters that eventually require a costly remediation project.

Lessons From the Field

  1. After building a Backstage-based golden path for a Series B startup, developer time-to-first-deploy for a new service dropped from roughly two days of platform team hand-holding to under twenty minutes of self-service: the ROI on platform engineering only shows up once you measure this specific metric.

  2. In an engagement where we inherited a cluster with dozens of hand-written manifests and no admission control, rolling out Kyverno policies in Audit mode first, instead of Enforce, was the difference between a smooth rollout and an all-hands incident on a Friday afternoon.

  3. I've seen platform teams build an impressively sophisticated abstraction layer that developers actively avoided, because the abstraction hid failure information along with configuration complexity, if developers can't see why their deploy failed, they'll route around your platform entirely.

  4. The multi-tenancy decision that came back to bite a healthcare client wasn't a security incident: it was a routine EKS version upgrade that required simultaneous coordination across twelve teams sharing one cluster, because nobody had planned for staged, team-by-team upgrade windows.

  5. Every successful platform engineering rollout I've been part of had one thing in common: the platform team treated developer experience feedback as a product requirement, with the same rigor as a customer-facing feature, not as a nice-to-have.

Final Thoughts

Platform engineering on Kubernetes isn't about hiding complexity for its own sake, it's about putting the complexity in the hands of the people equipped to own it and getting it out of the way of the people who aren't. The teams doing this well in 2026 aren't the ones with the most sophisticated internal tooling; they're the ones who measured developer friction honestly and built just enough abstraction to remove it, with enforcement that scales as the org does rather than retrofitting years of inconsistency after the fact.

This is the kind of platform architecture work we do at PulseSoft, if you're trying to get Kubernetes out of your developers' way without losing the control your infrastructure team needs, let's talk.

Key Takeaways

  • Platform engineering on Kubernetes succeeds when developers interact with a narrow, opinionated interface, a golden path, instead of raw manifests, and fails when "self-service" just means copying a YAML template.
  • Golden paths need enforcement through admission control (Kyverno or OPA Gatekeeper), not just documentation, documented conventions get bypassed under deadline pressure, enforced ones don't.
  • Roll new admission policies out in audit mode before enforce mode; retroactively enforcing against an existing non-compliant cluster is a reliable way to break someone's Friday deploy.
  • Least-privilege IAM should be an automatic outcome of using the golden path via EKS Pod Identity, not a manual step developers have to remember and often skip.
  • Namespace-per-team with strict NetworkPolicy enforcement works for most orgs up to a point; peel specific teams into dedicated clusters once compliance boundaries, not convenience, demand real isolation.
  • Over-abstracting a developer platform so engineers can't see their own pod status or logs creates a support bottleneck at the platform team, preserve observability even as you hide configuration complexity.
  • Measure platform engineering success concretely, like time-to-first-deploy for a new service, rather than treating the platform as done once the golden path technically exists.

Get insights like this in your inbox

Join thousands of engineers receiving practical engineering, Cloud, Distributed Systems, Infrastructure and AI engineering insights.

No spam. Unsubscribe anytime.

← Back to Blog