Gartner projected that by 2026, 80% of large software engineering organizations would have a formal platform engineering team, up from 45% in 2022 (see Gartner's 2024 report). That fast a build-out is exactly why platform engineer interview questions have gotten harder to prep for generically. Companies are filling the role faster than the market is producing engineers who've actually run one.
The most common miss isn't a knowledge gap. It's candidates walking into a platform engineering loop prepared like it's a senior DevOps screen instead, a Kubernetes object model refresher, a rehearsed CI/CD diagram, Terraform state trivia. None of that is wrong exactly. It's just answering a different question. A platform engineer isn't judged on whether the infrastructure works. They're judged on whether 200 engineers who've never read the module source can use it safely, without filing a ticket, at 2am if they have to.
A 2026 review in Frontiers in Computer Science found 94% of surveyed organizations already run platform engineering practices or plan to within a year. This page covers the 45 questions that actually separate candidates in that hiring wave: self-service infrastructure, golden paths, multi-tenant Kubernetes, and the reliability math that's specific to owning the platform layer, not the SLO math for one service sitting on top of it.
Infrastructure as code and self-service provisioning
Terraform interview questions and platform engineer interview questions overlap right here, but the bar is different. A DevOps loop checks whether you can write a module that works. A platform loop checks whether 200 people who've never opened that module's source can run it safely without you in the room.
Easy questions
15The module stops being documentation for one team's mental model and starts being the actual interface other teams interact with. Every variable name, every default, every error message is now UX, because the person hitting a validation error at 4pm on a Friday probably doesn't know Terraform well and definitely doesn't know your module's internals.
That shift changes what "good" looks like. A senior engineer's own Terraform can afford to be a little clever if they're the one maintaining it. A platform module can't, because cleverness is exactly what breaks when someone else has to debug it without you.
Whether it's actually stuck or just slow. Some resources, an RDS instance, a CloudFront distribution, legitimately take 15 to 20 minutes to provision, and a quiet CLI during that window looks identical to a hang. Check the cloud provider's console for the resource's real status before assuming the pipeline broke.
If it really is stuck, the usual suspect is a state lock nobody released from a previous run that crashed mid-apply. Force-unlocking without checking whether that earlier run actually finished is how you end up with state that no longer matches reality, so check first, don't just unlock and retry.
A golden path is the default a team gets if they do nothing, the paved road that's fast, supported, and already secure. A mandate is a rule with no easy way to comply. The difference matters because a golden path should be easier than the alternative, not just approved. If teams keep choosing the unsupported route anyway, the path isn't actually golden, it's just the option platform documentation prefers.
Red flag answer: describing the golden path as something teams are required to use. The best platform teams treat opting out as a signal worth investigating, not a compliance violation to escalate.
Done means they've shipped production code without a platform team member walking them through it, not that they finished a tutorial. Tutorial completion and actual independence are two different states, and a lot of onboarding metrics only measure the first one.
Track time-to-first-commit, time-to-first-production-deploy, and how many times the platform team got pinged during week one. If that last number stays high even after a polished onboarding doc, the doc isn't the problem, something in the actual workflow still needs a human.
DORA measures delivery outcomes, deployment frequency, lead time, change failure rate, time to restore, which is real signal, but it's downstream of dozens of decisions a platform team made months earlier. A platform team that cuts time-to-first-deploy from two weeks to two hours for new services won't show up anywhere in DORA's four metrics, because DORA never measured that starting line to begin with.
Platform impact is closer to a multiplier on everyone else's DORA numbers than a DORA number of its own. Reporting only DORA to leadership tends to make platform work invisible right up until something breaks.
Cluster-per-team gives clean isolation and a smaller blast radius, at the cost of running, and patching, and upgrading, dozens of control planes instead of a handful. Shared clusters are cheaper to operate and easier to keep consistent, at the cost of every tenancy boundary having to be enforced in software instead of by default.
Most platform teams land somewhere in between, a small number of shared clusters segmented by trust tier, production versus internal tools, regulated versus not, rather than either extreme. Pure cluster-per-team rarely survives contact with an actual budget once you're past a dozen teams.
A security boundary means RBAC, network policy, and quota actually enforce isolation between what's in the namespace and what's outside it. An org-chart namespace is just a label, "this is team X's stuff," with no real enforcement behind the boundary. Using namespaces purely as org labels while assuming they're also security boundaries is how a workload in one "isolated" namespace ends up with network access to a database in another.
The fix isn't complicated. It's making sure the network policy and RBAC actually exist, not assuming the folder-like structure of namespaces implies isolation on its own.
Everyone, immediately, whether or not their own service has a bug. That's the entire difference from a normal app outage, where impact is usually scoped to one service's users. Communication has to go organization-wide within minutes, not to one team's Slack channel, because every engineer who tries to deploy in the next hour is about to hit the same wall and open the same ticket if nobody told them first.
Platform teams need runbooks written for this specifically, not just a link to the underlying tool's documentation. "The control plane is down" and "here's what to do while it's down" are two different pieces of information, and only the second one actually helps anyone in the next ten minutes.
A platform incident's root cause lives in shared infrastructure, the thing every team depends on. An app incident's root cause lives in one team's code or config. The postmortem owner should be whoever actually controls the fix, and conflating the two means the wrong team ends up holding action items they have no ability to close.
Multi-team incidents, a platform bug that also exposed a bad assumption in one app, sometimes need both postmortems, one from each owner, rather than forcing a single document to cover two different root causes with two different fixes.
Infrastructure as Code means your infrastructure's desired state, VPCs, IAM roles, clusters, is written in a file and version controlled, instead of clicked together in a console. The tool (Terraform, Pulumi, CloudFormation) compares that file to what's actually running and reconciles the difference.
Drift happens when reality diverges from the file, usually because someone made a manual change in the console during an incident, or a script outside the pipeline touched a resource directly. On a single team's infrastructure that's annoying. On a shared platform it's dangerous, because the next apply from any of the 40 teams using that module might silently revert someone's emergency fix, and nobody watching the pipeline run knows that fix ever existed. That's why platform teams run drift detection as a scheduled job, a plan-only run against every managed resource, not just at apply time, and treat any unexpected diff as an incident to investigate before the next real apply goes out.
DevOps was always a philosophy, not a team: developers and operations collaborate, the team that builds a service also runs it, you don't throw code over a wall. It never specified who builds the tooling that makes that practical.
In practice, without a dedicated team, "DevOps" meant every product team reinvented its own CI/CD pipeline, its own IAM setup, its own monitoring stack, because nobody owned making that easy. Platform engineering is the answer to that gap: a team that treats the internal tooling, the CI templates, the provisioning workflows, the deploy pipeline, as a product, with other engineering teams as its customers. The DevOps philosophy still holds, teams still own what they run, but the platform team builds the paved road so that owning it doesn't mean every team solving the same infrastructure problems from scratch.
A registry stores built images as immutable, content-addressed artifacts, each one identified by a digest, not just a mutable tag like latest. That immutability is the whole point: when you promote an image from staging to production, you're promoting the exact same bytes by digest, not rebuilding or re-tagging something that could have changed underneath you.
Beyond storage, a registry handles fine-grained IAM (which team can push to which repo), vulnerability scanning hooks that run automatically on push, retention and garbage collection policies so old images don't pile up forever, and replication across regions. If you just dumped build artifacts into your CI system's own storage, you'd lose all of that: no per-team access control, no scanning integration, and usually no clean way to guarantee the artifact you tested is the exact artifact you deployed.
An API gateway sits at the edge of your system and handles north-south traffic, requests coming in from outside: authentication, rate limiting per API key, routing an external request to the right internal service. A service mesh handles east-west traffic, service-to-service calls happening entirely inside your infrastructure: mutual TLS between services, retries, timeouts, circuit breaking, usually implemented as a sidecar proxy sitting next to each workload (Envoy, with Istio or Linkerd as the control plane).
They both do traffic management, but at different boundaries and for different consumers. A platform team stands up both when it needs to govern external partner traffic, rate limits, API versioning, auth, at the gateway, while also needing consistent security and observability between its own internal services without every team hand-rolling retry and mTLS logic in their own code. Skipping the mesh usually means that logic gets duplicated, inconsistently, across every service's application code instead.
Environment variables are static and they leak in more places than people expect: process listings, crash dumps, accidental echo statements in a CI log, a debug endpoint that dumps env. Once one leaks, you have to find every place it's used and rotate it manually, and until you do, whoever has it can use it.
A secrets manager centralizes issuance and makes credentials short-lived by default. Vault can issue a database credential that's valid for an hour and auto-expires, log every single read with who requested it and from where, and revoke access instantly without redeploying anything. For a platform team specifically, this also means no application code and no CI pipeline ever touches a long-lived master credential directly, they get a narrowly scoped token, and the blast radius of a leaked token is one service for one hour instead of your whole database forever.
An SBOM, software bill of materials, is a manifest of every dependency in a built artifact, direct and transitive, usually in a standard format like SPDX or CycloneDX. It tells you exactly what's inside a piece of software you shipped: every library, every version, down several layers deep.
The platform team owns generating it because the build pipeline is already shared. Attaching SBOM generation to the golden path CI template is one integration point, instead of 200 teams each wiring up their own scanner with their own gaps. It also matters the day a critical CVE drops, log4shell being the textbook example, where the security team needs to answer "which of our 300 services are affected" in minutes, not by emailing every team lead and waiting for replies. With centralized SBOMs, that's one query against artifacts already on file.
Medium questions
23One state file per service, not one shared state for the whole platform. Each team's provisioning run gets its own backend key, usually namespaced by team and service name, so a bad apply from team A can't lock or corrupt team B's state. Remote state with locking, S3 plus DynamoDB, or Terraform Cloud's native locking, handles the concurrent-apply case within a single team's state.
The scaling failure mode isn't locking. It's a monolithic state file that grows until every plan takes six minutes and touches resources three unrelated teams depend on. Splitting state by service boundary early costs a little more setup and saves you a genuinely bad afternoon later.
Terraform runs as a CLI step in a pipeline and produces state as a file. Crossplane runs inside Kubernetes as a controller, so infrastructure becomes a custom resource that reconciles continuously, the same way a Deployment does. That continuous reconciliation is the actual selling point. If someone changes something out of band, Crossplane notices and corrects it without waiting for a scheduled plan-and-apply run.
The trade-off is operational surface. Crossplane means running and maintaining another thing on your cluster, providers, compositions, RBAC for the controller itself, and a debugging model most engineers haven't built intuition for yet. Terraform's ecosystem and hiring pool are both bigger right now. I'd reach for Crossplane specifically when the platform's own API needs to feel like Kubernetes to the teams using it, and Terraform everywhere else.
Bake required tags into the module itself, not into a policy someone's supposed to remember. If team, cost-center, and environment aren't set, the module should fail to plan, not fail an audit six months later. A default tags block at the provider level catches anything an individual resource forgets.
Retrofitting this onto existing infrastructure is the part nobody enjoys. You end up writing a scan that flags untagged resources, then chasing down owners for things provisioned two platform-team-members ago. Enforce it at creation time and you never have to run that chase again for anything new.
provider "aws" {
default_tags {
tags = {
team = var.team
cost_center = var.cost_center
managed_by = "platform-terraform"
}
}
}Short-lived, workload-identity-based credentials beat any secret you'd have to store. The pipeline's CI runner assumes a role via OIDC federation, gets temporary credentials scoped to exactly what that job needs, and nothing long-lived sits in a variable anywhere. For secrets the provisioned infrastructure needs at runtime, a dynamic secrets engine like Vault issues a credential when the workload starts and rotates it on a schedule, instead of Terraform writing a static value into state.
The thing to watch for is secrets leaking into Terraform state itself, since state is plaintext by default. Anything genuinely sensitive should be a reference the runtime resolves, not a value Terraform manages directly.
Pin the provider version explicitly in every module and bump it behind a new module version tag, v4.2.0 to v5.0.0, rather than letting a floating constraint pull the new provider into every team's next apply automatically. Teams opt into the new module version on their own schedule, same as any other breaking change in a library they depend on.
The two broken modules get fixed and tagged before anyone's forced onto v5. I don't think there's a way to make a breaking provider change fully invisible to consumers. The honest answer is you're trading a big-bang break for a slower, opt-in migration, and the slower option is almost always worth it when fifteen teams depend on the same code.
You can't fully decide this upfront. Start with the 80% case, the deployment pattern most services actually need, and watch where real teams deviate and why. Deviation for a genuine reason, a stateful workload, an unusual compliance requirement, tells you the path is too narrow. Deviation because the path is annoying to use tells you something different, and it's worth fixing before you conclude the team just doesn't want to follow process.
I'd rather ship a narrower golden path early and widen it from real deviation data than guess at every edge case before a single team has used it.
A service catalog template, Backstage or an equivalent, collects a handful of inputs, name, owner, language, and generates a scaffolded repo with a working pipeline, IAM role, and observability wired in from the first commit. The template itself provisions the supporting infrastructure through the platform's Terraform modules, not through a Slack message to a platform engineer.
Guardrails run automatically during that scaffolding: naming conventions enforced by the template, a security baseline scan on the first commit, cost tags applied by default. The developer's first PR is application code, not YAML they had to reverse-engineer from another team's repo.
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: checkout-api
annotations:
platform.internal/cost-center: payments
spec:
type: service
owner: team-payments
lifecycle: productionAsk the developers directly before touching a dashboard. Usage metrics tell you what happened, not why, and teams often assume the barrier is the UI when the actual blocker is a step nobody automated, an approval that still routes through a human, a network policy that still needs a manual ticket regardless of what the self-service form promises.
I've seen platform teams spend a quarter polishing a form's UX when the real fix was removing one unautomated approval step buried three clicks in. Self-service adoption is the metric everyone tracks, but on its own it can't tell you what's actually stopping people from adopting it.
DORA metrics, deployment frequency, lead time, change failure rate, time to restore, give you a delivery baseline, but they measure the pipeline's output, not whether developers enjoy using the platform underneath it. Time-to-first-deploy for a new service and time-to-first-commit for a new hire sit closer to developer experience directly, and both are available almost immediately after each event.
Developer NPS and quarterly surveys capture how people actually feel, but the lag is real, weeks to a quarter between a bad platform experience and it showing up in a survey response. That mismatch between fast automated signals and slow sentiment signals is mostly unsolved right now, and I don't think anyone's fully cracked it.
One complaint is an anecdote, not a finding. Check queue time and ticket volume trends over the actual period in question, not just since the complaint came in. The more useful signal is behavioral: are teams requesting things that should already be self-service, and are teams provisioning infrastructure outside the platform entirely because going around you is faster than going through you.
That second pattern, shadow infrastructure nobody told you about, is a worse sign than a slow queue. A slow queue is annoying. Teams quietly building around your platform means they've already concluded it's not worth using.
A CI/CD tool runs a pipeline, build, test, deploy, for one specific commit. A service catalog is the map of everything that exists, who owns it, what depends on what, and what golden path it's built from, sitting above any individual pipeline run. Backstage doesn't deploy anything itself. It's the front door developers use to discover, scaffold, and understand services, then hand off to whatever CI/CD system actually runs the deploy.
People conflate them because a good catalog implementation makes the pipeline feel like part of the same tool. It isn't. You can have excellent CI/CD and zero discoverability, or a beautiful catalog with a pipeline nobody trusts, and platform teams that only invest in one usually find out the hard way which one they skipped.
It tells you the template stopped serving that team's actual need at some point, and forking was faster for them than filing a request and waiting. That's useful information even though it feels like a loss. Treat it as a support ticket, not a policy violation, and find out specifically what they needed that the shared version didn't provide.
The response depends on whether the fork solves a one-off problem or a pattern other teams will hit too. If it's a pattern, that capability probably belongs back in the shared template. If it's genuinely one-off, let them own the fork, but keep it on your radar. An unmaintained fork of a security-relevant pipeline is a real liability a year later when nobody remembers it exists.
Yes, entirely. "Revert it and go through the process" is the wrong first instinct if the bypass got a real outage fixed faster and didn't touch anything security-sensitive, that's the platform's process failing to accommodate a legitimate emergency, not the team's failure to follow rules. Bypassing a security control or a compliance gate during the same outage is a different severity of problem regardless of the good intent behind it.
The response either way includes the same question afterward: why was the safe path slower than the bypass. If a team routinely finds it faster to go around you during an incident, your process has a gap the postmortem should surface, not just the individual bypass.
Scoped RBAC roles bound to a namespace, generated automatically when the platform provisions that namespace, not hand-written per team. A team gets full control inside its own namespace and effectively nothing outside it. Cluster-scoped permissions, CRDs, node access, anything cluster-wide, stay with the platform team, full stop, regardless of how senior the requesting engineer is.
Temporary elevated access for a real migration or incident goes through a break-glass process, logged, time-boxed, and automatically revoked, not a standing exception someone forgets to remove. Standing exceptions are how "temporary" access from eight months ago turns into the finding in next year's security audit.
It intercepts every object before it's persisted to the cluster and either allows, denies, or mutates it against a policy you've written, no privileged containers, no unrestricted ingress, no missing resource limits, once your platform decides those are non-negotiable. Without it, those rules live in a wiki page nobody reads under deadline pressure, and enforcement depends entirely on code review catching a manifest that violates policy.
The gap shows up specifically at 2am during an incident, when someone applies a quick fix manifest that skips review because the outage matters more right now than the process. An admission controller enforces the same rule whether it's a calm Tuesday or a live incident, which is exactly when a human reviewer is least likely to catch it.
violation[{"msg": msg}] {
input.review.object.spec.containers[_].securityContext.privileged == true
msg := "privileged containers are not allowed on this cluster"
}A namespace with scoped RBAC, its own quota, and a self-service path for the things teams actually need day to day, deploying, scaling, viewing logs, rolling back, covers most of what "cluster-like" means to a product engineer. Very few teams actually need cluster-admin. They need the specific dozen actions cluster-admin happens to include.
Virtual clusters, vcluster and similar projects, push this further by giving a team something closer to their own API server inside a shared physical cluster, which is a newer pattern. I haven't seen enough production mileage on it yet to call it a default recommendation over well-scoped RBAC.
CI validated syntax and maybe a policy check against a static manifest. It didn't validate against the live cluster's actual state, existing resource pressure, a conflicting object, a webhook rejecting it for a reason CI doesn't know about. That gap is the platform's to close, by adding a dry-run or diff step against the real cluster before merge, not the team's fault for trusting a green CI check.
Once that gap is closed for this failure mode specifically, a repeat of the exact same failure becomes the team's responsibility again. The first time a class of failure slips through, it's a platform gap. The second time the identical thing happens, it's a process the team didn't follow.
A cost allocation tool, Kubecost or the cloud-native equivalent, attributes shared cluster spend down to namespace or label, using actual resource requests and node cost rather than an even split across tenants. A team sees their own namespace's dashboard, not the account-wide bill or what any other team is spending.
This only works if resources were tagged and namespaced consistently from provisioning, which loops back to the tagging enforcement from the Terraform section above. Cost visibility built on top of inconsistent tagging just produces a dashboard nobody trusts, which is arguably worse than no dashboard at all.
First, whether it's a one-off ask or a signal the whole platform is falling behind. Kubernetes' release cadence is fast enough that "we're two versions behind" is a common, survivable state, but "we're four versions behind and every feature request hits this wall" means the upgrade cadence itself is the actual problem, not any single request.
If it's genuinely a one-off, a documented upgrade timeline with a real date beats a vague "soon." If the underlying platform is chronically behind, that request is the symptom, and the fix is prioritizing the upgrade cadence, not finding one more workaround for one more team.
Measure the platform's own promises: provisioning latency, how long a self-service request takes to complete, pipeline availability, can teams actually deploy right now, and control plane uptime, independent of whether any individual application built on top of it happens to be healthy. A platform can be perfectly reliable while three application teams are having a terrible week for reasons that have nothing to do with the platform, and the SLOs need to separate those two things cleanly.
The awkward part is that a platform SLO breach often causes an application SLO breach downstream, so postmortems need to trace which one actually failed first. Blaming the platform for an app team's bug, or the reverse, is the fastest way to make the wrong team spend a week fixing something that was never broken.
An app team's bad deploy affects that service's users, a bounded, usually well-understood surface. A bad platform deploy can affect every service built on top of it simultaneously, which turns a 30-minute single-service recovery into a multi-hour, multi-team recovery if it isn't caught early. The math isn't linear, it's closer to every team's incident happening at once, coordinated by whoever's on call for the platform.
That asymmetry is why platform rollouts get the canary-and-opt-in treatment described earlier, and app deploys usually don't need nearly as much ceremony. Applying the same caution everywhere would just slow down every team's shipping for no real benefit. It's specifically the wide blast radius that earns the extra process.
Scoped dashboards and alerting rules bound to a team's own namespace or service labels, generated the same way RBAC is, automatically at provisioning time rather than configured by hand per team. A team should see their own latency, error rate, and logs in full detail, and nothing about another team's internals beyond aggregate, anonymized platform-health signals if that.
Paging is the part teams forget to scope. An alert routing misconfiguration that pages team A for team B's threshold breach doesn't just annoy someone at 3am, it actively erodes trust in the whole alerting system. Once people start ignoring pages because "it's probably not really mine," you've lost the thing alerting exists for.
Frequency and specificity. A one-off "the pipeline felt slow today" is noise. The same specific complaint from three different teams in the same week, "deploys are timing out on step 4," is signal, especially once it lines up with an actual metric moving in the same direction, deploy duration creeping up, error rate on that specific step rising.
The trap is dismissing the third instance of a complaint as "just that one team again" without checking whether it's the same underlying cause each time. Recurring complaints deserve a quick correlation check against real metrics before you decide whether it's a pattern or a coincidence.
Hard questions
7Almost always one of two things: a variable rename or resource move that Terraform read as "destroy old, create new" instead of "modify in place," or a missing prevent_destroy lifecycle rule on something that should never be destroyed by automation. The plan output would have shown the destroy, which means either nobody reviewed the plan or the pipeline auto-applied without a human gate on destructive changes.
After this, the fix has three parts. A lifecycle block with prevent_destroy on anything stateful. A pipeline rule requiring manual approval any time a plan contains a destroy action, not just any change at all. And a snapshot policy that exists independent of Terraform, because the postmortem where "we could just restore from last night's snapshot" reads a lot better than the one without it.
resource "aws_db_instance" "primary" {
#...
lifecycle {
prevent_destroy = true
}
}terraform import, or the newer import blocks, brings existing resources under management without recreating them, one at a time, verified against a plan that shows zero changes before you move to the next. The discipline that actually matters is refusing to also "clean up" the resource's configuration during the import. Import first, get a clean plan showing no diff, commit that. Improve it in a separate change afterward, once it's safely under Terraform's management and you have a rollback path.
At 200 resources, doing this by hand is a multi-week project people burn out on halfway through. Scripting the import, generate config from the live resource, import, diff, fix drift, repeat, turns a manual slog into something closer to a batch job, and it's the difference between finishing the migration and abandoning it at resource 60 with half your infrastructure in two systems of record.
Strong answers here name a specific abstraction that got adopted, then quietly worked around or actively resisted, and describe what surfaced that. A self-service tool nobody uses six months after launch, a golden path every team customizes the same three ways, an abstraction that solved the platform team's problem but not the actual developer's problem, these are the real shapes a wrong bet takes.
What I'd actually listen for is whether the candidate changed the abstraction afterward, or just noted the problem and moved on. Recognizing a mistake is table stakes. Shipping a fix and re-measuring adoption is the part that separates a platform engineer from someone who's just observant.
Guardrails belong in the provisioning path itself, not in a review someone has to remember to perform. An admission controller rejects anything that violates naming convention, missing labels, or a security baseline, privileged containers, missing resource requests, at the moment it's submitted, before it ever schedules. The scaffolding template that creates the namespace applies the quota, network policy, and RBAC bindings automatically as part of creation, not as a follow-up ticket.
The honest trade-off is that automated guardrails catch what you thought to encode and nothing else. A human reviewer catches novel problems an automated rule never anticipated. Most mature platforms accept that trade and put the human back in only for genuinely unusual requests, flagged by the same admission layer that auto-approves everything routine.
Different trust tiers on the same physical cluster need more than a namespace boundary. Node pools dedicated to the payments namespace, enforced with taints and tolerations, so a compromised internal-tools workload can't even schedule onto payments hardware. Network policies default-deny between namespaces, with explicit allow rules for anything payments genuinely needs to reach. A separate, stricter admission policy for the payments namespace specifically, not the same baseline every other tenant gets.
I'd push back a little here too. If the compliance requirement is strict enough, PCI scope is the common one, a fully separate cluster for payments is often the actual answer, and trying to make one cluster satisfy two very different trust levels through policy alone tends to be more fragile than the extra operational cost of a second control plane.
Usually yes, and fast, even though the change is "correct" in isolation. Correctness against your own test suite doesn't mean correctness against 200 teams' actual, uncatalogued assumptions about how the platform behaves, some of which were never documented anywhere you could have tested against. Rolling back restores a known-good state for everyone while you figure out what those three teams were relying on that nothing else was.
The exception is a security or compliance fix where the three broken teams were relying on something risky that shouldn't have worked in the first place. In that specific case, you might hold the line and help those teams migrate off the broken assumption instead of reverting, but that's a narrower call than most platform incidents actually are, and I'd default to rollback unless there's a genuinely good reason not to.
The aggregate number is actively hiding the problem here, which is itself worth flagging before answering the actual question. A 99.9% platform-wide rate with one team at effectively 0% for two weeks means either that team hit a platform edge case nobody else has, their config is unusual enough to expose a real bug, or something specific to their service is broken and the platform's just the messenger.
Find out which by checking whether other teams with a similar setup, similar language, similar deployment pattern, are also struggling. If they are, it's a platform gap masquerading as one team's bad luck. If this team is genuinely alone, the platform's job shifts from "fix the platform" to "pair with this team directly," since two weeks of failed deploys with no resolution is itself an incident regardless of whose bug caused it.
Real-time scenario questions
7Split into a thin, versioned root module the platform team owns (network, IAM boundary, logging, tagging, the things that must stay consistent) and a small set of variables the product team actually controls (instance size, replica count, a handful of feature flags). The product team never touches the internals. They pass in a values file.
The trap is exposing too many variables "for flexibility." Every variable is a promise you have to support forever. A platform module with 40 optional variables isn't flexible, it's untestable, since nobody can reason about which combinations anyone's actually running in production.
module "service" {
source = "git::https://github.com/org/platform-modules.git//service?ref=v4.2.0"
name = "checkout-api"
team = "payments"
replica_size = "small" # small | medium | large, platform-owned sizing tiers
enable_waf = true
}Classify by blast radius and reversibility, not by resource type. A new S3 bucket with a standard policy is safe to auto-apply. A security group rule opening a port to 0.0.0.0/0 needs a human, no matter how routine it looks in the diff. The plan output itself is the input to this decision: parse it for destroy actions, IAM policy widening, or anything touching a production-tagged resource, and route those to a required reviewer automatically.
Most teams get this backwards early on. They gate everything, which trains developers to rubber-stamp every plan without reading it, or they gate nothing, which is how the database from the earlier question gets deleted. The workflow only works if the human gate shows up rarely enough that people actually read it when it does.
A ResourceQuota caps total CPU, memory, and object count per namespace, so one team's traffic spike or leak can't consume resources another team's namespace needs. A LimitRange sets sane per-container defaults and maximums inside that namespace, catching the pod someone forgot to set a memory request on before it becomes the thing that gets OOMKilled at the worst possible moment.
Neither of these stops a genuinely under-provisioned team from feeling pain, they stop that pain from spreading. That distinction is usually the one candidates miss. Quotas protect other tenants, they don't automatically mean any single team has enough capacity for its own workload.
apiVersion: v1
kind: ResourceQuota
metadata:
name: team-quota
namespace: team-checkout
spec:
hard:
requests.cpu: "20"
requests.memory: 40Gi
limits.cpu: "40"
limits.memory: 80Gi
pods: "60"An opt-in beta channel first, a small number of internal or low-risk services running the new base image or policy in production, watched closely, before it becomes the default for anything new. Feature-flag the change at the platform level so it can be disabled centrally without asking every team to revert individually.
Canary the change to lower-criticality clusters or namespaces before touching anything tagged production. The ordering matters here specifically: platform changes have a wider blast radius than any single application deploy, so the caution that would be overkill for one service's rollout is closer to the minimum bar for something touching all of them.
Alert on platform-owned signals specifically: control plane health, provisioning success rate, shared pipeline availability, not on every individual application's error rate, which belongs to that application's own on-call rotation. If a golden signal doesn't originate from something the platform team actually controls, paging the platform team for it just trains everyone to ignore platform pages.
A single noisy downstream app shouldn't be able to page the platform on-call at all, and if it can, that's a routing bug worth fixing before the next incident, not an acceptable cost of running a shared system.
Version the template the same way you'd version a library, v3 stays the default while v4 ships as opt-in. A handful of low-risk, high-trust teams, or the platform team's own services, move to v4 first as a real-world canary, not a synthetic test. Only after v4 has run clean across that early cohort for a defined period does it become the new default for anyone scaffolding a service going forward.
Existing services on v3 don't get force-migrated. They get a deprecation timeline with enough runway to move on their own schedule, plus a migration guide covering what actually changed. A platform-wide template touching 60 services is exactly the kind of change where "ship it everywhere Friday" turns into "revert it everywhere Friday night."
# platform-pipeline-template.yaml
version: v4.1.0
rollout:
channel: opt-in # opt-in | default | deprecated
cohort: platform-team-servicesThe tell here is "not the ones you'd predict from deploy order." That rules out a simple bad-cert-pushed-everywhere problem and points at something process-local: some subset of services never actually picked up the new certificate even though the rotation script says it ran. The most common cause is that the automation updated the certificate file or the secret store, but didn't force every process holding that cert in memory to reload it. Envoy, for instance, won't pick up a new cert just because the file on disk changed unless it's wired to SDS or gets an explicit reload signal. Anything using a long-lived TLS session or a connection pool established before the rotation will keep using the old cert until that connection drops naturally, which is why the failures look scattered instead of following your deploy sequence.
I'd start by pulling the actual served certificate off a handful of failing hosts with openssl s_client, and diff the serial number and chain against a host that's working. If the failing hosts are serving the old cert, that confirms it's a reload problem, not a bad new cert. Next I'd check whether the failing services share something the working ones don't: same base image with a stale CA bundle for the intermediate cert, same load balancer with connection reuse enabled, or same process type that doesn't support hot reload. Clock skew is worth ruling out too, a new cert with a notBefore in the future will fail validation on any host whose clock is off by more than a few minutes, and that failure pattern also looks random rather than deploy-ordered.
Going forward, the fix isn't just rolling back, it's making the rotation automation force a graceful restart or an explicit reload signal on every process that terminates TLS, and validating the rotation against a canary slice with a real handshake test before it goes to 100%, rather than trusting that the file being written to disk means the running process is using it.
Across platform-engineering-tagged mock interview sessions on LastRoundAI, the stumble that shows up most isn't a missing definition. It's candidates who answer a self-service or golden-path question the same way they'd answer a straight DevOps question, describing the tooling correctly while skipping the judgment call underneath it: what belongs on the path, what doesn't, and how they'd know if they got that call wrong. We don't have a clean number to put on that pattern, only that it comes up often enough across sessions to be worth calling out here.
The second pattern: candidates who can define a golden path correctly freeze the moment the question turns into "and what did you do when a team stopped using it." Knowing the concept doesn't carry the round if you can't narrate an actual decision you made, or would make, under a specific set of constraints.
Don't over-index on memorizing tool names for this loop specifically. Interviewers care less about whether you say "Backstage" or "an internal service catalog" and more about whether you can reason through the trade-off out loud once they change one variable on you mid-answer. If a loop leans harder into pure Kubernetes object mechanics or SLO arithmetic than the judgment calls above, that's usually a signal it's closer to a straight DevOps or SRE loop than a platform engineering one.
How to prepare for platform engineer interview questions
Skip re-reading tool documentation you already know. The better use of prep time is picking one real decision, a golden path you'd design, a self-service tool you'd build, and defending it out loud against someone asking "what if a team just doesn't use it" three times in a row. That's closer to the actual interview than another pass through Terraform syntax.
Gartner's own numbers explain why this role keeps showing up in loops right now. Real teams are standing up platform organizations faster than the market is producing engineers who've actually run one. The U.S. Bureau of Labor Statistics projects 15% growth for software developer and QA-adjacent roles from 2024 to 2034, one of the faster-growing categories it tracks, and platform hiring rides that same curve since most postings still fold it under a broader engineering job family.
The judgment call is the interview
If your loop leans harder into Kubernetes object mechanics, Deployments, Services, RBAC, probes, than the multi-tenant and platform-ownership questions above, LastRoundAI's Kubernetes interview questions page covers that ground without repeating it here. If it's closer to a general CI/CD, Docker, and cloud loop, the DevOps engineer interview questions page is the better fit. And if the reliability questions go deep into SLO math and error-budget arithmetic for a single service rather than the platform layer sitting underneath everything, SRE interview questions is where that content actually lives. This page sticks to what's specific to the platform engineer title: golden paths, self-service ownership, and the judgment calls both of those loops assume you've already made.
Reading through 45 questions is the easy part. Defending a golden path decision out loud, while an interviewer keeps asking "what if a team just doesn't use it" three times in a row, is the part almost nobody has actually rehearsed before the real thing. LastRoundAI's mock interview mode runs platform-engineering-specific scenario rounds for exactly that, and the AI Interview Copilot gives you real-time, sub-200ms guidance during the actual call if you want backup in the room instead of just before it. Stuck on a specific concept mid-prep, admission controllers, Crossplane, error budgets, whatever it is, the Concept Explainer breaks it down the way an interviewer actually tests it, not the encyclopedia version.
The free plan gives you 15 credits a month that reset monthly if you want to try any of this before paying for it. Starter is $19/mo if you need more runs, and everything works across more than 50 languages if English isn't your first one. Once the interview itself is dialed in, Auto-Apply can take the actual applying off your plate, 10 applications a month free, up to 400 a month on Ultimate, with every send held in a review queue until you approve it. There's no native mobile app yet, just a desktop app and a browser that works fine on a phone. Questions go to contact@lastroundai.com, that's the only inbox we actually check.
Most candidates can define a golden path. Fewer can defend the one they built when someone asks why a team stopped using it.
LastRound data
What we see on our side
Across 1,393 interview sessions configured on LastRound between January 2025 and July 2026, 464 were set up for DevOps engineering. That is a small sample and we are not going to dress it up as more, but it is first-hand rather than borrowed, and it is the pool these questions were sanity-checked against.
Frequently asked questions
How is platform engineering different from DevOps in interviews?
Platform loops treat internal developer experience as the product. Expect questions about paved paths, self-service and adoption, alongside the infrastructure questions a DevOps loop would ask.
Do platform engineering interviews cover Kubernetes deeply?
Usually yes, and beyond basic manifests. Expect questions about controllers, resource limits, rollout strategies and what you would debug first when a pod is unhealthy.
What non-technical questions come up?
Adoption and influence. Platform teams ship things other engineers must choose to use, so interviewers probe how you got a team to migrate without mandate.
How much coding is involved?
Enough to build tooling. Operators, controllers and CLI tooling appear often, so be ready to discuss code you have written for other engineers to use.
How this list was built
Worth being straight about where these questions come from, because plenty of pages in this category are not. The set was compiled from a research pass across official documentation, vendor release notes, published engineering writing and public discussion of hiring processes, then cross-checked against the current version of each technology so nothing here describes behaviour that has since changed.
What that means in practice: these are the questions the material supports as reasonable and current for this role, not a transcript of any one company's loop. We have not sat in on your interview and we are not going to claim we have. Treat the list as well-sourced preparation rather than a leaked question bank, and expect your panel to phrase things their own way.
If you spot something out of date, tell us at contact@lastroundai.com and we will fix it.
- Gartner: Top Strategic Technology Trends in Software Engineering for 2024
- Frontiers in Computer Science: Platform Engineering Review, 2026
- CNCF: Kubernetes Established as the De Facto Operating System for AI, 2025 Annual Cloud Native Survey
- U.S. Bureau of Labor Statistics: Software Developers, QA and Testers
LastRoundAI listens to the call and suggests clear, structured answers to questions like the ones above, in real time and invisible on screen share.

