Platform Engineering: The Evolution Beyond DevOps
on Platform engineering, Devops, Idp, Backstage, Kubernetes, Developer experience, Cloud native
Platform Engineering: The Evolution Beyond DevOps
DevOps promised developer empowerment. But somewhere along the way, “you build it, you run it” became “you build it, you configure the CI pipeline, manage the Kubernetes manifests, handle the monitoring, deal with the incidents, and also run it.”
Platform Engineering is the course correction.
Photo by Taylor Vick on Unsplash
The Problem with “Full Stack DevOps”
A typical modern application requires developers to understand:
- Container orchestration (Kubernetes, ECS)
- Infrastructure as Code (Terraform, Pulumi)
- CI/CD pipelines (GitHub Actions, GitLab CI)
- Observability (Prometheus, Grafana, OpenTelemetry)
- Service mesh (Istio, Linkerd)
- Secrets management (Vault, AWS Secrets Manager)
- Database operations
- Security compliance
That’s not empowerment—it’s cognitive overload.
What is Platform Engineering?
Platform Engineering treats the platform as a product, with developers as customers. The goal: golden paths that make the right thing the easy thing.
Traditional DevOps:
Developer → Learn Kubernetes → Configure Helm → Set up monitoring → Deploy
Platform Engineering:
Developer → Create service in portal → Deploy
(Platform team handles the complexity underneath)
Building Your Internal Developer Platform (IDP)
The Five Planes Model
┌─────────────────────────────────────────────┐
│ Developer Portal (UI) │
├─────────────────────────────────────────────┤
│ Service Catalog & Templates │
├─────────────────────────────────────────────┤
│ Automation & Orchestration Layer │
├─────────────────────────────────────────────┤
│ Infrastructure Abstraction │
├─────────────────────────────────────────────┤
│ Cloud Resources Layer │
└─────────────────────────────────────────────┘
1. Developer Portal with Backstage
// catalog-info.yaml - Service Definition
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: payment-service
description: Handles payment processing
annotations:
github.com/project-slug: myorg/payment-service
backstage.io/kubernetes-id: payment-service
pagerduty.com/service-id: PXXXXXX
spec:
type: service
lifecycle: production
owner: team-payments
system: checkout-system
providesApis:
- payment-api
dependsOn:
- component:user-service
- resource:payments-db
2. Self-Service Templates
# scaffolder-template.yaml
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
name: microservice-template
title: Create New Microservice
description: Scaffold a production-ready microservice with CI/CD, monitoring, and Kubernetes deployment
spec:
owner: platform-team
type: service
parameters:
- title: Service Details
required:
- name
- owner
properties:
name:
title: Service Name
type: string
pattern: '^[a-z0-9-]+$'
owner:
title: Owner Team
type: string
ui:field: OwnerPicker
language:
title: Language
type: string
enum: ['python', 'go', 'typescript', 'java']
default: 'python'
- title: Infrastructure
properties:
database:
title: Database Type
type: string
enum: ['none', 'postgresql', 'mongodb', 'redis']
scaling:
title: Auto-scaling Profile
type: string
enum: ['small', 'medium', 'large']
default: 'small'
steps:
- id: fetch-base
name: Fetch Base Template
action: fetch:template
input:
url: ./skeleton/$
values:
name: $
owner: $
- id: create-repo
name: Create GitHub Repository
action: publish:github
input:
repoUrl: github.com?owner=myorg&repo=$
defaultBranch: main
- id: provision-infra
name: Provision Infrastructure
action: http:backstage:request
input:
method: POST
path: /api/terraform/provision
body:
service: $
database: $
scaling: $
- id: register-catalog
name: Register in Catalog
action: catalog:register
input:
repoContentsUrl: $
catalogInfoPath: '/catalog-info.yaml'
Photo by Clément Hélardot on Unsplash
3. Infrastructure Abstraction with Crossplane
Abstract cloud resources into Kubernetes-native APIs:
# Define a composite resource
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
name: databases.platform.myorg.com
spec:
group: platform.myorg.com
names:
kind: Database
plural: databases
versions:
- name: v1
served: true
referenceable: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
size:
type: string
enum: ["small", "medium", "large"]
engine:
type: string
enum: ["postgresql", "mysql"]
required:
- size
- engine
---
# Developer just needs this:
apiVersion: platform.myorg.com/v1
kind: Database
metadata:
name: user-db
spec:
size: medium
engine: postgresql
4. GitOps with Argo CD
# Application definition
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: payment-service
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/myorg/payment-service
targetRevision: main
path: kubernetes/overlays/production
destination:
server: https://kubernetes.default.svc
namespace: payments
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
Measuring Platform Success
DORA Metrics
# Track platform impact on delivery performance
from dataclasses import dataclass
from datetime import timedelta
@dataclass
class DORAMetrics:
deployment_frequency: float # deploys per day
lead_time: timedelta # commit to production
change_failure_rate: float # % of deployments causing incidents
time_to_restore: timedelta # incident to resolution
# Platform goals
ELITE_PERFORMANCE = DORAMetrics(
deployment_frequency=1.0, # multiple deploys per day
lead_time=timedelta(hours=1), # less than 1 hour
change_failure_rate=0.05, # less than 5%
time_to_restore=timedelta(hours=1) # less than 1 hour
)
Developer Satisfaction (DevEx)
Track these signals:
- Time from idea to production
- Number of tools developers need to learn
- Self-service success rate
- Support ticket volume
Common Anti-Patterns
1. The “Ticket Platform”
❌ Developer wants to deploy
→ Opens ticket
→ Platform team provisions
→ 3 days later: deployed
✅ Developer wants to deploy
→ Uses self-service portal
→ Automated provisioning
→ 5 minutes later: deployed
2. Over-Abstraction
Don’t hide everything:
❌ Magic black box that "just works" until it doesn't
✅ Sensible defaults with escape hatches
- Default config works for 80% of cases
- Power users can customize when needed
- Clear documentation for both paths
3. Building Everything In-House
Adopt, then adapt:
| Need | Build | Buy/Adopt |
|---|---|---|
| Service Catalog | ❌ | Backstage |
| GitOps | ❌ | Argo CD / Flux |
| Infrastructure Abstraction | ❌ | Crossplane |
| Custom Workflows | ✅ | - |
| Domain-Specific Tools | ✅ | - |
Platform Team Structure
Platform Team (6-10 engineers)
├── Infrastructure Core
│ ├── Kubernetes / Cloud experts
│ └── Security / Compliance
├── Developer Experience
│ ├── Portal / UI development
│ └── Documentation / Enablement
└── Automation & Integration
├── CI/CD pipelines
└── Observability stack
Getting Started: The Minimum Viable Platform
Start small:
- Week 1-2: Service catalog (even a spreadsheet)
- Week 3-4: One golden path template
- Month 2: Automated deployments for one team
- Month 3: Self-service infrastructure (one resource type)
- Month 4+: Iterate based on feedback
Conclusion
Platform Engineering isn’t about buying a product or installing a tool. It’s a mindset shift: treating your internal infrastructure as a product, with developers as customers.
The best platform is invisible. Developers don’t think about Kubernetes—they think about shipping features. That’s the goal.
How is your organization approaching Platform Engineering? Share your journey in the comments.
이 글이 도움이 되셨다면 공감 및 광고 클릭을 부탁드립니다 :)
