amazon-web-services - 使用 Fargate 进行动态舞台路由/多集群设置
问题描述
我有一个带有两个容器的服务的 fargate 集群:
- 一个运行 nginx 的容器,用于终止 mTLS(它接受定义的 CA 列表)并将调用转发到具有客户端证书 DN 的应用程序容器
- 在 tomcat 上运行的 Spring 应用程序,它通过过滤器基于传入的 DN 执行细粒度的授权检查(每个路由和 HTTP 方法)
来自 nginx 的端点通过 NAT 网关暴露在互联网上。
基础设施通过 terraform 进行管理,推出新版本是通过任务定义替换完成的,然后指向 ECR 中的新图像。ECS 负责并启动新容器,然后在 5 到 10 分钟内将 DNS 切换到这些容器。
此设置的问题:
- 我无法进行金丝雀或蓝/绿部署
- 如果新的应用程序版本出现问题(应用程序无法启动,我们有巨大的错误峰值,......)回滚将花费大量时间。
- 如果不应用新版本,我无法测试我的服务集成,因此可能会破坏一切。
我的目标是具有多个集群和基于特定标头的路由的一些概念。这样我就可以使用我的新应用程序版本启动一个新集群,并且在我 a)发送特定标头或 b)完全切换到具有特定 SSM 参数的新版本之前,流量不会被路由到该版本。
基本上,您可以在 CloudFront 上使用 Lambda@Edge 轻松进行静态前端部署(使用多个源存储桶并根据传入请求使用 lambda 切换源)。
由于我需要 mTLS 和那些细粒度的授权,我既不能使用标准 ALB 也不能使用 API 网关。
是否有其他智能解决方案可以满足我的要求?
解决方案
为了最终解决这个问题,我们没有继续复制任务定义(xxx-blue 和 xxx-green)和 ELB 并创建两个不同的 A 记录。部署过程:
- 通过检查两个 CNAMES 的权重找出哪个任务定义处于非活动状态(其中一个的权重为 0%)
- 替换在 ECR 中包含新图像的非活动定义。
- 等待应用程序变得健康
- 通过 CNAME 记录将流量切换到替换任务定义的 ELB
- 运行集成测试并验证没有日志异常
- (手动触发)将其他任务定义中的所需任务设置为零以缩小旧版本。否则,如果出现意外行为,A 记录可用于将流量切换回旧任务的 ELB。
我们没有做到这一点:拥有基于客户端的路由到不同的任务。
推荐阅读
- c# - 将响应流转换为 XML
- function - 在同一脚本中同时运行提升和非提升代码的问题
- sql-server - rsProcessingError - 报告服务错误 - rsErrorReadingNextDataRow
- jquery - 如何从选中的复选框中获取多个值?
- navigation - 离子角组件:如何销毁?
- c# - 如何使用 C# 将 html 网页转换为图像
- html - 在 Html 中显示 Angular 中的 JSON 文件
- python - 如何去除二进制图像中未连接到循环的白色像素
- reactjs - next.js/react 如何从无头 cms 创建页面
- typescript - 如何在现有的基于 ES6 的 ReactJS 应用程序中使用 TypeScript?