【发布时间】:2021-09-29 16:21:51
【问题描述】:
我们将 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 网关超时,这对它们有很大影响。
将 Docker 存储驱动程序从 devicemapper 升级到 overlay2
正如我们在少数容器中看到的那样,我们增加了所有 ECS 实例的资源,包括 CPU、RAM 和 EBS 存储。
我们将服务的运行状况检查宽限期从 0 秒增加到 240 秒
将 KeepAliveTimeout 和 SocketTimeout 增加到 180 秒
在容器而不是标准输出上启用 awslog,但没有异常行为
在容器中启用 ECSMetaData 并将所有信息流水线化到我们的应用程序日志中。这有助于我们仅查找有问题的容器的所有日志。
启用容器洞察以更好地进行容器级调试
如果将 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
应该有一些关于资源争用或服务崩溃或真正的网络故障的迹象来解释这一切。但如前所述,我们所知道的没有任何问题。
【问题讨论】:
-
除了我的回答 github.com/aws/amazon-ecs-agent/issues/1872 之外,问题代理似乎有问题
标签: amazon-web-services docker timeout amazon-ecs