平台工程
平台工程是构建和维护内部开发者平台(IDP)的学科,目的是为软件工程团队提供自助服务能力,从而降低认知负担、标准化基础设施供给、在保持治理与安全护栏的同时加速交付。
一、何时使用
当组织出现以下情况时,可采用平台工程实践:开发团队认知过载——开发者花在基础设施接线上的时间多于编写业务逻辑;环境不一致——每个团队以不同方式供给基础设施,导致漂移和中断;上手缓慢——新工程师需要数周才能获得可用的开发环境;重复性杂务——相同的 Terraform/Helm/CI 样板在数十个仓库中被复制粘贴;合规瓶颈——安全和运维审查卡住每一次部署,拖慢发布节奏;规模拐点——拥有 5 个以上团队以及共享基础设施关注点(网络、可观测性、密钥)。
平台工程不是用门户取代运维,而是把组织标准编码为可复用、自助式的抽象,供开发团队通过 Golden Paths 使用。
二、Backstage 安装
Backstage 是领先的开源开发者门户框架,最初由 Spotify 创建。
安装(前置条件:Node.js 18+、yarn 1.x):
npx @backstage/create-app@latest
按提示命名应用,例如 "internal-platform",然后:
cd internal-platform yarn dev
生产 Docker 构建示例使用 node:18-bookworm-slim 作为构建与运行阶段,安装依赖、执行 yarn tsc、yarn build:backend,最后以 node packages/backend --config app-config.production.yaml 启动。
核心 app-config.yaml 包含 app 标题与 baseUrl、organization 名称、backend 的 baseUrl 与监听端口及 PostgreSQL 连接、GitHub integrations、以及 catalog 的实体文件名、规则(Component、System、API、Resource、Location、Template)和位置。
三、Crossplane 用于自助式基础设施
Crossplane 扩展 Kubernetes,通过声明式 YAML 供给和管理云基础设施。
安装步骤包括:添加 Crossplane Helm 仓库、更新仓库、在 crossplane-system 命名空间安装 Crossplane(启用 composition revisions)、安装 AWS Provider(package: xpkg.upbound.io/upbound/provider-family-aws:v1.1.0)、创建 AWS 凭据 Secret、配置 ProviderConfig。
CompositeResourceDefinition(XRD)定义了一个新的平台 API,开发者无需了解底层云资源即可使用。示例 xrd-application-database.yaml 定义了 XApplicationDatabase 及 claim 名称 ApplicationDatabase,参数包括 engine(postgres/mysql)、engineVersion、storageGB(20-500)、instanceSize(small/medium/large)、environment(dev/staging/prod,必填)。
Composition(AWS RDS)示例 applicationdatabase-aws 定义了 rds-instance 与 db-secret 资源,并通过 patches 从组合字段路径映射引擎、版本、存储,使用 CombineFromComposite 将 instanceSize 映射到实例类(db.t3.micro/db.t3.medium/db.r6g.large)。
开发者实际编写的 Claim 示例 my-app-database.yaml 仅需声明 engine、engineVersion、storageGB、instanceSize、environment。
四、Golden Paths
Golden Paths 是经过精心设计、有良好支持的技术栈路径,团队可遵循以快速交付。
Backstage Software Template 示例 template-nodejs-service.yaml 定义了一个 Node.js 微服务模板,参数包括服务名称、描述、负责团队、系统、数据库(none/postgres/mysql)、缓存层(none/redis)、目标环境(dev/staging/prod)。步骤包括 fetch:template、publish:github、argocd:create-resources、catalog:register,并输出仓库链接与 Backstage 实体引用。
Cookiecutter 模板结构示例包含 cookiecutter.json 以及服务目录、Dockerfile、package.json、tsconfig.json、src、deploy/k8s、.github/workflows、catalog-info.yaml 等。
五、服务目录
微服务的 catalog-info.yaml 示例包含名称、描述、注解(TechDocs 引用、GitHub slug、Kubernetes id 与命名空间、ArgoCD 应用名、PagerDuty 集成键、Grafana 仪表板选择器)、标签、链接,以及 spec 中的 type、lifecycle、owner、system、providesApis、consumesApis、dependsOn。
API 实体示例 orders-api.yaml 定义类型为 openapi 的 API。
TechDocs 配置示例使用 mkdocs.yml,包含导航结构与 techdocs-core 插件,以及 mermaid 等 markdown 扩展;在 app-config.yaml 中启用 TechDocs,builder 为 external,generator 运行在 docker 中,publisher 类型为 awsS3。
六、开发者门户——Backstage 插件
Kubernetes 插件安装命令:yarn --cwd packages/app add @backstage/plugin-kubernetes 与 yarn --cwd packages/backend add @backstage/plugin-kubernetes-backend。后端配置使用 serviceLocatorMethod(multiTenant)与 clusterLocatorMethods(config),可为 dev-cluster 和 prod-cluster 配置 URL、authProvider、serviceAccountToken、caData 等。
CI/CD 插件(GitHub Actions)通过 proxy endpoints 配置 /github-actions 指向 https://api.github.com。
监控插件(Grafana)配置 grafana domain、unifiedAlerting,以及 /grafana/api 代理。
七、Score 规范
Score 提供平台无关的工作负载规范,开发者描述需求,平台决定如何供给。
score.yaml 示例包含 apiVersion(score.dev/v1b1)、metadata(名称、标签)、containers(main 的 image、variables 如 PORT、DB_HOST(引用 resources.db.host)、DB_PORT)。
资料在 DB_PORT 处被截断,后续 Score 内容暂未提供。