Implementation Guide
Self-Service Portal
Crossplane Configuration
apiVersion: pkg.crossplane.io/v1
kind: Configuration
metadata:
name: platform-config
spec:
package: xpkg.upbound.io/platform/config:v1.0.0
---
apiVersion: platform.org/v1alpha1
kind: ApplicationTemplate
metadata:
name: web-application
spec:
components:
- name: frontend
type: kubernetes
properties:
replicas: 2
image: nginx:latest
- name: database
type: rds
properties:
engine: postgres
size: small
Internal Developer Platform
Backstage Implementation
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: service-template
annotations:
github.com/project-slug: 'org/service-template'
backstage.io/techdocs-ref: dir:.
spec:
type: template
owner: platform-team
lifecycle: production
system: developer-platform
parameters:
- title: Service Details
properties:
name:
title: Name
type: string
pattern: '^[a-z0-9-]+$'
language:
title: Language
type: string
enum: ['python', 'typescript', 'go']
Developer Experience
Backstage Implementation
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: service-template
annotations:
backstage.io/techdocs-ref: dir:.
spec:
type: service
lifecycle: production
owner: platform-team
system: internal-platform
dependsOn:
- component:default/auth-service
- resource:default/postgres-db
---
apiVersion: backstage.io/v1alpha1
kind: Template
metadata:
name: microservice-template
spec:
parameters:
- title: Service Details
required:
- serviceName
- owner
steps:
- id: template
action: fetch:template
input:
url: ./skeleton
values:
name: ${{ parameters.serviceName }}
owner: ${{ parameters.owner }}
Service Catalog
Resource Templates
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
name: microservice-template
title: Microservice Template
spec:
owner: platform-team
type: service
parameters:
- title: Service Information
properties:
name:
title: Name
type: string
description:
title: Description
type: string
steps:
- id: template
name: Fetch Template
action: fetch:template
input:
url: ./skeleton
values:
name: ${{ parameters.name }}
description: ${{ parameters.description }}
- id: publish
name: Publish
action: publish:github
input:
repoUrl: github.com?owner=org&repo=${{ parameters.name }}
Infrastructure Automation
Terraform Controller
apiVersion: infra.contrib.fluxcd.io/v1alpha2
kind: Terraform
metadata:
name: platform-resources
spec:
interval: 1h
path: ./environments/prod
sourceRef:
kind: GitRepository
name: platform-infra
vars:
- name: environment
value: production
approvePlan: auto
destroyResourcesOnDeletion: false
Service Mesh Integration
Linkerd Configuration
apiVersion: linkerd.io/v1alpha2
kind: ServiceProfile
metadata:
name: platform-api
namespace: platform
spec:
routes:
- name: createService
condition:
method: POST
pathRegex: /api/v1/services
responseClasses:
- condition:
status:
min: 200
max: 299
isFailure: false
- name: getService
condition:
method: GET
pathRegex: /api/v1/services/[^/]*$
timeoutMs: 500
Best Practices
Developer Self-Service
Service templates
Environment provisioning
Pipeline automation
Documentation
Platform Governance
Policy enforcement
Resource quotas
Security controls
Cost management
Service Lifecycle
Creation workflows
Update processes
Retirement procedures
Version control
Observability
Platform metrics
Usage analytics
Cost tracking
Performance monitoring
Last updated