概述
内部开发者平台(Internal Developer Platform,IDP)是平台工程的核心组成部分,为开发团队提供自助服务能力,消除瓶颈、减少认知负荷并加速交付。1
平台工程代表DevOps的演进,解决了传统DevOps模型在大规模组织中造成的开发者认知负荷问题。IDP通过提供统一入口来发现、创建和管理服务及基础设施。
IDP vs DevOps
| 维度 | 传统DevOps | 平台工程+IDP |
|---|---|---|
| 基础设施 | 开发者自己处理 | 自助服务平台 |
| 标准化 | 每人一套 | Golden Path模板 |
| 认知负荷 | 高(需了解所有基础设施) | 低(自助服务) |
| 交付速度 | 慢(手动流程) | 快(标准化流程) |
| 扩展性 | 难扩展 | 易于扩展 |
核心价值
关键指标
- 87% 财富500强采用IDP
- 4.2倍 更快的部署速度
- 68% 减少重复性工作(Toil)
核心原则
- 自助服务:开发者通过门户自主完成任务
- Golden Paths:标准化模板减少错误、加速交付
- 降低认知负荷:抽象基础设施复杂性
- 持续优化:将平台视为产品持续迭代
架构组件
IDP系统架构
┌─────────────────────────────────────────────────────────────┐
│ Developer Portal (UI) │
│ Backstage / Port / 自定义解决方案 │
└─────────────────────────────────────────────────────────────┘
↓ ↓ ↓
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 服务目录 │ │ 软件模板 │ │ 技术文档 │
│ Service Catalog │ │ Software │ │ TechDocs │
│ │ │ Templates │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
↓ ↓ ↓
┌─────────────────────────────────────────────────────────────┐
│ Platform Orchestration │
│ Humanitec / ArgoCD / Terraform Cloud │
└─────────────────────────────────────────────────────────────┘
↓ ↓ ↓
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Kubernetes │ │ CI/CD │ │ 监控/日志 │
│ Cluster │ │ Pipeline │ │ Observability │
└─────────────────┘ └─────────────────┘ └─────────────────┘
核心组件
| 组件 | 描述 | 关键功能 |
|---|---|---|
| Service Catalog | 所有服务的中央注册表 | 服务发现、依赖关系、状态 |
| Software Templates | 项目创建模板 | 快速启动、标准化工具链 |
| TechDocs | 技术文档中心 | 文档创建、维护、搜索 |
| API Docs | API文档管理 | OpenAPI集成、自动生成 |
| Infrastructure Templates | 基础设施模板 | Terraform/ Pulumi模块 |
| Scaffolding Actions | 脚手架操作 | 代码生成、lint、测试 |
Backstage
Backstage是Spotify创建的开源开发者门户框架,现为CNCF孵化项目。2
核心特性
┌─────────────────────────────────────────────────────────────┐
│ Backstage Framework │
├─────────────────────────────────────────────────────────────┤
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Catalog │ │ Templates │ │ TechDocs │ │
│ │ (服务目录) │ │ (模板) │ │ (文档) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Plugins │ │ TechDocs │ │ Actions │ │
│ │ (插件) │ │ (文档) │ │ (操作) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
软件目录模型
Backstage使用结构化实体模型表示软件资产:
# catalog-info.yaml
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: my-service
description: 我的服务
annotations:
github.com/project-slug: myorg/myrepo
prometheus.io/port: "8080"
spec:
type: service
lifecycle: production
owner: platform-team
system: payments
dependsOn:
- component:database
- component:message-queue实体类型
| 类型 | 用途 |
|---|---|
| Component | 微服务、库、数据pipeline |
| API | 定义的API规范 |
| Resource | 基础设施资源(数据库、存储) |
| System | 相关组件和API的集合 |
| Domain | 业务领域 |
| Location | 实体文件位置 |
Kubernetes部署
# backstage-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: backstage
namespace: backstage
spec:
replicas: 2
selector:
matchLabels:
app: backstage
template:
metadata:
labels:
app: backstage
spec:
containers:
- name: backstage
image: backstage/backstage:latest
ports:
- containerPort: 7007
env:
- name: POSTGRES_HOST
value: postgres.backstage.svc
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "2Gi"
cpu: "1000m"
---
apiVersion: v1
kind: Service
metadata:
name: backstage
namespace: backstage
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 7007
selector:
app: backstageBackstage配置
# app-config.yaml
app:
title: Company Developer Portal
baseUrl: https://portal.company.com
organization:
name: Company
backend:
baseUrl: https://portal.company.com
listen:
port: 7007
database:
client: pg
connection:
host: ${POSTGRES_HOST}
port: 5432
user: ${POSTGRES_USER}
password: ${POSTGRES_PASSWORD}
database: backstage
integrations:
github:
- host: github.com
token: ${GITHUB_TOKEN}
catalog:
import:
entityFilename: catalog-info.yaml
rules:
- allow:
- Component
- API
- Resource
- System
- Domain
- Location
locations:
- type: url
target: https://github.com/org/backstage/blob/main/catalog-info.yamlGolden Paths
Golden Paths是平台提供的预定义最佳实践模板,使开发者能够快速启动标准化项目。
Golden Path组成
Golden Path
├── 项目模板
│ ├── 语言选择 (Node.js, Python, Go)
│ ├── 框架配置 (Express, FastAPI, Gin)
│ └── 工具链集成 (ESLint, Prettier, Testing)
├── 基础设施模板
│ ├── Kubernetes配置
│ ├── CI/CD流水线
│ └── 监控配置
└── 文档模板
├── README.md
├── API文档
└── 运行手册
示例:服务创建Golden Path
# template.yaml
apiVersion: backstage.io/v1alpha1
kind: Template
metadata:
name: create-service
title: Create New Service
description: 基于Golden Path创建新服务
spec:
owner: platform-team
type: website
parameters:
- title: 服务信息
properties:
serviceName:
title: 服务名称
type: string
pattern: "^[a-z][a-z0-9-]*$"
description:
title: 描述
type: string
language:
title: 编程语言
type: string
enum:
- nodejs
- python
- golang
- java
steps:
- id: fetch-skeleton
name: Fetch Skeleton
action: fetch:cookiecutter
input:
url: https://github.com/company/service-skeleton
values:
service_name: ${{ parameters.serviceName }}
language: ${{ parameters.language }}
- id: setup-cicd
name: Setup CI/CD
action: custom:setupCICD
input:
serviceName: ${{ parameters.serviceName }}
- id: register-catalog
name: Register in Catalog
action: catalog:register
input:
catalogInfoUrl: ${{ steps.fetch-skeleton.output.catalogInfoUrl }}
- id: notify
name: Notify
action: custom:notifySlack
input:
channel: "#dev-onboarding"
message: "New service ${{ parameters.serviceName }} created!"平台编排层
Humanitec
Humanitec提供平台编排层,根据评分规范动态生成应用配置。3
# score.yaml
apiVersion: score.dev/v1
kind: Workload
metadata:
name: my-app
service:
ports:
- port: 8080
targetPort: 3000
resources:
app:
storage:
data:
type: volume
size: 1Gi
params:
cpu: "250m"
memory: "256Mi"
db:
profile: small
type: postgresArgoCD集成
# argocd-application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-service
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/company/my-service
targetRevision: main
path: k8s
destination:
server: https://kubernetes.default.svc
namespace: production
syncPolicy:
automated:
prune: true
selfHeal: true自助服务能力
开发者工作流
┌─────────────────────────────────────────────────────────────┐
│ Developer Portal │
└─────────────────────────────────────────────────────────────┘
│
┌─────────────────────┼─────────────────────┐
↓ ↓ ↓
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ 创建服务 │ │ 查看依赖 │ │ 部署应用 │
│ (Template) │ │ (Catalog) │ │ (CI/CD) │
└───────────────┘ └───────────────┘ └───────────────┘
│ │ │
└─────────────────────┼─────────────────────┘
↓
┌───────────────┐
│ 平台后端 │
│ (编排层) │
└───────────────┘
│
┌─────────────────────┼─────────────────────┐
↓ ↓ ↓
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ Kubernetes │ │ Database │ │ DNS │
│ Cluster │ │ (RDS) │ │ (Route53) │
└───────────────┘ └───────────────┘ └───────────────┘
服务目录功能
| 功能 | 描述 |
|---|---|
| 服务发现 | 按名称、技术栈、团队搜索 |
| 依赖视图 | 可视化服务依赖关系 |
| 健康状态 | 实时服务状态监控 |
| 文档链接 | 一键访问相关文档 |
| SLA信息 | 可用性、响应时间承诺 |
实施建议
平台成熟度模型
| 级别 | 特征 |
|---|---|
| L1 - 初始 | 手动流程、文档分散 |
| L2 - 受管理 | 基础CI/CD、集中文档 |
| L3 - 定义 | Golden Paths、服务目录 |
| L4 - 测量 | 平台指标、开发者满意度 |
| L5 - 优化 | 自动化反馈、持续改进 |
实施路线图
Phase 1: 基础 (1-3月)
├── 部署Backstage
├── 导入现有服务
└── 配置GitHub集成
Phase 2: 自助服务 (3-6月)
├── Golden Paths模板
├── CI/CD流水线集成
└── TechDocs集成
Phase 3: 高级能力 (6-12月)
├── 平台编排层
├── 成本管理
├── 安全扫描集成
└── 开发者体验指标
团队配置
| 角色 | 职责 |
|---|---|
| Platform Engineer | 平台开发、维护 |
| DevEx Engineer | 开发者体验、反馈 |
| SRE | 可靠性、监控 |
| Security | 安全扫描、策略 |
流行工具对比
| 工具 | 类型 | 优势 | 劣势 |
|---|---|---|---|
| Backstage | 开源框架 | 插件生态、灵活定制 | 运维成本高 |
| Port | SaaS/No-code | 快速上线、易用 | 定制有限 |
| Humanitec | PaaS | 编排能力强 | 学习曲线 |
| 自定义 | 自建 | 完全控制 | 开发成本高 |
参考资料
Footnotes
-
Platform Engineering Internal Developer Portals Guide - https://policyascode.dev/blog/platform-engineering-internal-developer-portals-guide ↩
-
Backstage Official Documentation - https://backstage.io/ ↩
-
Humanitec Platform Orchestration - https://humanitec.com/ ↩