AWS ECS 服务任务被替换(原因请求超时)

moh*_*989 8 timeout amazon-web-services amazon-ecs docker

我们将 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)
Run Code Online (Sandbox Code Playgroud)

这会导致我们的依赖服务开始经历 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"
Run Code Online (Sandbox Code Playgroud)

示例日志回答:

{
"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
}
Run Code Online (Sandbox Code Playgroud)

没有任何日志的 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

Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

应该有一些关于资源争用或服务崩溃或真正的网络故障的迹象来解释这一切。但如前所述,我们所知道的没有任何问题会引起任何问题。

Adi*_*iii 3

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

服务示例服务(实例 i-016b0a460d9974567)(端口 1047)在目标组示例服务中运行状况不佳,原因是(请求超时)

错误非常明显,您的 ECS 服务无法访问负载均衡器运行状况检查。

目标群体不健康

遇到这种情况,直接查看容器的SG、Port、应用状态或者健康状态码。

可能的原因

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

这些是健康检查超时的可能原因。