亚马逊 ec2 连接不上_在Amazon EC2上轻松进行蓝绿色部署
亚马逊 ec2 连接不上
Amazon EC2容器服务(ECS)是Amazon用于运行和编排Docker容器的解决方案。 它提供了一个接口,用于定义和部署可在EC2实例集群上运行的Docker容器。
ECS群集的初始设置和配置并不是一件容易的事,但是一旦配置好,它就能很好地工作,并使基于容器的应用程序的运行和扩展相对容易。 ECS还支持内置的蓝绿色部署,但首先我们将介绍有关设置ECS的一些基础知识。
在ECS中,您可以创建任务定义 ,该定义与docker-compose.yml文件非常相似。 任务定义是容器定义的集合,每个容器定义都有一个名称,要运行的Docker映像以及覆盖该映像的入口点和命令的选项 。 您还可以在容器定义中定义环境变量,端口映射,要挂载的卷,内存和CPU分配,以及是否应将特定容器视为必不可少的部分,这是ECS知道任务是否正常或需要重新启动的方式。 。
您可以在任务定义中为多容器应用程序设置多个容器定义。 ECS知道默认情况下如何从官方Docker Hub提取信息,也可以配置为从私有注册表提取信息。 但是,私有注册表需要对EC2主机实例上安装的Docker客户端进行其他配置。
一旦有了任务定义,就可以从中创建服务 。 服务允许您定义要运行的任务数量,并与Elastic Load Balancer(ELB)关联。 当任务映射到特定端口(例如443)时,ECS群集中的每个EC2实例只能运行一个任务实例。 因此,您运行的任务不能超过EC2实例。 实际上,您需要确保运行的任务至少比EC2实例的数量少,以便利用蓝绿色部署。 任务定义已版本化,服务已配置为使用任务定义的特定版本。
什么是蓝绿色部署?
蓝绿色,黑红色,樱红色长春花,使用什么颜色真的没关系。 关键是存在两个独立但相等的环境。
在任何给定的时刻,您的应用程序都在一个环境中运行,而另一个环境要么被破坏以节省资源,要么处于空闲状态等待下一次更新。 第二个环境使您可以在不中断当前活动环境的情况下部署更新。 部署准备就绪后,可以更新负载均衡器/路由器,以将流量路由到新环境。
这个概念不是新概念,但是由于第二环境的要求,尚未被广泛采用。 根据您的应用程序体系结构的大小和复杂性,第二个环境可能会非常昂贵且难以管理。 利用Docker容器和微服务架构可以帮助缓解这一挑战。 使用ECS在EC2上管理容器可以进一步减轻这种负担。
Amazon ECS如何处理蓝绿色部署
当服务更新为使用任务定义的较新版本时,ECS有助于进行蓝绿色部署。 当您定义服务并设置应运行的任务数时,假设您有足够的容量执行任务,ECS将确保许多任务正在运行。 将服务更新为使用任务定义的新版本时,只要集群中有可用容量,它将从新定义启动新任务。 当启动新任务时,它将耗尽旧任务的连接并杀死它们。
看一个最基本的示例,请考虑在一个ECS群集中有两个EC2实例。 您已定义了运行单个任务实例的服务。 该任务将仅在其中一个EC2实例上运行。 更新任务定义并更新服务以使用新的任务定义时,ECS将在第二个EC2实例上启动一个新任务,在ELB实例上注册它,从第一个EC2实例中删除连接,然后终止旧任务。
如前所述,您将要确保集群中至少有一个额外的EC2实例,而不是您在服务中设置的任务数。 如果在此基本示例中,我们有两个正在运行的任务,则每个EC2实例上将有一个任务,ECS将没有备用容量来启动新任务,因此将无法进行蓝绿色部署。 您将必须手动终止至少一项任务才能启动该过程。
还值得注意的是,每次ECS启动任务时,它将拉定义中指定的Docker映像。 因此,当您构建映像的新版本并将其推送到注册表时,在ECS中启动的下一个任务将提取该版本。 因此,从持续集成和交付的角度来看,您只需要构建映像,推送到注册表并在ECS上触发蓝绿色部署,即可使更新的应用程序上线。
以下是一系列图表,它们说明了ECS上简化的蓝绿色部署过程。
- 首先,我们有一个运行两个任务的服务。 这两个任务在EC2实例1和EC2实例2之间划分。
- 已创建更新的任务定义,并且已更新服务以使用新的任务定义。 ECS在EC2实例3上启动一个新任务,并开始消耗以前任务的连接。
- 随着连接从现有任务中耗尽,ECS将一次杀死一个并启动其他任务,直到达到所需的数量为止。
- 当ECS达到所需的运行任务数时,它将杀死仍在运行该任务的先前版本的所有剩余任务。
就是这样。 该应用程序的更新版本在新的“绿色”环境中运行。 借助ECS,将蓝色和绿色环境分开的概念有点虚幻和流畅,但是由于容器是隔离的,所以实际上没有关系。
ECS部署:触发蓝绿色部署的简单而优雅的方法
在ECS上触发蓝绿色部署非常简单:创建任务定义的新版本(无需更改)并更新服务以使用新定义。 但是,每次要部署时都手动进行此操作有点麻烦,尤其是在无需更改任务定义的情况下。
作为开发团队,我们喜欢运行一个连续的集成和交付过程,该过程使我们能够通过将代码与git repo中的适当分支合并来轻松触发部署。 与development的合并意味着应该将其部署到我们的暂存环境中,而与master的合并意味着应该将其部署到生产中。 除了合并并推送到git之外,我们不需要任何其他手动处理。
我们的持续集成过程克隆了我们的仓库,构建了我们的Docker映像,对该映像执行了单元测试,将该映像推送到我们的私有注册表(在ECS上运行),最后触发了ECS上的蓝绿色部署。 当我们寻找触发ECS更新/部署的解决方案时,选项非常复杂。 我们可以使用Amazon的CodeDeploy或Elastic Beanstalk,但是它们需要一个不同的构建过程,该过程与我们在CI中运行的过程不匹配。
由于触发蓝绿色部署所需的全部工作就是对任务定义和服务的更新,因此我们编写了一个包含一些参数的shell脚本,然后与AWS命令行工具一起使用以获取当前任务定义,创建一个新版本,并更新服务以使用它。 它工作得很好,非常简单。 触发更新后,它会监视服务以确保它在退出之前正在运行更新的版本。 如果看到新版本正在运行,它将以正常的零状态代码退出; 否则退出并出现错误。 这样,我们的CI / CD流程就会知道部署是否成功,并且可以通知我们部署失败。
顺便说一句, 我们的脚本是带有MIT许可证的开源软件。
ecs-deploy
可作为外壳脚本和Docker映像使用。 该脚本使用sed之类的Linux实用程序,它们在Linux和Mac上的行为不同,更不用说Windows了。 使用Docker映像可能会给您带来更多的一致性。
ecs-deploy的要求
ecs-deploy
使用其他软件来执行其工作。 值得注意的是,它使用AWS CLI工具,通常通过运行pip install awscli
通过pip install awscli
。 它还使用jq
,它是命令行JSON解析器。
尽管该脚本不需要您设置任何环境变量,但强烈建议您以这种方式设置AWS API凭据,以使它们不在您的shell历史记录和进程列表中。 还可以通过环境变量设置AWS区域,以将命令行选项保持在最低限度。
使用shell脚本
如果您已克隆存储库或将ecs-deploy
脚本下载到路径中,则可以运行它以获取完整的使用选项。 这是一个例子:
$ ecs-deploy -c clusterName -n serviceName -i repo/name:tag
该示例假设您已经为AWS_ACCESS_KEY_ID
, AWS_SECRET_ACCESS_KEY
和AWS_DEFAULT_REGION
配置了环境变量。
使用Docker映像
如果您不想安装jq
和AWS CLI
(或依赖的Python工具,例如easy_install
),则可以运行Docker映像。
使用Docker映像的最佳方法是克隆ecs-deploy
项目存储库,并使用提供的docker-compose.yml配置。 通过使用Docker Compose运行映像,您可以通过文件提供与AWS相关的环境变量,以将其排除在命令行参数之外。 克隆存储库时,将local.env.dist文件复制到local.env并将凭据添加到该文件中。 然后,您可以使用docker-compose run ecsdeploy
来运行映像。
Docker镜像使用ecs-deploy
脚本的入口点,因此您只需要以与Shell脚本相同的方式提供参数即可。 这是一个例子:
$ git clone https://github.com/silinternational/ecs-deploy.git
$ cd ecs-deploy/
$ cp local.env.dist local.env (edit local.env to add your credentials and default region)
$ docker pull silintl/ecs-deploy:latest
$ docker-compose run --rm ecsdeploy \ -c clusterName -n serviceName -i repo/name:tag
如果要将ecs-deploy
合并到自己的docker-compose项目中,则可以使用以下命令添加另一个服务:
ecsdeploy: image: silintl/ecs-deploy:latest env_file: - local.env
确保使用您的AWS凭证配置了env_file以便安全操作。
结论
蓝绿色部署提供了一种在发行期间最大程度地降低生产影响的好方法,并且Amazon的EC2容器服务简化了许多复杂的过程。 我认识到我们的用例相对简单,以这种方式部署的应用程序可能不那么容易,但是,更大型,更复杂的应用程序绝对不容易,但是绝对值得研究。 我们对由代码更改触发的部署进行自动化的舒适性确实使我们的行为和开发过程变得更好。 它使我们更加敏捷,并且我们的开发人员更高兴没有大量的构建和发布过程。
我们发现我们的ecs-deploy
脚本对于ecs-deploy
非常有用,易于使用且可靠,我希望您也能从中受益。 感谢您提出的改进建议,也欢迎提出新功能的要求。 在下面发布您的评论和问题,以保持对话的进行。
资源资源
- Amazon EC2容器服务
- 码头工人
- Docker撰写
- Docker中心
- AWS CLI
- JQ
- ecs部署
翻译自: https://www.javacodegeeks.com/2015/09/easy-blue-green-deployments-on-amazon-ec2.html
亚马逊 ec2 连接不上
亚马逊 ec2 连接不上_在Amazon EC2上轻松进行蓝绿色部署相关推荐
- 亚马逊中国云计算服务器,云计算实战:Amazon EC2之初体验
[IT168 资讯]由于项目的需要,这几个月都在使用Amazon的EC2.这个东西对于国内的用户来说比较陌生,但是听国外的同事说,这在美国可是相当流行.这里简单介绍一下,大家有兴趣也可以试试.[本文转 ...
- 亚马逊账户锁定无法登陆_如何删除您的亚马逊账户
亚马逊账户锁定无法登陆 Deleting your Amazon account is the only way to completely erase your purchase history. ...
- 亚马逊asin关键词排名追踪_亚马逊卖家快速提升关键词排名,这几点需要重视...
亚马逊卖家如何提升关键词排名,是很多人比较头疼的问题,也是非常重要的问题. 毕竟亚马逊A9算法只认关键词,却并不认识产品,关键词就是产品的识别码,描述不精准或者错误的关键词,将给你的listing带来 ...
- 关于amazon亚马逊SP-API申请注册,amazon亚马逊SPAPI开发人员资料注册,amazon亚马逊Selling Partner API申请注册详细指导
关于amazon亚马逊SPAPI开发人员资料注册,amazon亚马逊开发人员资料申请注册,amazon亚马逊销售合作伙伴 API申请注册,amazon亚马逊SP-API申请注册,amazon亚马逊Se ...
- 亚太成为第一季度全球存储市场唯一增长地区;亚马逊云科技在中国区域推出Amazon ECS Anywhere | 全球TMT...
行业观察 Gartner公布2021年第一季度全球存储市场报告,报告显示,一季度全球存储市场销售额317亿元,出货量7.5万台,同比下滑2%.5%.受新冠疫情影响,企业存储市场在全球各地区的表现喜忧参 ...
- 亚马逊 ec2 连接不上_在Amazon EC2上设置WordPress
亚马逊 ec2 连接不上 The general consensus of opinion, is that self hosting a WordPress blog is the best way ...
- 亚马逊fire充不上电_如何在Amazon Fire Tablet或Fire HD 8上安装Google Play商店
亚马逊fire充不上电 Amazon's Fire Tablet normally restricts you to the Amazon Appstore. But the Fire Tablet ...
- 亚马逊asin关键词排名追踪_亚马逊listing关键词的挖掘和布局!让产品关键词排名上首页...
卖家都知道亚马逊A9算法决定listing的排名,而A9算法的运作规律是根据listing中的关键词的相关性来决定产品排名的,相关性主要包括这几个方面:一是关键词与listing本身的相关性:二是客户 ...
- 亚马逊fire充不上电_如何在Amazon Fire TV上使用Alexa语音助手
亚马逊fire充不上电 Unbeknownst to many Amazon Fire TV and Fire TV Stick owners, you can easily access Amazo ...
最新文章
- 4-2-串的堆存储结构-串-第4章-《数据结构》课本源码-严蔚敏吴伟民版
- java lock unlock_详解Java中的ReentrantLock锁
- 7-37 组个最小数 (20分)_波音737高度计上蹊跷的“8英尺”,09年土耳其航空1951号航班空难...
- Spring 注解AOP 入门
- 特稿:OceanBase 连破纪录的背后,是技术人的砥砺前行 | 凌云时刻
- URL和Socket
- linux用sed替换字符,Linux中使用sed命令替换字符串小结
- IIS Express 7.5 directory browsing 启用目录浏览
- python常用内置库时间,日期与JSON转换
- bootstrap table获取表格数据方式
- 厦门市各公交线路途经站点
- 电脑使用技巧提升篇9:使用360压缩软件文件加密
- 大数据专业毕业后前景如何?能做什么职位?
- 三层架构(我的理解及详细分析)
- 解决 PR 或 AE 启动不了桌面弹出 Crash 文件
- RSA - 非对称加密算法简要介绍与JAVA实现
- java设计模式之享元设计模式
- WhatsApp客服系统,为什么使用SendWS拓客系统实现WhatsApp客服系统多账号管理?
- macOS下使用命令行制作 MacOS cdr/iso 镜像文件
- 极客时间 DDD 学习笔记03