AWS ECS服务任务被替换,原因是请求超时。

11
我们已经将ECS作为容器编排层运行超过2年了。但是有一个问题我们一直无法找出原因。在我们的一些(node.js)服务中,我们开始观察到ECS事件中的错误。
service example-service (instance i-016b0a460d9974567) (port 1047) is unhealthy in target-group example-service due to (reason Request timed out)

这导致我们的依赖服务开始出现504网关超时,对它们产生了重大影响。

  1. 将Docker存储驱动程序从devicemapper升级到overlay2

  2. 我们增加了所有ECS实例的资源,包括CPU、RAM和EBS存储,因为我们发现其中一些容器存在问题。

  3. 将服务的健康检查优雅期从0增加到240秒

  4. 将KeepAliveTimeout和SocketTimeout增加到180秒

  5. 在容器上启用了awslogs而不是stdout,但没有异常行为

  6. 在容器中启用ECSMetaData,并将所有信息传输到我们的应用程序日志中。这有助于我们只查看有问题的容器的所有日志。

  7. 启用容器洞察以进行更好的容器级调试。

这些事情当中最有帮助的是升级devicemapper到overlay2存储驱动程序和将健康检查优雅期增加。

这两个措施使错误数量显著减少,但我们仍然偶尔遇到此问题。

我们已经查看了与实例和容器相关的所有图表,以下是其下降的日志:

受害容器的ECS容器洞察日志:

查询:

fields CpuUtilized, MemoryUtilized, @message
| filter Type = "Container" and EC2InstanceId = "i-016b0a460d9974567" and TaskId = "dac7a872-5536-482f-a2f8-d2234f9db6df"

示例日志已回答:

{
"Version":"0",
"Type":"Container",
"ContainerName":"example-service",
"TaskId":"dac7a872-5536-482f-a2f8-d2234f9db6df",
"TaskDefinitionFamily":"example-service",
"TaskDefinitionRevision":"2048",
"ContainerInstanceId":"74306e00-e32a-4287-a201-72084d3364f6",
"EC2InstanceId":"i-016b0a460d9974567",
"ServiceName":"example-service",
"ClusterName":"example-service-cluster",
"Timestamp":1569227760000,
"CpuUtilized":1024.144923245614,
"CpuReserved":1347.0,
"MemoryUtilized":871,
"MemoryReserved":1857,
"StorageReadBytes":0,
"StorageWriteBytes":577536,
"NetworkRxBytes":14441583,
"NetworkRxDropped":0,
"NetworkRxErrors":0,
"NetworkRxPackets":17324,
"NetworkTxBytes":6136916,
"NetworkTxDropped":0,
"NetworkTxErrors":0,
"NetworkTxPackets":16989
}

没有任何日志显示CPU和内存利用率异常高。

在t1时刻,我们停止收到受害容器的响应;在t1+2分钟时,我们在依赖服务中遇到错误,并在t1+3分钟时由ECS移除了该容器。

我们的健康检查配置如下:

Protocol HTTP
Path  /healthcheck
Port traffic port
Healthy threshold  10
Unhealthy threshold 2
Timeout  5
Interval 10
Success codes 200

如果您需要更多信息,请告诉我,我将很乐意提供。我们正在运行的配置如下:

docker info
Containers: 11
 Running: 11
 Paused: 0
 Stopped: 0
Images: 6
Server Version: 18.06.1-ce
Storage Driver: overlay2
 Backing Filesystem: xfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 468a545b9edcd5932818eb9de8e72413e616e86e
runc version: 69663f0bd4b60df09991c08812a60108003fa340
init version: fec3683
Security Options:
 seccomp
  Profile: default
Kernel Version: 4.14.138-89.102.amzn1.x86_64
Operating System: Amazon Linux AMI 2018.03
OSType: linux
Architecture: x86_64
CPUs: 16
Total Memory: 30.41GiB
Name: ip-172-32-6-105
ID: IV65:3LKL:JESM:UFA4:X5RZ:M4NZ:O3BY:IZ2T:UDFW:XCGW:55PW:D7JH
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

应该有一些指示来说明资源竞争、服务崩溃或真正的网络故障,以解释所有这些问题。但是,如上所述,我们并没有知道任何引起问题的原因。


似乎除了我的回答,还存在问题代理的问题。https://github.com/aws/amazon-ecs-agent/issues/1872 - Adiii
2个回答

3

你从1到7的步骤几乎与错误无关。

服务example-service(实例i-016b0a460d9974567)(端口1047)由于原因“请求超时”在目标组example-service中处于不健康状态

错误非常明显,您的ECS服务无法被负载均衡器所检测到。

目标组不健康

在这种情况下,请直接检查容器SG、端口、应用程序状态或健康状态代码。

可能的原因:

  • 后端服务中可能没有路由 /healthcheck
  • /healthcheck 的状态码不是 200
  • 目标端口无效,请正确配置。如果应用程序运行在8080或3000端口,则应为30008080
  • 安全组未允许目标组上的流量
  • 容器中未运行应用程序

当出现健康检查超时时,这些是可能的原因。


1
嗨@adiii,这些都是要检查和尝试的标准事项。我已经明确表示,这只是偶尔发生,这意味着它99.9%的时间都在工作,这排除了您提到的所有可能原因。我非常清楚这些,因此才提出问题。Overlay2在很大程度上解决了问题,因为新容器有时会卡住,因为设备映射程序在管理Docker容器存储方面不太高效。有关更多细节,请参见https://github.com/moby/moby/issues/20401。 - mohit3081989
是的,我同意,但错误来自健康检查。可能是进程崩溃并消耗了CPU。 - Adiii
你能够SSH到你的EC2实例吗? - Adiii
就像我说的,我已经看到了所有的东西,也分享了容器洞察力,没有什么不寻常的。我通过云监控上的awslogs看到了自己的应用程序日志、容器日志和容器洞察力,但它们都没有指向任何可以确定问题的地方。这是非常不寻常的行为。我的所有应用程序和容器日志都显示,在容器崩溃之前,所有的API都在短时间内提供服务。如果健康检查是问题所在,ALB和ECS调度程序不应该让容器运行30分钟,您可以从我的健康检查设置中进行检查。 - mohit3081989
1
做一件更多的事情:不健康阈值10。有时应用程序由于负载或其他原因会抛出BadGateway,因此它应该足够处理这些情况,并将健康阈值降低2。 - Adiii
显示剩余2条评论

0

我遇到了相同的问题(原因是请求超时)。 我通过更新我的安全组入站规则来解决它。 目前,入站规则中没有定义任何规则,所以我暂时添加了允许所有ipv4流量的通用规则,因为当时我正在开发。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接