动态舞台路由 / Multi-Cluster 使用 Fargate 设置

Dynamic Stage Routing / Multi-Cluster Setup with Fargate

我有一个 Fargate 集群,其服务包含两个容器:

  1. 一个容器运行 nginx 用于终止 mTLS(它接受定义的 CA 列表)并使用客户端证书的 DN 将调用转发到应用程序容器
  2. a Spring tomcat 上的应用程序 运行 通过过滤器[=37] 根据传入的 DN 执行 fine-grained 授权检查(每个路由和 HTTP 方法) =]

来自 nginx 的端点通过 NAT 网关暴露在互联网上。

基础设施通过 terraform 进行管理,新版本的推出是通过任务定义替换完成的,然后指向 ECR 中的新图像。 ECS 负责启动新容器,然后在 5 到 10 分钟内将 DNS 切换到那些容器。

此设置的问题

  1. 我无法执行 Canary 或 blue/green 部署
  2. 如果新的应用程序版本有问题(应用程序无法启动,我们有巨大的错误峰值,......)回滚将花费很多时间。
  3. 我无法在不应用新版本的情况下测试我的集成服务,因此可能会破坏一切。

我的目标是一些具有多个集群的概念和基于特定 header 的路由。这样我就可以用我的新应用程序版本启动一个新集群,并且在我 a) 发送特定的 header 或 b) 之前,流量不会被路由到这个版本完全切换到新版本,例如使用特定的 SSM 参数。

基本上,您可以在 CloudFront 上使用 Lambda@Edge 轻松完成静态前端部署(使用多个源存储桶并根据传入请求使用 lambda 切换源)。

因为我需要 mTLS 和那些 fine-grained 授权,所以我既不能使用标准 ALB 也不能使用 API 网关。

还有其他智能解决方案可以满足我的要求吗?

为了最终解决这个问题,我们没有继续复制任务定义(xxx-blue 和 xxx-green)和 ELB 并创建两个不同的 A 记录。部署过程:

  1. 通过检查两个 CNAMES 的权重(其中一个权重为 0%)找出哪个任务定义处于非活动状态
  2. 在 ECR 替换包含新图像的非活动定义。
  3. 等待应用变得健康
  4. 通过 CNAME 记录将流量切换到替换任务定义的 ELB
  5. 运行 集成测试并验证没有日志异常
  6. (手动触发)将其他任务定义中的所需任务设置为零以缩减旧版本。否则,如果出现意外行为,可以使用 A 记录将流量切换回旧任务的 ELB。

我们没有实现的是:具有基于客户端的路由到不同的任务。