概述

内部开发者平台(Internal Developer Platform,IDP)是平台工程的核心组成部分,为开发团队提供自助服务能力,消除瓶颈、减少认知负荷并加速交付。1

平台工程代表DevOps的演进,解决了传统DevOps模型在大规模组织中造成的开发者认知负荷问题。IDP通过提供统一入口来发现、创建和管理服务及基础设施。

IDP vs DevOps

维度传统DevOps平台工程+IDP
基础设施开发者自己处理自助服务平台
标准化每人一套Golden Path模板
认知负荷高(需了解所有基础设施)低(自助服务)
交付速度慢(手动流程)快(标准化流程)
扩展性难扩展易于扩展

核心价值

关键指标

  • 87% 财富500强采用IDP
  • 4.2倍 更快的部署速度
  • 68% 减少重复性工作(Toil)

核心原则

  1. 自助服务:开发者通过门户自主完成任务
  2. Golden Paths:标准化模板减少错误、加速交付
  3. 降低认知负荷:抽象基础设施复杂性
  4. 持续优化:将平台视为产品持续迭代

架构组件

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 DocsAPI文档管理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: backstage

Backstage配置

# 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.yaml

Golden 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: postgres

ArgoCD集成

# 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开源框架插件生态、灵活定制运维成本高
PortSaaS/No-code快速上线、易用定制有限
HumanitecPaaS编排能力强学习曲线
自定义自建完全控制开发成本高

参考资料

Footnotes

  1. Platform Engineering Internal Developer Portals Guide - https://policyascode.dev/blog/platform-engineering-internal-developer-portals-guide

  2. Backstage Official Documentation - https://backstage.io/

  3. Humanitec Platform Orchestration - https://humanitec.com/