paint-brush
零停机部署:使用蓝绿技术升级您的 Dockerized 应用程序经过@abram
1,591 讀數
1,591 讀數

零停机部署:使用蓝绿技术升级您的 Dockerized 应用程序

经过 Abram5m2023/04/18
Read on Terminal Reader

太長; 讀書

在上一篇文章中,我们讨论了如何将您的 Python Web 应用程序持续部署到生产(或预开发/暂存)环境。如何在不造成任何停机的情况下部署 Dockerized Python 应用程序?让我们直接进入吧。对我有用的最有效的方法是蓝绿技术。
featured image - 零停机部署:使用蓝绿技术升级您的 Dockerized 应用程序
Abram HackerNoon profile picture

在我一个月前写的一篇文章中,我谈到了如何将 Python Web 应用程序持续部署到生产(或预开发/暂存)环境中。


您可以参考上一篇文章以任何其他语言部署您的应用程序。只要确保修改工作流文件即可。


我最近的任务是构建一个微服务(使用 Python 和 FastAPI)来匹配两个声音,并在它们是否匹配时给出预测分数。利益相关者要求语音解锁功能。


我们有一个工程会议,我站起来接受任务(或者我的领导为我站起来,哈哈)。


这是一项有趣的任务,因为我以前从未使用过 ML 模型(训练过或类似的)。我花了一周的时间来设计、构建代码并将其发送到 AWS EC2 实例。我是 CI/CD 的忠实粉丝,所以我使用了我最熟悉的东西——GitHub Actions。


一周后……要求进行更改,我想尝试一种我一直在研究的新 [部署] 技术。我需要在 AWS EC2 实例上正常运行的 dockerized 微服务应用程序,以便在我重新部署时不会遇到任何停机时间。


我的袖子里有完美的把戏。


那一招就是:蓝绿术


根据 AWS 蓝/绿部署白皮书,这是一种部署策略,您可以在其中创建两个独立但相同的环境。


一个环境(蓝色)正在运行当前的应用程序版本,一个环境(绿色)正在运行新的应用程序版本。如果部署失败,使用蓝/绿部署策略可以通过简化回滚过程来提高应用程序可用性并降低部署风险。


在绿色环境上完成测试后,实时应用程序流量将被引导至绿色环境,而蓝色环境将被弃用。


简单来说,蓝/绿部署技术是一种通过运行两个相同的生产环境来减少停机时间和风险的方法。


如果您是第一次听到这样的部署技巧,完全没有什么好怕的,我会为您提供详细的步骤,帮助您实现蓝绿部署。


我们将使用一个虚构的产品作为示例,因为出于 NDA 的原因,我不想使用我为公司构建的产品完成部署步骤。哈哈。


让我们直接进入步骤:


  1. 首先使用更新后的代码构建一个新的 docker 镜像,并用新的版本号标记它。


 $ docker build -t myexample:v2 .


这将使用当前目录中的Dockerfile创建一个带有标签myexample:v2新 Docker 镜像。


其中myexample:v2是新构建的 docker 镜像的名称。在我的例子中,它是 ML 项目的名称。例如, docker build -t companyx-servicename-backend:v2


  1. 从新图像启动一个新的 Docker 容器,但不要将其暴露给外界。


 $ docker run -d --name myexample-v2 myexample:v2


这将从myexample:v2图像中启动一个名为myexample-v2的新 Docker 容器。


  1. 等待新容器启动并初始化,确保其正常运行。


 $ docker logs myexample-v2


使用 docker logs 命令检查新容器的日志,以确保它已正确启动和初始化。


  1. 使用反向代理(例如 NGINX)将流量路由到新旧容器。配置您的反向代理以侦听请求,并将它们转发到旧容器和新容器。这将允许您逐渐将流量转移到新容器。


下面是路由两个容器的 NGINX 配置示例:


 upstream myexample { server myexample-v1:8000; server myexample-v2:8000 backup; } server { listen 80; server_name myexample.com; location / { proxy_pass http://myexample; } }


此配置使用两个服务器设置一个名为 myexample 的上游组: myexample-v1myexample-v2backup关键字用于将第二台服务器标记为备份。 proxy_pass指令用于将请求转发到myexample上游组。


确保更新反向代理配置以反映您的应用程序的名称和端口。


  1. 通过调整反向代理配置,逐步将流量从旧容器转移到新容器。


要将流量转移到新容器,请调整反向代理配置以赋予新容器更多权重。这可以通过从服务器指令中删除备份关键字来完成:


 upstream myexample { server myexample-v1:8000; server myexample-v2:8000; } server { listen 80; server_name myexample.com; location / { proxy_pass http://myexample; } }


这将导致 NGINX 向myexample-v2容器发送更多请求。监控您的应用程序,并根据需要调整配置,直到所有流量都流向新容器。


  1. 一旦所有流量都流向新容器,您就可以安全地停止并删除旧容器。


 $ docker stop myexample-v1 $ docker rm myexample-v1


这将停止并删除旧容器,释放服务器上的资源。


结论

如果您的应用程序依赖于关系数据库,那么蓝绿部署策略可能会导致在进行更新时蓝绿数据库之间出现不一致。


为确保最高级别的数据完整性,建议设置一个与过去和未来版本兼容的统一数据库。


我是这项技术的新手,显然,对此了解不多。但我将继续了解它的权衡和其他更有效的技术。你有没有想与我分享的一两个窍门?


我会很感激的。让我拥有它(在评论部分)。


哦,哦。不要忘记订阅我无聊的时事通讯。自第一季度以来,我学到了很多东西,很快就会分享。再见。