重新构想云原生架构的环境

传统环境已不适用于云原生架构!用共享基线环境+应用层隔离,配合动态路由,实现Dev、QA、Staging环境整合。按需数据隔离,兼顾效率与安全。性能测试、混沌工程等场景,可选用临时专业环境。Signadot等平台助力落地,拥抱云原生,提速微服务!

译自:Reimagining Environments for Cloud Native Architectures

作者:Arjun Iyer

随着云原生架构和 微服务 改变了我们构建应用程序的方式,我们的测试环境仍然顽固地停留在过去的时代。传统的环境演进——代码从开发到 QA 到预发布再到生产的顺序跳跃——对于部署为单个单元的单体应用程序来说是完全合理的。但在 分布式系统 和自治团队的世界中,这种线性路径会产生根本性的矛盾。

微服务承诺独立的部署能力和团队自治,但我们的环境模型迫使它们回到同步的、单体的演进中。一个准备发布关键修复的支付服务团队仍然必须像推荐服务中的实验性功能一样,通过相同的严格环境关卡。我们的架构(分布式)和我们的测试模型(集中式)之间的这种不匹配会产生巨大的摩擦。

当前的默认设置

如今,大多数组织都在多个预生产环境中运行,这些环境镜像了生产基础设施:

  1. 开发 (Development):团队执行初始集成测试的地方
  2. 质量保证 (QA):质量保证团队验证功能的地方
  3. 预发布/预生产 (Staging/pre-prod):生产前的最终验证
  4. 生产 (Production):为真实用户提供服务的实时系统

在这种模型中,代码更改以批处理方式通过每个环境,通常按计划的节奏进行。这会产生几个关键的瓶颈:

  • 排队和争用 (Queuing and contention):由于多个团队共享每个环境,开发人员经常需要等待数小时才能访问环境
  • 调试复杂性 (Debugging complexity):当发生故障时,在许多最近的更改中识别出罪魁祸首就变成了一个“谋杀之谜”。
  • 缓慢的反馈周期 (Slow feedback cycles):集成问题通常只在代码合并后才会出现,需要昂贵的上下文切换才能修复。

也许最令人担忧的是,这种方法将“瀑布式”测试过程重新引入到所谓的敏捷架构中。代码更改在每个环境中累积,并按批次进行测试,通常按固定时间表进行。这通过迫使团队回到同步发布周期,从而破坏了微服务的核心优势——独立部署能力。当运行全面的测试套件既昂贵又耗时时,组织自然会将更改批量处理在一起,从而为分布式架构创建一个单体测试过程。

随着团队和服务数量的增加,这些问题会变得更加复杂。我合作过的公司经常报告说,工程师花费 20% 到 30% 的时间来管理与环境相关的问题,而不是构建功能。

一种新方法

像 Uber、Lyft 等领先的工程组织已经开创了一种根本不同的模型:将多个预生产环境(开发、QA、预发布)整合到一个 共享的基线环境 中,并通过智能请求路由实现应用层隔离。

这种方法不是维护多个顺序环境,而是:

  1. 维护一个镜像生产环境的稳定基线环境
  2. 仅为每个测试场景启动正在修改的服务
  3. 使用动态路由将测试流量定向到正确的服务版本
  4. 共享底层基础设施,同时保持逻辑隔离

例如,当测试对 50 个服务架构中的一个服务的更改时,您只需部署修改后的服务,而不是全部 50 个服务。测试请求会智能地路由到该服务的测试版本,同时对其他所有内容使用基线。

至关重要的是,这种基于请求的隔离意味着每个开发人员都可以独立测试他们的更改,而不会干扰其他人的测试流程。不再需要等待环境访问或担心 别人的测试会破坏 您的验证过程。每个沙箱都在 请求级别上隔离运行,即使共享相同的底层基础设施。

可调整的数据隔离

关于这种方法的一个常见问题是:“数据隔离呢?” 解决方案是一种可调整的隔离模型,它为您提供两全其美的优势:

  • 默认共享数据:默认情况下,沙箱与基于租户的隔离共享数据库访问。这对于使用真实的、类似生产的数据进行测试非常宝贵——这通常是传统环境复制中最困难的方面。
  • 按需隔离:如果特定测试需要完全的数据隔离(例如破坏性操作或模式迁移),则可以配置临时数据存储,使用必要的数据进行填充,并将其绑定到沙箱生命周期。 这种灵活性使团队能够在共享基础设施的优势与特定测试场景的隔离要求之间取得平衡。

这种方法极大地改变了开发人员的体验。每个开发人员都可以获得自己的隔离测试沙箱,设置时间以秒而不是小时来衡量,而无需等待共享环境和批量测试。最重要的是,它通过允许团队按照自己的节奏验证和交付更改,恢复了微服务的独立部署承诺。

何时专业环境仍然有意义

虽然整合开发、QA 和预发布环境对于大多数测试需求来说是有意义的,但某些专业的测试场景确实需要单独的环境:

专注的测试环境

某些类型的测试受益于专用环境:

  • 性能测试:负载测试可能会中断正常运行,并且需要专门的监控。
  • 混沌工程:故意中断系统以测试弹性本质上是具有破坏性的。
  • 安全验证:渗透测试和漏洞评估可能会影响可用性。
  • 客户预览环境:向客户展示新功能需要稳定性。

合规性要求

在受监管的行业中,可能需要明确的分离:

  • 诸如 HIPAA、PCI-DSS 或 FedRAMP 等法规强制执行的严格数据隔离
  • 显示测试和生产系统之间清晰边界的审计跟踪
  • 在认证过程中保持静态的验证环境

使专业环境成为临时的

即使是专业的环境也不需要永久配置。仅在需要时启动的按需环境可确保干净、一致的测试条件,同时消除空闲资源。例如,一家金融服务公司可能会维护一个持久的基线环境,但为特定需求(如季度安全审计或性能测试)创建临时环境。

混合模型:合理调整您的环境策略

最佳方法结合了:

  1. 具有应用层隔离的单个共享基线环境(取代传统的开发-QA-预发布流程)
  2. 用于需要真正隔离的特定测试需求的按需专业环境

这种模型恢复了微服务的独立部署承诺,同时仍然在真正需要的地方提供适当的隔离。团队可以为每个场景选择正确的测试方法,而不是采用一刀切的方法,将所有测试都强制纳入相同的模式。

结论

传统的多环境流程已经与云原生架构不一致。通过将开发、QA 和预发布整合到具有应用层隔离的单个基线环境中,组织可以恢复微服务的独立部署承诺。

虽然像 Uber 和 Lyft 这样的公司为此方法构建了自研解决方案,但像 Signadot 这样的平台现在使所有规模的工程团队都可以使用这些功能。

未来不是盲目地复制环境,而是有意识地决定何时以及如何隔离我们的系统。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注