平台即产品:以声明式基础设施提升开发者效率

作者:Avinash Sabat
  • 2026-01-26
    北京
  • 本文字数:6945 字

    阅读完需:约 23 分钟

要点速览

  • 统一的配置层抽象了基础设施、CI/CD 以及运维复杂性,让开发者能够专注于应用开发本身。

  • 每个服务都采用单一配置模型,可在编写 YAML 阶段就校验资源限制,从而实现 FinOps 的左移(shift-left)。

  • 独立的 CI 流水线向集中式 CD 流水线提供输入,在保障团队自治的同时,维持一致的部署实践。

  • 将应用与基础设施的意图集中在一份配置中,使评审过程更加高效、可预测。

  • 这种方式提升了可视性,并支持构建一个可定制的内部开发者平台,以满足组织的合规性要求。


在当今环境下,开发者不得不应对数量过多且复杂的工具。

 

在不同环境中管理 Kubernetes、云资源、安全检查以及部署,需要投入大量时间和专业知识。平台工程正是为了应对这一问题而出现,其目标是让基础设施的使用变得更加简单。

 

问题:开发者需要掌握的东西太多

现代应用部署迫使开发者学习大量不同的工具和概念,例如:

  • 编写 Kubernetes 清单文件,用于部署、服务、Ingress 以及自动扩缩容。

  • 使用 SDK、API 或 Terraform 等基础设施即代码工具创建云资源,这要求开发者理解云服务、安全模型、网络配置以及成本影响。

  • 搭建包含构建、测试、安全检查和发布阶段的 CI/CD 流水线。

  • 在不同环境中一致地管理密钥和凭据。

 

这些领域单独来看都尚可应付,但叠加在一起就形成了陡峭的学习曲线。开发者不得不在应用逻辑与基础设施相关问题之间频繁切换,这不仅拖慢了交付速度,也增加了配置出错的风险。

 

在缺乏统一防护机制的情况下,团队往往会为了“保险起见”而过度分配资源,最终导致环境不一致以及不必要的云成本,而这些问题通常要到部署之后才会被发现。

 

弥合鸿沟:为什么抽象是必要的

核心挑战并不在于工具不足。现代平台已经提供了多种方式来构建应用、配置云资源、搭建 CI/CD 流水线、管理密钥,以及将应用部署到 Kubernetes 上。真正的问题在于,这些职责被分散在不同的工具、文件以及抽象层之中。

 

SDK、API、Terraform 模块、流水线定义、Kubernetes 清单文件以及环境相关配置,各自都非常强大。但它们暴露的是底层细节,并且需要对整个交付生命周期具备全局上下文。指望每一位应用开发者在编写和测试业务代码的同时,还要全面理解并协调所有这些基础设施和交付层面的关注点,本身就难以规模化,尤其是在同时运行大量微服务的组织中。

 

真正缺失的是一种将这些相互关联的关注点整合在一起、以开发者为中心的抽象。开发者真正需要的是一种能够清晰表达意图的抽象层:应用需要哪些资源、应如何构建和部署、如何在不同环境中运行、如何满足安全与容量要求等等,让开发者无需再陷入各类底层系统的实现细节。

 

在平台工程视角下,这样的抽象构成了内部开发者平台的核心,可以以一个轻量级、基于 Python 的平台框架形式落地。

 

一种可能的解决方案:声明式平台框架

那么,这种抽象在实际中应当是什么样子?

 

与其再引入一个新的门户,或者要求开发者去学习一套全新的 API,不如从一个更简单的事实出发:开发者每天本来就在和配置文件打交道。问题在于,能否在这种熟悉的基础上,进一步统一应用的构建、部署、配置和运维方式。

 

在这一模型中,一份声明式配置文件可以成为开发者与交付系统之间的主要接口。它用于表达应用在整个生命周期中的“意图”,包括 CI/CD 行为、不同环境下的配置、密钥集成、资源规格、自动伸缩策略以及在 Kubernetes 中的部署位置等;至于具体如何执行,则完全交由平台工程层来处理。

 

在幕后,平台框架会读取这份配置,并协调 CI/CD 流水线、基础设施自动化以及 Kubernetes 部署等各个环节的实际执行。对开发者来说,交互方式始终是清晰且可预期的;而对组织而言,交付过程则变得一致、可审查,并且能够内建合规与策略约束。

 

下面来看一个具体示例:某位开发者需要部署一个微服务,该服务依赖 Azure Storage,需要安全地管理凭据,在 Kubernetes 中指定明确的 CPU 和内存配置,定义自动伸缩规则,使用专属的节点池,并绑定一个自定义的访问域名。

 

在许多组织中,这些需求往往分散在不同的仓库和代码体系中:云资源在独立的 Terraform 仓库中定义;Kubernetes 的部署与自动伸缩规则维护在 Helm Chart 仓库;CI/CD 行为由流水线定义控制;与环境相关的部署逻辑可能存在于单独的配置仓库,或通过 Puppet 等部署工具实现;而密钥管理则通常通过外部的密钥系统或流水线变量单独处理。

 

一种更可行的做法,是将开发者需要提供的输入集中到一份与服务代码并存的 YAML 文件中。这份文件成为该服务在所有环境下的权威描述:其中声明了由 Terraform 仓库实现的基础设施依赖、以 Helm 配置形式渲染的 Kubernetes 运行参数、通过 Puppet 模块实现的部署行为,以及由共享流水线模板执行的 CI/CD 阶段。开发者不再需要直接修改这些分散的仓库,而是通过这一个统一入口,由平台工具进行解析并一致性地落地执行。

 

application:  name: payment-service  runtime: python:3.11  resources:  kubernetes:    cpu: 500m              # Maximum: 2000m (validated by schema)    memory: 1Gi            # Maximum: 4Gi (validated by schema)    replicas: 3    autoscaling:      enabled: true      minReplicas: 3      maxReplicas: 10      targetCPUUtilization: 70    nodePool: frontend    azure:    storage:      - name: payment-receipts        type: blob        tier: hot    keyvault:      secrets:        - name: stripe-api-key          source: ENV_STRIPE_KEY  networking:  hostname: payments.example.com  ingress:    tls: enabled    deployment:  tool: puppet  environments:    - development    - staging    - production
复制代码

 

之所以选择 YAML 作为面向开发者的接口,是因为它在熟悉度、可读性和自动化能力之间取得了一种务实的平衡。大多数开发者早已通过 Kubernetes 和 CI/CD 系统接触并使用 YAML,这使它成为一种低摩擦的方式,不仅可以用来表达应用意图,同时也能自然地融入版本控制和代码评审流程。相比之下,自助式门户(例如内部服务目录或基于 UI 的资源申请工具)、自定义 API,或更具表达力的配置语言,虽然可以提供更强的类型约束或更丰富的抽象能力,但往往伴随着更高的学习和推广成本,或者牺牲了配置的透明性。YAML 本身也并非没有缺点,后文会进一步讨论,例如配置文件容易膨胀、原生校验能力有限等问题。因此,引入 Schema 校验和显式版本控制就显得尤为关键,它们可以帮助团队追踪配置变更、评估影响范围,并在长期演进中安全地推进平台能力。

 

这份文件本身即是唯一可信来源。它能驱动自动化流水线,覆盖从代码构建、测试,到基础设施创建以及应用部署的全部流程。由于所有工作负载最终都运行在 Kubernetes 之上,微服务的规模化管理也随之变得更加简单:每个服务都拥有各自独立的配置文件,明确声明资源上限、伸缩策略以及节点池分配方式。

 

平台架构

该平台由多个相互关联的组件组成。GitLab 流水线作为核心协调者,负责拉取代码仓库中的源码,执行应用的构建与单元测试(测试由开发者编写),进行安全检查,使用 Terraform / IaC 创建云基础设施,并通过 Puppet 配置管理将应用部署到 Kubernetes 集群中。贯穿整个流程的是那份 YAML 配置文件:作为统一的控制平面,指示每一个组件该做什么、如何做。

 

该架构在职责划分上非常清晰:CI 流水线专注于代码的构建、测试以及漏洞扫描,而 CD 流水线则负责实际部署工作,包括创建云资源、更新 Kubernetes 以及配置运行环境。Schema 校验被放在整个流程的最前端,作为 YAML 编写阶段的一部分,在一开始就执行,从而能够第一时间捕获配置错误或诸如资源过度分配等功能性问题,实现真正的“左移”。

 

图一:从代码提交到部署得产品生命周期

 

为什么 Kubernetes 让这一切更高效

将所有内容部署到 Kubernetes 集群带来了几个关键优势:

  • 更容易管理微服务

Kubernetes 天生适合同时运行多个微服务。每个微服务都可以独立管理,拥有自己的配置,同时又能作为完整应用协同工作。

  • 自动扩缩容

当流量发生变化时,Kubernetes 会自动进行扩缩容,从而优化成本。所有这些都可以直接在配置文件中控制,这一特性将 FinOps 实践融入开发工作流中。

  • 专用节点池

有些服务需要更多内存,而有些服务需要更多 CPU。可以将服务或应用分配到符合需求的特定服务器组(节点池)中。例如,高计算量的后端应用可以运行在内存更充足的节点上,而 Web API 则可以运行在标准节点上。这种方式也可以延伸到低环境的 Spot 节点池(更便宜的节点),在应用可靠性不是关键时,云服务提供商可能随时回收这些节点,从而节省大量成本。

  • 更高效的代码审查

当所有配置都集中在一个文件中时,审查者可以轻松查看是否有人申请了过多内存或 CPU,检查扩缩容设置、节点池分配以及整个基础设施,而无需翻查多个文件。

  • 通过 Schema 校验控制成本

平台内置的 Schema 校验可以阻止开发者请求超出限制的资源。例如,当有人尝试申请 10GB 内存,而最大值是 4GB 时,文件创建阶段就会立即校验失败。这种“左移”做法可以在资源浪费发生前就被发现,使 FinOps 成为标准开发流程的一部分。

 

流水线如何工作:CI 与 CD 的分离

该平台通过多项目流水线将 CI 与 CD 明确拆分开来。这种分离方式带来了多方面的好处。

 

  • CI 流水线工作

CI 流水线只处理代码相关的工作。它负责构建应用、运行测试、执行安全检查,并生成打包后的制品。最终产出的是一个经过测试、具备安全保障、带有版本标识的容器镜像,可以部署到任意环境中。

  • CD 流水线工作

CD 流水线则接手 CI 的产出,负责部署和基础设施层面的工作。它读取配置文件并执行关键变更,包括在需要时创建云资源、通过 Helm Chart 将应用部署到 Kubernetes 集群,以及使用 Puppet 等配置管理工具完成环境配置和部署。

 

这种拆分让每条流水线都能更好地发挥自身作用。CI 流水线会在每次代码变更时快速运行,提供即时反馈;而 CD 流水线运行频率相对较低,通常需要审批,重点放在跨环境的基础设施变更和部署操作上。

 

Schema 校验:尽早发现问题

平台中最强大的能力之一是 Schema 校验,它会在所有流程开始之前率先执行。Schema 用来定义一系列规则,例如:

  • 最大 CPU:2000m(2 核)

  • 最大内存:4Gi

  • 最大副本数:20

  • 允许使用的节点池:standard、high-memory、high-cpu

  • 必填字段:应用名称、运行时、资源限制

 

当开发者创建或更新配置文件时,Schema 校验会立即触发。如果有人尝试申请 5GiB 内存(超过 4GiB 的上限),校验会直接失败,并给出清晰明确的错误提示。这种校验发生在 YAML 编写阶段,而不是部署阶段,从而节省时间,并在资源浪费发生之前就将问题拦截下来。

 

智能化的基础设施创建

当开发者在配置文件中声明所需的云资源时,CD 流水线会先检查这些资源是否已经存在,并在必要时进行创建或更新。例如,当开发者新增一个 Azure Storage 资源时:

azure:  storage:    - name: user-uploads      type: blob      tier: hot      retention_days: 90
复制代码

 

流水线中的 Terraform 部分会:

  • 检查该存储账户是否已经存在于 Azure 中(这一能力本身也是 Terraform 的特性)。

  • 根据配置文件中指定的参数创建或更新资源。

  • 将连接信息(例如存储账户的连接字符串或密码)保存到 Azure Key Vault 中(同样可以通过 YAML 进行控制)。

这种方式消除了开发团队与运维团队之间大量的人工协作成本。开发者只需要描述“我需要什么”,具体的创建、更新和编排过程则由平台自动完成。

 

内置的安全检查

安全并不是可选项,而是贯穿每一次流水线执行。在 CI 阶段,平台会自动执行以下安全检查:

  • 依赖项检查

自动扫描第三方依赖包中已知的安全漏洞。一旦发现问题,流水线会立即中止,不会生成可部署的构件。

  • 代码安全测试

对代码进行静态分析,检测潜在的安全隐患、硬编码的密码以及其他风险点

  • 容器镜像扫描

检查容器镜像中操作系统层面的安全漏洞,确保所使用的基础镜像是安全可信的。

 

通过将这些检查自动化,安全被自然地融入到日常开发流程中,而不再是独立审批步骤。这一点在受监管的行业中尤为关键:在 CI 阶段就持续、统一地执行安全控制,可以显著降低审计风险、缩短评审周期,并防止不合规的变更进入共享环境或生产环境。

 

简化 Kubernetes 的复杂性

对开发者来说,Kubernetes 往往非常复杂,而这种方案在保留灵活性的同时,将底层复杂性很好地隐藏了起来。

 

这一点在微服务场景下尤其有价值。一个需要维护十个微服务的团队,只需要对应维护十个简洁的配置文件,而不是成堆的 Kubernetes Manifest 文件。每个微服务都可以在配置中清楚地声明自身需求,一目了然:

# Service 1: Web API - standard resourcesresources:  kubernetes:    cpu: 250m    memory: 512Mi    replicas: 5    autoscaling:      enabled: true      minReplicas: 5      maxReplicas: 20    nodePool: standard# Service 2: Data processor - high memoryresources:  kubernetes:    cpu: 1000m    memory: 4Gi    replicas: 2    autoscaling:      enabled: true      minReplicas: 2      maxReplicas: 8    nodePool: high-memory
复制代码

以 Web 路由为例,开发者只需要在配置中指定一个主机名即可:

networking:  hostname: api.payments.example.com
复制代码

平台的部署流水线如下:

  • 创建 Kubernetes Ingress 资源

  • 配置 TLS 证书

  • 如果与云端 DNS 集成还会自动更新 DNS 记录

  • 按照公司统一的标准应用流量治理规则

 

部署到多个环境

该平台支持还可应用部署到多个环境中,例如开发、预发布和生产环境,并允许针对不同环境进行差异化配置。在这个示例中,我们使用了 Puppet 来应用这些环境相关的设置。不过,同样的模式也完全可以应用到其他工具上,例如基于 GitOps 的方案(如 GitLab CD),以及其他配置管理工具(如 Ansible、Chef)。这种方式有效解决了一个常见难题:在保持各个环境整体一致性的同时,又能支持必要的差异,比如数据库端点、API 凭证以及扩缩容参数等。

 

当 CD 流水线向某个环境部署时,会执行以下流程:

  • 运行一个参数化的 Puppet 模块,用于接收环境特定的配置值

  • 从配置文件中传入应用级设置

  • 由 Puppet 负责处理系统级和相对固定的配置项,例如 Kubernetes 集群名称、Azure Key Vault 名称,以及部署时使用的运行时参数

  • 在这一过程中,各个环境彼此隔离,但部署逻辑是复用的,同时还能持续维护各环境的期望状态

 

这种做法充分发挥了两类工具的优势:Kubernetes 负责应用的运行、管理和弹性伸缩,而 Puppet 则确保系统层面的配置在所有服务器和环境中保持一致。

 

挑战

尽管本文所描述的方法在很大程度上缓解了问题,但仍然存在一些挑战:

  • 简化的边界

某些高度定制化的应用可能需要简单配置文件之外的更多设置。平台团队需要在“足够简单”和“支持高级或例外场景的定制能力”之间取得平衡。随着新的基础设施能力出现,或开发者需求不断变化,配置文件本身也需要随之演进。

  • Schema 维护成本

随着需求演进,校验用的 schema 也必须持续更新。如果规则过于严格,开发者会感觉处处受限;如果规则过于宽松,又会削弱成本控制能力,影响 FinOps 实践。如何在灵活性与约束之间找到合适的平衡点,需要长期、持续的调整和优化。

  • 流水线复杂度

随着应用数量增加,既要创建基础设施、又要负责部署的多阶段流水线本身也会变得复杂。必须确保这些流水线具备良好的扩展性,同时流水线基础设施(例如 GitLab Runner)也有足够的容量来支撑。由于部署流水线在这种方案中是最繁忙的部分,需要定期回顾和优化,以避免性能下降或执行变慢。同时,清晰的错误信息、详细的日志以及完善的排错指南都是必不可少的。

  • 密钥与凭证安全 

虽然托管式的密钥管理服务能够提供安全的基础能力,例如定期轮换密钥、安全访问、避免在日志中泄露等,但在 CI/CD 和部署流程的设计上仍需格外谨慎,才能确保端到端的安全性。

 

成功的衡量标准

平台工程的成效,应当从它在多大程度上改善了开发者体验来衡量,包括但不限于以下方面:

  • 首次部署时间:新开发者完成第一次应用部署需要多长时间?

  • 部署速度:团队是否能够更频繁地进行部署?

  • 开发者满意度:通过定期调查,评估平台是否真的让日常工作变得更轻松。

  • 成本效率:团队是否在更高效地使用资源?资源过度分配的情况是否在减少?

  • 评审效率:将配置集中到单一文件中,是否缩短了代码评审所需的时间?

  • 可扩展性:随着使用平台的团队数量增加,这种方式是否依然能够保持良好性能并顺利扩展?

 

根据我的实践经验,在引入该平台之后,部署时间从原本的数小时缩短到几分钟,开发者交付新功能的速度提升了约 40%。同时,通过 schema 校验,资源过度分配的情况减少了约 60%,直接带来了云成本的优化。

 

结论

随着企业云上规模不断扩大,这种模式的优势会愈发明显。平台工程并不是让每个团队各自重复解决基础设施和部署问题,而是为整个组织提供一条“黄金路径”:一套经过验证、自动化、并且持续演进的工作方式,帮助团队在提升交付速度的同时有效控制成本。

 

未来的方向,并不是把每一位开发者都培养成基础设施专家,而是通过构建优秀的平台,让基础设施对开发者“隐形”,让运维自动化成为默认能力,使开发者能够专注于业务价值本身。

 

原文链接:

https://www.infoq.com/articles/platform-golden-path-approach/