
- Long lead times: days or weeks to get basic resources.
- Inconsistent outcomes: different engineers make different choices.
- Poor visibility and ownership: unclear who owns what.
- Bottlenecked platform team: manual work doesn’t scale.

Shadow IT is a symptom of poor self-service. When the platform is hard to use, teams bypass it — creating security blind spots, governance gaps, and untracked costs.
- Ticket-driven model: developers file tickets or send emails; platform engineers manually provision resources, coordinate with infra teams, and process requests one-by-one.
- API-driven model: developers call a platform API (declarative requests); controllers/operators and automation reconcile desired state into real infrastructure.


- Consumer layer: Developers declare intent (for example, “create a medium Postgres database”). They consume the platform API and do not need to understand implementation details.
- Contract layer: The platform API — implemented as CRDs with schemas, defaults, validation and RBAC — defines the contract and guardrails.
- Platform logic: Controllers, operators, workflow engines, and composition tools (e.g., Crossplane) reconcile the declared state into real resources and operational defaults.
Design the API first as the product. The CRD schema is both the contract and the primary documentation for consumers — make it clear, opinionated, and discoverable.
- Developer request: “I need a medium Postgres database.”
- Platform maps “medium” to the correct instance type, storage class, backup policy, network config, IAM rules, and secret management.

How these pieces interact (high-level flow):
- Developer creates a Custom Resource (CR) that expresses intent.
- The CRD validates the CR (schema, defaults, validations).
- A controller/operator reconciles the CR into platform actions.
- Crossplane or the operator provisions cloud resources and updates CR status.
- The platform returns self-service outputs (endpoints, credentials, notifications) to the developer.
- Treat your platform as a product: build, measure, and iterate on the API.
- APIs enable self-service and scale; tickets do not.
- Design consumer-centric, declarative contracts that hide complexity and enforce guardrails.
- Use Kubernetes primitives (CRDs, controllers/operators) and composition tools (Crossplane) to implement the platform logic.
- Make the safe and supported path the easiest option for developers.
- Crossplane (composition and cloud provisioning): https://learn.kodekloud.com/user/courses/learn-by-doing-crossplane
- Kubernetes Concepts: https://kubernetes.io/docs/concepts/
- API design patterns for platforms: search for “platform engineering API design”, “CRD design patterns”, and “operator best practices”