平台工程的讨论,往往很快分成两个房间:一个房间里的团队还没有平台,依赖零散脚本、口口相传的经验,以及每个团队各自重复建设的流程;另一个房间已经搭建了工具链,却发现开发者仍然需要找平台团队开工单。真正的成熟,不是工具越多越好,而是平台能否把常见交付路径变成清晰、可发现、可重复的自助服务。
从脚本堆到共享能力
没有平台时,团队通常会自行维护部署脚本、云资源配置、监控接入和权限申请。单个项目看起来可以快速推进,但随着服务数量增长,重复工作会带来几个问题:
- 相同任务由不同团队用不同方式实现,维护成本持续上升。
- 关键知识藏在少数人的经验里,人员变动后流程容易中断。
- 安全、审计和资源规范很难稳定落地。
- 开发者需要在业务开发和基础设施细节之间反复切换。
平台工程的第一步,是识别这些高频路径,并将它们整理成可复用的能力。例如,创建一个服务时,可以统一生成代码仓库、构建配置、部署清单、日志和监控接入;申请数据库时,可以把规格、权限、备份和成本标签纳入同一个流程。
这并不意味着要立刻建设一个庞大的内部开发者平台。可以先从一条重复率最高、痛点最明显的交付路径开始,用稳定的接口和模板替代临时脚本。
工具链不是终点
CI/CD、基础设施即代码、容器平台和监控系统都是平台的重要组成部分,但把这些工具放在一起,并不会自动形成平台。使用者真正关心的是:
- 我应该从哪里开始?
- 哪些选项是允许的?
- 默认配置是否已经满足组织规范?
- 出错时能否看到明确原因并自行修复?
- 这个服务由谁维护,变更会不会影响我?
因此,平台需要提供面向任务的产品体验,而不是只暴露底层工具。开发者应该申请“创建一个可部署服务”,而不是自己拼接仓库模板、镜像构建任务、集群权限和域名配置。
可以把平台能力分成三层:
- 基础设施层:集群、网络、存储、身份和云资源。
- 交付能力层:构建、测试、部署、回滚、观测和审计。
- 开发者体验层:模板、目录、文档、API、命令行工具和自助工作流。
成熟度提升的关键,是让上层工作流隐藏不必要的底层复杂度,同时保留足够的扩展点,避免平台变成新的封闭系统。
一个可改造的最小自助服务
下面是一个简化的 Kubernetes 服务模板。假设平台已经约定了镜像仓库、命名空间和健康检查规则,团队只需要修改服务名和镜像地址即可提交。这个示例不是完整的平台实现,但可以作为统一模板的起点。
将内容保存为 service.yaml,把 orders-api 和镜像地址替换成自己的值,然后运行命令:
kubectl apply -f service.yaml
kubectl rollout status deployment/orders-api -n product
kubectl get service orders-api -n product
apiVersion: apps/v1
kind: Deployment
metadata:
name: orders-api
namespace: product
labels:
app.kubernetes.io/name: orders-api
platform.example.com/owner: payments
spec:
replicas: 2
selector:
matchLabels:
app.kubernetes.io/name: orders-api
template:
metadata:
labels:
app.kubernetes.io/name: orders-api
spec:
containers:
- name: orders-api
image: registry.example.com/product/orders-api:1.0.0
ports:
- name: http
containerPort: 8080
readinessProbe:
httpGet:
path: /health/ready
port: http
initialDelaySeconds: 5
periodSeconds: 10
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
---
apiVersion: v1
kind: Service
metadata:
name: orders-api
namespace: product
spec:
selector:
app.kubernetes.io/name: orders-api
ports:
- name: http
port: 80
targetPort: http
在真正的自助平台中,这份 YAML 可以由模板服务、CLI 或门户生成。平台还可以在提交前自动检查镜像来源、资源限制、所有者标签和健康检查,减少每个团队重复实现策略的需要。
不过,模板不是越严格越好。平台团队需要区分“必须满足的组织约束”和“允许团队选择的实现细节”。过度限制会迫使团队绕过平台;缺少默认值又会把复杂度重新推回开发者身上。
用使用结果衡量成熟度
平台成熟度不能只用集群数量、流水线数量或部署工具数量衡量。更有价值的信号包括:
- 新服务从创建到第一次部署需要多长时间。
- 常见操作是否可以不依赖平台团队人工介入。
- 失败信息是否足够具体,开发者能否自行恢复。
- 平台模板和接口是否有明确的维护者与版本策略。
- 团队是否愿意主动采用平台,而不是因为流程要求被迫使用。
平台团队也应把开发者当作用户,持续收集反馈。一个看似合理的工作流,如果需要填写大量内部术语、跨多个系统复制信息,最终仍然会变成新的“部落知识”。
采用建议
可以从以下顺序开始推进:
- 盘点团队之间重复率最高的交付任务。
- 选择一条边界清晰的路径,先提供模板和自动化接口。
- 为默认配置补齐安全、观测、权限和成本信息。
- 记录自助服务的使用率、失败率和交付耗时。
- 根据反馈改进体验,再逐步扩展到数据库、消息队列和环境管理等能力。
工具链解决的是“能力是否存在”,自助服务解决的是“开发者能否直接使用这些能力”。从脚本走向平台,不是一次性采购一套产品,而是持续把组织经验沉淀为可靠的默认路径,并让这条路径足够简单、透明、可维护。