AWS ECS:监控服务更新的状态



我正在尝试使用Fargate将一组微服务从Docker Swarm迁移到AWS ECS。

我创建了一个ECS集群。此外,我已经使用ECR初始化了存储库,每个存储库都包含一个微服务的映像。

我已经成功地想出了一种方法来创建新的图像,并将它们推送到ECR中。事实上,随着代码的每一次更改,都会构建、标记和推送一个新的docker映像。

此外,我创建了一个链接到服务的任务定义。此任务定义包含一个容器和所有必要的信息。此外,它的服务定义了任务将在VPC中运行,并链接到负载均衡器,并有一个目标组。我假设每个新部署都使用带有"最新"标记的映像。

到目前为止,根据我所解释的,一切都很清楚,运行良好。

下面是让我困惑的部分。每次新建后,我都想更新服务,以便部署带有更新映像的新任务。我使用cli执行以下命令:

aws ecs update-service --cluster <cluster-name> --service <service-name>

通常,在执行该命令后,我会在事件选项卡下监视部署日志,并使用以下命令检查服务的状态:

aws ecs describe-services --cluster <cluster-name> --service <service-name>

最后,我尝试模拟一个新创建的图像包含错误代码的情况。因此,新任务将无法部署。我所看到的是,法盖特将继续尝试(不停地)部署新任务。此外,除了事件日志之外,describe-services命令不包含相关信息,除了Fargate正在做的事情(例如,注册/取消注册任务)。我很惊讶,我找不到任何指示Fargate或服务停止部署并回滚到现有机制的机制。

我找到了这篇文章(https://aws.amazon.com/blogs/compute/automating-rollback-of-failed-amazon-ecs-deployments/),这提供了一个解决方案。然而,这是一个相当复杂的问题,并且假设每个新的部署都是由一个新的任务定义触发的,这不是我想要的。

因此,考虑到我上面所描述的,我希望你能回答以下问题:

1) 使用CLI命令(出于自动化目的)在几次尝试后未能部署新任务后,是否有方法指示Fargate自动停止当前部署?

2) 使用CLI命令,是否有方法监视部署的当前状态?例如,当对Docker swarm上的服务进行服务更新时,终端会生成更新过程的实时日志

3) 部署失败后,Fargate有没有办法发出错误代码、标志或消息?

到目前为止,您有一种方法可以做到这一点:

aws ecs wait services-stable --cluster MyCluster --services MyService

上一个示例只有在确认集群上运行的服务稳定后才会暂停并继续。将在40次检查失败后返回255退出代码。

要取消部署,请在创建服务时启用ECS断路器:

aws ecs create-service 
--service-name MyService 
--deployment-configuration "deploymentCircuitBreaker={enable=true,rollback=true}" 
{...}

参考文献:

  • 服务部署检查
  • 断路器

目前ECS不直接提供部署状态。发布部署后,除了不断轮询更新之外,没有其他方法可以确定其状态,直到您有足够的信息从中推断。加上unexpected container exits没有记录在任何地方。你必须搜索失败的任务。我获取它们的方式是通过cloudwatch规则,该规则在任务状态更改时触发lambda。

我建议您阅读:https://medium.com/@aaron.kaz.music/monitoring-the-health-of-ecs-service-deployments-baea41ae737

最新更新