Exam Prep · Common preparation · Interview Prep

Interview Prep

A worked example: assessing your own readiness gap before a Senior Platform Engineer interview, section by section, weighted the way one real interview syllabus actually was.

⚠ Real interview material, anonymized

Built from a real candidate’s résumé, a real job description, and a real interviewer-shared syllabus. The candidate’s name, employer, and every other identifying detail have been removed — the fit/gap analysis, model answers, and study priorities below are otherwise unchanged. Companion to Interview Q&A Reference, which has the flat, by-topic Q&A for every item covered here.

☺ Explain it like I’m 10

Before a big test, a good student doesn’t just study everything equally — they look at which topics the teacher said count for the most points, and start there. This page is one real student doing exactly that, out loud, so you can copy the method with your own test.

🦊🦉Your hosts for this topic: Foxy & Professor Owl — Foxy asks the tough interview question first, and Owl turns a real weighted syllabus into a study plan you can actually follow.
◆ How the difficulty markers work

🟢 warm-up — definitional fluency. 🟡 medium — a structured answer plus a concrete example. 🔴 hard — scenario or trade-off depth.

IDP Reference Architecture — how the tools fit together

This is the whole guide on one page: an Internal Developer Platform built from the JD’s own toolchain. Follow the numbered badges ①–⑨ — they trace one feature from a developer’s pull request all the way to a provisioned, tagged, cost-tracked cloud resource.

Team A developers product team · tenant Team B developers product team · tenant Platform team owns golden paths & policies 1 PR + review · branch protection · CODEOWNERS — the only path to production GitHub — single source of truth (code · config · platform) + CI App repo code + Dockerfile Config repo (GitOps) Helm values · Kustomize overlays Platform repo XRDs · Compositions · policies GitHub Actions CI Build Test Scan · Trivy / Mend Sign · cosign SBOM ephemeral runners · OIDC per job · least-privilege GITHUB_TOKEN 2 GHCR registry signed images · SBOM cosign ✓ OIDC token per-run, short-lived PR: bump image tag 3 GitHub OIDC → cloud IAM — no stored keys pull: Git + OCI — CI has no cluster access Flux CD — GitOps engine source · kustomize · helm controllers renders Helm & Kustomize in-cluster per-tenant reconcilers · drift auto-corrected 4 External Secrets Operator SecretStore per team · refresh interval materializes native K8s Secrets 8 Crossplane control plane XRD + Composition = platform API (L3) renders Managed Resources continuously per-team ProviderConfig — least privilege force-patches team + cost-center tags 7 Kyverno admission gate — verify · validate · mutate 5 Namespace: team-a App pods — non-root, no caps Quota + LimitRange NetPol: default-deny RBAC: team-a only PostgresClaim Secret ← ESO shared kernel — soft isolation 6 Namespace: team-b App pods Quota + limits NetPol: default-deny RBAC: team-b only RedisClaim Secret ← ESO escalate: node pool / vcluster no cross-tenant traffic — default-deny NetworkPolicy, explicit allows only Kubernetes platform cluster — RBAC allow-only · OIDC SSO · Pod Security “restricted” · audit logs Claim provisions via per-team ProviderConfig secrets pulled via workload identity (IRSA) Team A — own cloud account RDS · S3 — tags: team=a · cc=1001 Team B — own cloud account ElastiCache — tags: team=b · cc=1002 Secrets Manager / Key Vault single source of truth for secrets FinOps — Kubecost · Cost Explorer showback per team (tags + namespace) budgets · anomaly alerts chargeback-ready 9 cost rolls up by tag Public cloud — AWS · Azure. Per-team account / subscription = the hard blast-radius boundary. deploy / data flow identity & trust (OIDC · IRSA) cost telemetry security control tenant boundary admission enforcement nflow step

Diagram scales to fit this column. Use “Enlarge diagram” above for a full-size, scrollable/zoomable view.

The flow, step by step

  1. A developer opens a PR. Branch protection, required reviews, and CODEOWNERS make the pull request the only path to production — nobody pushes to main or runs kubectl apply by hand.
  2. GitHub Actions builds and hardens the artifact. Build → test → Trivy/Mend scan (fail on critical CVEs) → cosign signature → SBOM, pushed to GHCR. The runner authenticates to the cloud with a per-run OIDC token — no long-lived cloud keys exist anywhere in CI.
  3. CI never touches the cluster. Its last act is opening a PR that bumps the image tag in the config repo. Deployment authority stays inside the cluster — that separation is the core GitOps security win.
  4. Flux pulls, renders, applies. source-controller fetches Git and OCI artifacts; kustomize-controller and helm-controller render the Helm values and Kustomize overlays in-cluster and apply them. Pull-based means cluster credentials never leave the cluster, and drift is auto-corrected on every reconcile.
  5. Everything passes the Kyverno gate. Admission webhooks verify the cosign signature, enforce an allowlisted registry, require resource requests/limits, block privileged pods, and mutate incoming objects to inject team and cost-center labels. RBAC is allow-only; what the gate rejects never reaches etcd.
  6. Workloads land in tenant namespaces. Each team gets a namespace with ResourceQuota + LimitRange (noisy-neighbor protection), default-deny NetworkPolicy (explicit allows only, including the DNS egress rule), RBAC bound to the team’s IdP group, and Pod Security “restricted”. This is deliberate soft multi-tenancy — for hostile or regulated tenants you escalate to dedicated node pools, vcluster, or separate clusters.
  7. Infrastructure is self-service via Crossplane. The team commits a namespaced Claim (PostgresClaim) to the same config repo; Flux applies it; Crossplane’s Composition renders the Managed Resources and provisions through a per-team ProviderConfig federated to that team’s own cloud account — so Team A’s credentials can never create resources in Team B’s account, and the account boundary caps the blast radius.
  8. Secrets never live in Git. External Secrets Operator pulls from Secrets Manager / Key Vault through workload identity (IRSA / Azure Workload Identity — an OIDC trust, no stored key) and materializes native Kubernetes Secrets per namespace, on a refresh interval, from a per-team SecretStore.
  9. FinOps closes the loop. Tags are enforced twice — force-patched by the Composition and backstopped by Kyverno — so every resource lands pre-tagged. Kubecost / Cost Explorer roll spend up per team and namespace for showback, with budgets and anomaly alerts; chargeback becomes a reporting decision, not an engineering project.

Where security lives (defense in depth)

Where multi-tenancy lives (layered boundaries)