Amazon ECS Linux 容器代理 - Amazon Elastic Container Service

Amazon ECS Linux 容器代理

Amazon ECS 代理是在向您的集群注册的每个容器实例上运行的进程。它可以促进您的容器实例与 Amazon ECS 之间的通信。

每个 Amazon ECS 容器代理版本都支持不同的功能集并提供了针对早期版本的错误修复。如果可能,我们始终建议使用最新版本的 Amazon ECS 容器代理。要将您的容器代理更新至最新版本,请参阅更新 Amazon ECS 容器代理

要查看每个代理版本包含了哪些功能和增强功能,请参阅 https://github.com/aws/amazon-ecs-agent/releases

重要

可靠指标的最低 Docker 版本是 Docker 版本 v20.10.13 及更高版本,该版本包含在经 Amazon ECS 优化的 AMI 20220607 及更高版本中。

Amazon ECS 代理版本 1.20.0 及更高版本已弃用对早于 1.9.0 的 Docker 版本的支持。

生命周期

当 Amazon ECS 容器代理将 Amazon EC2 实例注册到集群时,Amazon EC2 容器实例将其状态报告为 ACTIVE,并将其代理连接状态报告为 TRUE。此容器实例可接受运行任务请求。

如果停止(而不是终止)容器实例,则状态将保持为 ACTIVE,但代理连接状态将在几分钟内转换为 FALSE。在容器实例上运行的任何任务将停止。如果您再次启动容器实例,则容器代理将使用 Amazon ECS 服务重新连接,并且您能够在实例上再次运行任务。

重要

如果您停止并启动某个容器实例,即重启该实例,则一些旧版本的 Amazon ECS 容器代理会在未注销原始容器实例 ID 的情况下再次注册该实例。这种情况下,Amazon ECS 会在集群中列出超出实际拥有数量的容器实例。(如果具有同一 Amazon EC2 实例 ID 的重复容器实例 ID,则可以安全地注销列出为 ACTIVE 且代理连接状态为 FALSE 的重复项。) 此问题已在当前版本的 Amazon ECS 容器代理中修复。有关更新到当前版本的更多信息,请参阅更新 Amazon ECS 容器代理

如果将容器实例的状态更改为 DRAINING,则新任务不会置于该容器实例中,并将尽可能删除在此容器实例上运行的所有服务任务,以便执行系统更新。有关更多信息,请参阅 耗尽 Amazon ECS 容器实例

如果您注销或终止某个容器实例,则该容器实例状态将立即更改为 INACTIVE,而且在您列出您的容器实例时将不再报告该容器实例。但您仍可以在终止后的 1 小时内描述容器实例。1 小时后,该实例描述将不再可用。

重要

您可以手动耗尽实例,也可以构建 自动扩缩组生命周期钩子以将实例状态设置为 DRAINING。有关 Auto Scaling 生命周期钩子的更多信息,请参阅 Amazon EC2 Auto Scaling 生命周期钩子

经 Amazon ECS 优化的 AMI

经 Amazon ECS 优化的 AMI 的 Linux 变体使用 Amazon Linux 2 AMI 作为其基础。可以通过查询 Systems Manager Parameter Store API 来检索每个变体的 Amazon Linux 2 源 AMI 名称。有关更多信息,请参阅 检索经 Amazon ECS 优化的 Linux AMI 元数据。从最新的经 Amazon ECS 优化的 Amazon Linux 2 AMI 启动容器实例时,您将收到最新的容器代理版本。要启动具有经 Amazon ECS 优化的 Amazon Linux 2 AMI 的容器实例,请参阅 启动 Amazon ECS Linux 容器实例

其他信息

以下页面提供了有关更改的更多信息:

Amazon ECS 容器代理日志配置参数

Amazon ECS 容器代理将日志存储在您的容器实例上。

对于容器代理版本 1.36.0 及更高版本,预设情况下,日志位于 /var/log/ecs/ecs-agent.log(在 Linux 实例上)和 C:\ProgramData\Amazon\ECS\log\ecs-agent.log(在 Windows 实例上)。

对于容器代理版本 1.35.0 及以前的版本,预设情况下,日志位于 /var/log/ecs/ecs-agent.log.timestamp(在 Linux 实例上)和 C:\ProgramData\Amazon\ECS\log\ecs-agent.log.timestamp(在 Windows 实例上)。

预设情况下,代理日志每小时轮换一次,最多存储 24 个日志。

以下是可用于更改原定设置代理日志记录行为的容器代理配置变量。有关更多信息,请参阅 Amazon ECS 容器代理配置

ECS_LOGFILE

示例值:/ecs-agent.log

Linux 上的原定设置值:Null

Windows 上的原定设置值:Null

代理日志应写入的位置。如果您通过 ecs-init 运行代理(这是使用经 Amazon ECS 优化的 AMI 时的默认方法),则容器内路径为 /log,并且 ecs-init 会将其挂载到主机上的 /var/log/ecs/

ECS_LOGLEVEL

示例值:criterrorwarninfodebug

Linux 上的原定设置值:info

Windows 上的原定设置值:info

要记录的详细级别。

ECS_LOGLEVEL_ON_INSTANCE

示例值:nonecriterrorwarninfodebug

Linux 上的原定设置值:none,如果 ECS_LOG_DRIVER 显式设置为非空值;否则,和 ECS_LOGLEVEL 相同

Windows 上的原定设置值:none,如果 ECS_LOG_DRIVER 显式设置为非空值;否则,与 ECS_LOGLEVEL 相同

可用于覆盖 ECS_LOGLEVEL 并设置应记录在实例日志文件中的详细级别,与日志记录驱动程序中记录的级别分开。如果显式设置了日志记录驱动程序,则默认情况下会关闭实例上的日志。可以使用此变量将其重新打开。

ECS_LOG_DRIVER

示例值:awslogsfluentdgelfjson-filejournaldlogentriessyslogsplunk

Linux 上的原定设置值:json-file

Windows 上的默认值:不适用

确定代理容器使用的日志记录驱动程序。

ECS_LOG_ROLLOVER_TYPE

示例值:sizehourly

Linux 上的原定设置值:hourly

Windows 上的原定设置值:hourly

确定容器代理日志文件是按小时轮换还是基于大小轮换。预设情况下,代理日志文件每小时轮换一次。

ECS_LOG_OUTPUT_FORMAT

示例值:logfmtjson

Linux 上的原定设置值:logfmt

Windows 上的原定设置值:logfmt

确定日志输出格式。使用 json 格式时,日志中的每一行都是一个结构化的 JSON 映射。

ECS_LOG_MAX_FILE_SIZE_MB

示例值:10

Linux 上的原定设置值:10

Windows 上的原定设置值:10

ECS_LOG_ROLLOVER_TYPE 变量设置为 size 时,此变量确定日志文件在轮换之前的最大大小(以 MB 为单位)。如果将轮换类型设置为 hourly,则忽略此变量。

ECS_LOG_MAX_ROLL_COUNT

示例值:24

Linux 上的原定设置值:24

Windows 上的原定设置值:24

确定要保留的轮换日志文件的数量。达到此限制后,将删除较旧的日志文件。

对于容器代理版本 1.36.0 及更高版本,以下是使用 logfmt 格式时的示例日志文件。

level=info time=2019-12-12T23:43:29Z msg="Loading configuration" module=agent.go level=info time=2019-12-12T23:43:29Z msg="Image excluded from cleanup: amazon/amazon-ecs-agent:latest" module=parse.go level=info time=2019-12-12T23:43:29Z msg="Image excluded from cleanup: amazon/amazon-ecs-pause:0.1.0" module=parse.go level=info time=2019-12-12T23:43:29Z msg="Amazon ECS agent Version: 1.36.0, Commit: ca640387" module=agent.go level=info time=2019-12-12T23:43:29Z msg="Creating root ecs cgroup: /ecs" module=init_linux.go level=info time=2019-12-12T23:43:29Z msg="Creating cgroup /ecs" module=cgroup_controller_linux.go level=info time=2019-12-12T23:43:29Z msg="Loading state!" module=statemanager.go level=info time=2019-12-12T23:43:29Z msg="Event stream ContainerChange start listening..." module=eventstream.go level=info time=2019-12-12T23:43:29Z msg="Restored cluster 'auto-robc'" module=agent.go level=info time=2019-12-12T23:43:29Z msg="Restored from checkpoint file. I am running as 'arn:aws:ecs:us-west-2:0123456789:container-instance/auto-robc/3330a8a91d15464ea30662d5840164cd' in cluster 'auto-robc'" module=agent.go

以下是使用 JSON 格式时的示例日志文件。

{"time": "2019-11-07T22:52:02Z", "level": "info", "msg": "Starting Amazon Elastic Container Service Agent", "module": "engine.go"}

对于容器代理版本 1.35.0 及以前的版本,以下是日志文件的格式。

2016-08-15T15:54:41Z [INFO] Starting Agent: Amazon ECS Agent - v1.12.0 (895f3c1) 2016-08-15T15:54:41Z [INFO] Loading configuration 2016-08-15T15:54:41Z [WARN] Invalid value for task cleanup duration, will be overridden to 3h0m0s, parsed value 0, minimum threshold 1m0s 2016-08-15T15:54:41Z [INFO] Checkpointing is enabled. Attempting to load state 2016-08-15T15:54:41Z [INFO] Loading state! module="statemanager" 2016-08-15T15:54:41Z [INFO] Detected Docker versions [1.17 1.18 1.19 1.20 1.21 1.22] 2016-08-15T15:54:41Z [INFO] Registering Instance with ECS 2016-08-15T15:54:41Z [INFO] Registered! module="api client"