Amazon ECS 容器代理
Amazon ECS 代理是在向您的集群注册的每个容器实例上运行的进程。它可以促进您的容器实例与 Amazon ECS 之间的通信。
注意
在 Linux 容器实例上,代理容器会挂载顶级目录,例如 /lib
、/lib64
和 /proc
。这对于 ECS 的各种特征和功能是必需的,例如 Amazon EBS 卷、awsvpc
网络模式、Amazon ECS Service Connect 和适用于 Amazon ECS 的 FireLens 等。
每个 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 容器实例。
其他信息
以下页面提供了有关更改的更多信息:
-
GitHub 上的 Amazon ECS 代理变更日志
-
ecs-init
应用程序的源代码以及用于打包代理的脚本和配置现在已成为代理存储库的一部分。有关ecs-init
的旧版本和包装,请参阅 GitHub 上的 Amazon ecs-init 变更日志 -
Docker 文档中的 Docker 引擎版本注释
-
NVIDIA 文档中的 NVIDIA 驱动程序文档
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.
(在 Linux 实例上)和 timestamp
C:\ProgramData\Amazon\ECS\log\ecs-agent.log.
(在 Windows 实例上)。timestamp
预设情况下,代理日志每小时轮换一次,最多存储 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
-
示例值:
crit
、error
、warn
、info
、debug
Linux 上的原定设置值:
info
Windows 上的原定设置值:
info
要记录的详细级别。
ECS_LOGLEVEL_ON_INSTANCE
-
示例值:
none
、crit
、error
、warn
、info
、debug
Linux 上的原定设置值:
none
,如果ECS_LOG_DRIVER
显式设置为非空值;否则,和ECS_LOGLEVEL
相同Windows 上的原定设置值:
none
,如果ECS_LOG_DRIVER
显式设置为非空值;否则,与ECS_LOGLEVEL
相同可用于覆盖
ECS_LOGLEVEL
并设置应记录在实例日志文件中的详细级别,与日志记录驱动程序中记录的级别分开。如果显式设置了日志记录驱动程序,则默认情况下会关闭实例上的日志。可以使用此变量将其重新打开。 ECS_LOG_DRIVER
-
示例值:
awslogs
、fluentd
、gelf
、json-file
、journald
、logentries
、syslog
、splunk
Linux 上的原定设置值:
json-file
Windows 上的默认值:不适用
确定代理容器使用的日志记录驱动程序。
ECS_LOG_ROLLOVER_TYPE
-
示例值:
size
、hourly
Linux 上的原定设置值:
hourly
Windows 上的原定设置值:
hourly
确定容器代理日志文件是按小时轮换还是基于大小轮换。预设情况下,代理日志文件每小时轮换一次。
ECS_LOG_OUTPUT_FORMAT
-
示例值:
logfmt
、json
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"