4

我在 AWS ECS 集群中使用 jenkins slave,我像这样配置这个网站: Jenkins in ECS

正常情况下运行良好,但有时在高峰时段,slave 容器启动很慢,超过 40 分钟,甚至无法启动容器。

我必须终止 ECS 实例,然后启动一个新实例。当容器无法启动时,我在 ecs-agent 中看到了一条日志:

已停止,原因无法创建容器错误:API 错误 (500):devmapper:精简池有 788 个可用数据块,少于最低要求的 4454 个可用数据块。在精简池中创建更多可用空间或使用 dm.min_free_space 选项更改行为

这是我的码头工人信息,请告诉我如何解决这个问题。

[root@ip-10-124-2-159 ec2-user]# docker info
Containers: 10
 Running: 1
 Paused: 0
 Stopped: 9
Images: 2
Server Version: 1.12.6
Storage Driver: devicemapper
 Pool Name: docker-docker--pool
 Pool Blocksize: 524.3 kB
 Base Device Size: 10.74 GB
 Backing Filesystem: ext4
 Data file:
 Metadata file:
 Data Space Used: 8.646 GB
 Data Space Total: 23.35 GB
 Data Space Available: 14.71 GB
 Metadata Space Used: 2.351 MB
 Metadata Space Total: 25.17 MB
 Metadata Space Available: 22.81 MB
 Thin Pool Minimum Free Space: 2.335 GB
 Udev Sync Supported: true
 Deferred Removal Enabled: true
 Deferred Deletion Enabled: true
 Deferred Deleted Device Count: 0
 Library Version: 1.02.93-RHEL7 (2015-01-28)
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options:
Kernel Version: 4.4.39-34.54.amzn1.x86_64
Operating System: Amazon Linux AMI 2016.09
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 7.8 GiB
Name: ip-10-124-2-159
ID: 6HVT:TWH3:YP6T:GMZO:23TM:EUAA:F7XJ:ISII:QDE7:V2SN:XKFI:XPGZ
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Insecure Registries:
 127.0.0.0/8

而且我不知道为什么只能同时运行4个任务,即使ECS实例的资源仍然可用,我该如何增加它

4

3 回答 3

5

当您经常启动和停止容器时,您的问题是一个非常常见的问题,您刚才提到的帖子就是关于此的!他们特别说:

“Amazon EC2 容器服务插件可以在您的 ECS 集群上启动容器,这些容器会自动将自己注册为 Jenkins 从站,在容器上执行适当的 Jenkins 作业,然后自动删除容器/构建从站”

这样做的问题是,如果停止的容器没有被清理,你最终会耗尽内存,正如你所经历的那样。如果您ssh进入实例并运行以下命令,您可以自行检查:

docker ps -a

如果您在 Jenkins 遇到问题时运行此命令,您应该会看到几乎无穷无尽的已停止容器列表。您可以通过运行以下命令将它们全部删除:

docker rm -f $(docker ps -a -f status-exited)

但是,经常手动执行此操作确实不是很方便,因此您真正要做的是在启动时将以下脚本包含在 ECS 实例配置的 userData 参数中:

ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION=1m >> /etc/ecs/ecs.config
ECS_CLUSTER=<NAME_OF_CLUSTER> >> /etc/ecs/ecs.config
ECS_DISABLE_IMAGE_CLEANUP=false >> /etc/ecs/ecs.config
ECS_IMAGE_CLEANUP_INTERVAL=10m >> /etc/ecs/ecs.config
ECS_IMAGE_MINIMUM_CLEANUP_AGE=30m >> /etc/ecs/ecs.config

这将指示 ECS 代理启用一个清理守护进程,该守护进程每 10 分钟(即您可以设置的最低间隔)检查要删除的映像,在任务停止 1 分钟后删除容器,并删除 30 分钟前的映像和不再被活动任务定义引用。您可以在此处了解有关这些变量的更多信息。

根据我的经验,如果您非常快速地启动和停止容器,则此配置可能还不够,因此您可能希望将一个体面的卷附加到您的实例,以确保您有足够的空间在守护进程清理停止的容器时继续运行容器。

于 2017-06-14T22:06:34.707 回答
1

感谢何塞的回答。

但是,这个命令在 Docker 1.12 中对我有用。*

docker rm $(docker ps -aqf "status=exited")

标志 'q' 从结果中过滤 containerIds 并将其删除。

于 2017-12-28T05:44:52.940 回答
0

如果您升级到最新的 AWS 客户端(或最新的 ECS AMI,amzn-ami-2017.09.d-amazon-ecs-optimized或更高版本),那么您在 EC 主机的 ecs 配置中配置ECS 自动清理已失效的映像、容器和卷服务于集群。

这会清理 after 和node(label){}子句,但不会在构建期间清理 docker 执行。

  • 节点容器及其卷 - 已清理
  • 由在该节点上执行的步骤生成的 docker 图像 - 未清理

ECS 对该节点上发生的事情视而不见。鉴于节点本身应该是最大的东西,ECS 自动清理应该将运行单独清理任务的需要减少到最低限度。

于 2017-12-29T16:24:38.850 回答