Amazon ECS 容器代理
Amazon ECS 容器代理是 Amazon Elastic Container Service(Amazon ECS)的一个组件,负责代表 Amazon ECS 管理容器。
本仓库包含 ECS-Init,这是一个基于 systemd 的服务,用于支持 Amazon ECS 容器代理并保持其运行。它用于使用 systemd
作为初始化系统的系统,并以 deb 或 rpm 包的形式提供。ECS-Init 的源代码可在本仓库的 ./ecs-init
目录中找到,而打包文件在 ./packaging
目录中。
使用方法
运行此软件的最佳信息来源是 Amazon ECS 文档。
在 Amazon Linux AMI 上
在 Amazon Linux AMI 上,我们提供了一个可安装的 RPM 包,可以通过 sudo yum install ecs-init && sudo start ecs
使用。这是在此环境中运行它的推荐方式。
在其他 Linux AMI 上
Amazon ECS 文档 提供了 deb 和 rpm 包以及在非 Amazon Linux 实例上安装 ECS 容器代理的说明。
Amazon ECS 容器代理也可以在安装了最新 Docker 版本的 EC2 实例上的 Docker 容器中运行。Docker 镜像可在 Docker Hub 仓库 和 ECR 公共库 中获取。
# 设置代理使用的目录
mkdir -p /var/log/ecs /etc/ecs /var/lib/ecs/data
touch /etc/ecs/ecs.config
# 设置必要的规则以启用任务的 IAM 角色
sysctl -w net.ipv4.conf.all.route_localnet=1
iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679
iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679
# 运行代理
docker run --name ecs-agent \
--detach=true \
--restart=on-failure:10 \
--volume=/var/run/docker.sock:/var/run/docker.sock \
--volume=/var/log/ecs:/log \
--volume=/var/lib/ecs/data:/data \
--net=host \
--env-file=/etc/ecs/ecs.config \
--env=ECS_LOGFILE=/log/ecs-agent.log \
--env=ECS_DATADIR=/data/ \
--env=ECS_ENABLE_TASK_IAM_ROLE=true \
--env=ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true \
amazon/amazon-ecs-agent:latest
在启用 awsvpc 网络模式的其他 Linux AMI 上
对于 AWS VPC 网络模式,ECS 代理需要 CNI 插件和 dhclient 可用。ECS 还需要 ecs-init 作为其启动的一部分运行。 以下是在启用 Task ENI 的情况下运行 ecs-agent 的 docker run 配置示例。请注意,ECS 代理目前仅支持 cgroupfs 作为 cgroup 驱动程序。
# 运行代理
/usr/bin/docker run --name ecs-agent \
--init \
--restart=on-failure:10 \
--volume=/var/run:/var/run \
--volume=/var/log/ecs/:/log:Z \
--volume=/var/lib/ecs/data:/data:Z \
--volume=/etc/ecs:/etc/ecs \
--volume=/sbin:/host/sbin \
--volume=/lib:/lib \
--volume=/lib64:/lib64 \
--volume=/usr/lib:/usr/lib \
--volume=/usr/lib64:/usr/lib64 \
--volume=/proc:/host/proc \
--volume=/sys/fs/cgroup:/sys/fs/cgroup \
--net=host \
--env-file=/etc/ecs/ecs.config \
--cap-add=sys_admin \
--cap-add=net_admin \
--env ECS_ENABLE_TASK_ENI=true \
--env ECS_UPDATES_ENABLED=true \
--env ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION=1h \
--env ECS_DATADIR=/data \
--env ECS_ENABLE_TASK_IAM_ROLE=true \
--env ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true \
--env ECS_LOGFILE=/log/ecs-agent.log \
--env ECS_AVAILABLE_LOGGING_DRIVERS='["json-file","awslogs","syslog","none"]' \
--env ECS_LOGLEVEL=info \
--detach \
amazon/amazon-ecs-agent:latest
另请参阅下面的高级用法部分。
在 ECS 优化的 Windows AMI 上
ECS 优化的 Windows AMI 附带预安装的 PowerShell 模块 ECSTools,用于安装、配置和运行 ECS 代理作为 Windows 服务。 要安装该服务,您可以在 EC2 实例上运行以下 PowerShell 命令。要启动到 windows 以外的其他集群,请将下面脚本中的 'windows' 替换为您的集群名称。
PS C:\> Import-Module ECSTools
PS C:\> # -EnableTaskIAMRole 选项是启用任务 IAM 角色所必需的。
PS C:\> Initialize-ECSAgent -Cluster 'windows' -EnableTaskIAMRole
下载不同版本的 ECS 代理
要下载不同版本的 ECS 代理,您可以执行以下操作:
PS C:\> # 使用 agentVersion = "latest" 获取最新可用的代理版本
PS C:\> $agentVersion = "v1.20.4"
PS C:\> Initialize-ECSAgent -Cluster 'windows' -EnableTaskIAMRole -Version $agentVersion
从源代码构建 ECS 代理
构建 ECS 代理镜像(Linux)
ECS 代理也可以在 Linux 机器上从源代码本地构建。使用以下步骤构建 ECS 代理
- 获取 ECS 代理源代码
git clone https://github.com/aws/amazon-ecs-agent.git
- 使用
release-agent
make 目标构建代理镜像
make release-agent
这将安装所需的构建依赖项,构建 ECS 代理镜像并将其保存在路径 ecs-agent-v${AGENT_VERSION}.tar
中。使用以下命令加载它
docker load < ecs-agent-v${AGENT_VERSION}.tar
按照上面的说明继续安装
构建和运行独立版本(Linux)
Amazon ECS 容器代理也可以在 Docker 容器外作为 Go 二进制文件运行。目前,这在 Linux 上不推荐用于生产环境,但它对于开发或更易与本地 Go 工具集成可能很有用。
以下命令在 Docker 外运行代理:
make gobuild
./out/amazon-ecs-agent
独立版本(Windows)
可以通过调用 scripts\build_agent.ps1
来构建 Amazon ECS 容器代理
脚本(Windows)
以下脚本可用于在 Windows 上开发 Amazon ECS 容器代理:
scripts\run-integ-tests.ps1
- 运行engine
和stats
包中的所有集成测试misc\windows-deploy\Install-ECSAgent.ps1
- 将 ECS 代理安装为 Windows 服务misc\windows-deploy\amazon-ecs-agent.ps1
- 帮助脚本,用于设置主机并将代理作为进程运行misc\windows-deploy\user-data.ps1
- 示例用户数据,可与带容器的 Windows Server 2016 AMI 一起使用,以将代理作为进程运行
构建 ECS-Init 包(Linux)
ECS-Init 包也可以根据您运行的 Linux 系统构建为 deb 或 rpm 包。按照 generic-deb-integrated 或 generic-rpm-integrated 中的说明构建并安装带有 Init 的 ECS 代理,使用 deb 或 rpm。
高级用法
Amazon ECS 容器代理支持多种配置选项,其中大多数应通过环境变量设置。
环境变量
下表提供了可用于配置 ECS 代理的可选环境变量概览。有关每个可用环境变量的更多详细信息,请参阅 Amazon ECS 开发者指南。
环境变量键 | 示例值 | 描述 | Linux默认值 | Windows默认值 |
---|---|---|---|---|
ECS_CLUSTER | clusterName | 此代理应检入的集群。 | default | default |
ECS_RESERVED_PORTS | [22, 80, 5000, 8080] | 应标记为在此容器实例上不可用于调度的端口数组。 | [22, 2375, 2376, 51678, 51679] | [53, 135, 139, 445, 2375, 2376, 3389, 5985, 5986, 51678, 51679] |
ECS_RESERVED_PORTS_UDP | [53, 123] | 应标记为在此容器实例上不可用于调度的UDP端口数组。 | [] | [] |
ECS_ENGINE_AUTH_TYPE | "docker" | "dockercfg" | 存储在ECS_ENGINE_AUTH_DATA 键中的身份验证数据类型。 | ||
ECS_ENGINE_AUTH_DATA | 参见dockerauth文档 | 按ECS_ENGINE_AUTH_TYPE 定义的格式化Docker身份验证数据。 | ||
AWS_DEFAULT_REGION | <us-west-2>|<us-east-1>|… | 用于API请求以及推断正确后端主机的区域。 | 从Amazon EC2实例元数据获取。 | 从Amazon EC2实例元数据获取。 |
DOCKER_HOST | unix:///var/run/docker.sock | 用于创建与Docker守护程序的连接;行为类似于Docker客户端使用的此环境变量。 | unix:///var/run/docker.sock | npipe:////./pipe/docker_engine |
ECS_LOGLEVEL | <crit> | <error> | <warn> | <info> | <debug> | 要记录的详细程度。 | info | info |
ECS_LOGLEVEL_ON_INSTANCE | <none> | <crit> | <error> | <warn> | <info> | <debug> | 可用于覆盖ECS_LOGLEVEL 并设置应在实例上的日志文件中记录的详细程度,与记录在日志驱动程序中的级别分开。如果显式设置了日志驱动程序,则默认情况下实例上的日志将关闭,但可以通过此变量重新打开。 | 如果ECS_LOG_DRIVER 显式设置为非空值,则为none;否则与ECS_LOGLEVEL 值相同 | 如果ECS_LOG_DRIVER 显式设置为非空值,则为none;否则与ECS_LOGLEVEL 值相同 |
ECS_LOGFILE | /ecs-agent.log | 应写入日志的位置。日志级别由ECS_LOGLEVEL 控制。 | 空白 | 空白 |
ECS_CHECKPOINT | <true | false> | 是否将状态检查点保存到下面指定的DATADIR。 | 如果ECS_DATADIR 显式设置为非空值,则为true;否则为false | 如果ECS_DATADIR 显式设置为非空值,则为true;否则为false |
ECS_DATADIR | /data/ | 用于跨代理重启保存检查点状态的容器路径。注意,在Linux上,当指定此路径时,需要确保Agent容器具有$ECS_HOST_DATA_DIR/data:$ECS_DATADIR 的绑定挂载,其中ECS_HOST_DATA_DIR 和ECS_DATADIR 为相应的值。 | /data/ | C:\ProgramData\Amazon\ECS\data |
ECS_UPDATES_ENABLED | <true | false> | 是否在请求时退出以让更新程序应用更新。 | false | false |
ECS_DISABLE_METRICS | <true | false> | 是否禁用任务的指标收集。 | false | false |
ECS_POLL_METRICS | <true | false> | 收集任务指标时是轮询还是流式传输。将此值设置为true 可以帮助减少ECS容器实例上dockerd和containerd的CPU使用率。另请参阅ECS_POLL_METRICS_WAIT_DURATION以设置轮询间隔。 | false | false |
ECS_POLLING_METRICS_WAIT_DURATION | 10s | 轮询任务指标之间的等待时间。当ECS_POLL_METRICS为false时不使用。最大值为20s,最小值为5s。如果用户设置超过最大值,将设置为最大值;如果低于最小值,将设置为最小值。随着任务/容器数量的增加,较高的ECS_POLLING_METRICS_WAIT_DURATION 值可能会导致在指标收集时由于缺少指标样本而导致ECS集群报告的内存预留值不稳定的问题。建议将此值保持在18s以下。这种行为仅在某些操作系统和平台上观察到。 | 10s | 10s |
ECS_PULL_DEPENDENT_CONTAINERS_UPFRONT | <true | false> | 是否在满足dependsOn条件之前拉取具有依赖关系的容器的镜像。 | false | false |
ECS_RESERVED_MEMORY | 32 | 报告给Amazon ECS的实例内存容量的减少量(以MiB为单位)。Amazon ECS在容器实例上放置任务时使用。这不会保留实例上的内存使用。 | 0 | 0 |
ECS_AVAILABLE_LOGGING_DRIVERS | ["awslogs","fluentd","gelf","json-file","journald","logentries","splunk","syslog"] | 容器实例上可用的日志驱动程序。 | ["json-file","none"] | ["json-file","none"] |
ECS_DISABLE_PRIVILEGED | true | 是否在容器实例上禁用启动特权容器。 | false | false |
ECS_SELINUX_CAPABLE | true | 容器实例上是否可用SELinux。(有限支持;仅支持Z模式挂载。) | false | false |
ECS_APPARMOR_CAPABLE | true | 容器实例上是否可用AppArmor。 | false | false |
ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION | 10m | 删除已停止任务的容器的默认等待时间(另请参阅ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION_JITTER )。如果设置为小于1秒,该值将被忽略。 | 3h | 3h |
ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION_JITTER | 1h | 任务引擎清理等待持续时间的抖动值。指定后,每个任务的实际清理等待持续时间将是ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION 中指定的持续时间加上0到抖动持续时间之间的随机持续时间。 | 空白 | 空白 |
ECS_MANIFEST_PULL_TIMEOUT | 10m | 放弃获取容器镜像清单的超时时间。 | 1m | 1m |
ECS_CONTAINER_STOP_TIMEOUT | 10m | 实例范围的配置,用于等待容器正常退出的时间,超时后将被强制终止。 | 30s | 30s |
ECS_CONTAINER_START_TIMEOUT | 10m | 放弃启动容器的超时时间。 | 3m | 8m |
ECS_CONTAINER_CREATE_TIMEOUT | 10m | 放弃创建容器的超时时间。最小值为1m。如果用户设置的值低于最小值,将设置为最小值。 | 4m | 4m |
ECS_ENABLE_TASK_IAM_ROLE | true | 是否在容器实例上启用任务IAM角色 | false | false |
ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST | true | 是否在容器实例上使用host 网络模式启动任务时启用任务IAM角色 | false | false |
ECS_DISABLE_IMAGE_CLEANUP | true | 是否禁用ECS Agent的自动镜像清理 | false | false |
ECS_IMAGE_CLEANUP_INTERVAL | 30m | 自动镜像清理周期之间的时间间隔。如果设置小于10分钟,该值将被忽略 | 30m | 30m |
ECS_IMAGE_MINIMUM_CLEANUP_AGE | 30m | 镜像被拉取到可以被考虑进行自动清理之间的最小时间间隔 | 1h | 1h |
NON_ECS_IMAGE_MINIMUM_CLEANUP_AGE | 30m | 非ECS镜像创建到可以被考虑进行自动清理之间的最小时间间隔 | 1h | 1h |
ECS_NUM_IMAGES_DELETE_PER_CYCLE | 5 | 单个自动镜像清理周期中可删除的最大镜像数。如果设置小于1,该值将被忽略 | 5 | 5 |
ECS_IMAGE_PULL_BEHAVIOR | <default | always | once | prefer-cached > | 用于自定义拉取镜像过程的行为。如果指定default ,镜像将从远程拉取,如果拉取失败则使用实例中的缓存镜像。如果指定always ,镜像将从远程拉取,如果拉取失败则任务将失败。如果指定once ,如果镜像之前未被拉取或已被镜像清理移除,则从远程拉取,否则使用实例中的缓存镜像。如果指定prefer-cached ,如果没有缓存镜像则从远程拉取,否则使用实例中的缓存镜像 | default | default |
ECS_IMAGE_PULL_INACTIVITY_TIMEOUT | 1m | 在docker拉取完成后等待容器提取的时间。用于调整大型Windows容器 | 1m | 3m |
ECS_IMAGE_PULL_TIMEOUT | 1h | 等待拉取docker镜像的时间 | 2h | 2h |
ECS_INSTANCE_ATTRIBUTES | {"stack": "prod"} | 这些属性仅在初始注册期间生效。代理加入ECS集群后,使用PutAttributes API操作添加其他属性。有关更多信息,请参阅Amazon ECS开发者指南中的Amazon ECS容器代理配置 | {} | {} |
ECS_ENABLE_TASK_ENI | false | 是否启用任务网络,使任务可以使用自己的网络接口启动 | false | 不适用 |
ECS_ENABLE_HIGH_DENSITY_ENI | false | 使用任务网络时是否启用高密度ENI功能 | true | 不适用 |
ECS_CNI_PLUGINS_PATH | /ecs/cni | CNI二进制文件所在的路径 | /amazon-ecs-cni-plugins | 不适用 |
ECS_AWSVPC_BLOCK_IMDS | true | 是否阻止使用awsvpc 网络模式启动的任务访问实例元数据 | false | 不适用 |
ECS_AWSVPC_ADDITIONAL_LOCAL_ROUTES | ["10.0.15.0/24"] | 在awsvpc 网络模式下,这些前缀的流量将通过主机网桥而非任务ENI路由 | [] | 不适用 |
ECS_ENABLE_CONTAINER_METADATA | true | 当为true 时,代理将创建一个描述容器元数据的文件,可以通过容器环境变量$ECS_CONTAINER_METADATA_FILE 定位和使用该文件 | false | false |
ECS_HOST_DATA_DIR | /var/lib/ecs | 主机上ECS_DATADIR挂载的源目录。我们使用此目录来确定容器元数据文件的源挂载路径,以防ECS Agent作为容器运行。我们不在Windows中使用此值,因为ECS Agent在Windows中不作为容器运行。在Linux上,请注意当指定此值时,需要确保Agent容器有一个$ECS_HOST_DATA_DIR/data:$ECS_DATADIR 的绑定挂载,其中包含ECS_HOST_DATA_DIR 和ECS_DATADIR 的相应值 | /var/lib/ecs | 未使用 |
ECS_ENABLE_TASK_CPU_MEM_LIMIT | true | 是否启用任务级CPU和内存限制 | true | false |
ECS_CGROUP_PATH | /sys/fs/cgroup | ECS代理期望的根cgroup路径。这是从代理挂载可访问的路径 | /sys/fs/cgroup | 不适用 |
ECS_CGROUP_CPU_PERIOD | 10ms | 任务级限制的CGroups CPU周期。此值应在8ms到100ms之间 | 100ms | 不适用 |
ECS_AGENT_HEALTHCHECK_HOST | localhost | 覆盖ecs-agent容器健康检查的localhost IP地址 | localhost | localhost |
ECS_ENABLE_CPU_UNBOUNDED_WINDOWS_WORKAROUND | true | 当为true 时,ECS将允许CPU无限制(CPU=0 )的任务与Windows中的CPU有限制任务一起运行 | 不适用 | false |
ECS_ENABLE_MEMORY_UNBOUNDED_WINDOWS_WORKAROUND | true | 当为true 时,ECS将忽略内存预留参数(软限制)以与Windows中的内存有限制任务一起运行。要运行内存无限制任务,请省略内存硬限制并设置任意内存预留,它将被忽略 | 不适用 | false |
ECS_TASK_METADATA_RPS_LIMIT | 100,150 | 用逗号分隔的整数值,表示任务元数据端点和代理API端点的组合总流量的稳定状态和突发限制 | 40,60 | 40,60 |
ECS_SHARED_VOLUME_MATCH_FULL_CONFIG | true | 当为true 时,ECS Agent将比较名称、驱动选项和标签以确保卷是相同的。当为false 时,如果名称匹配,Agent将短路共享卷比较。这是默认的Docker行为。如果卷在实例间共享,应设置为false | false | false |
ECS_CONTAINER_INSTANCE_PROPAGATE_TAGS_FROM | ec2_instance | 如果指定ec2_instance ,容器实例上定义的现有标签将注册到Amazon ECS,并可使用ListTagsForResource API发现。使用此功能需要与容器实例关联的IAM角色有ec2:DescribeTags 操作权限 | none | none |
ECS_CONTAINER_INSTANCE_TAGS | {"tag_key": "tag_val"} | 应用于容器实例的元数据,以帮助分类和组织。每个标签由一个键和一个可选值组成,两者都由您定义。标签键的最大字符长度为128个字符,标签值的最大长度为256个字符。如果容器实例上还存在使用ECS_CONTAINER_INSTANCE_PROPAGATE_TAGS_FROM 参数传播的标签,这些标签将被使用ECS_CONTAINER_INSTANCE_TAGS 指定的标签覆盖 | {} | {} |
ECS_ENABLE_UNTRACKED_IMAGE_CLEANUP | true | 是否允许ECS代理删除不属于ECS任务的容器和镜像 | false | false |
ECS_EXCLUDE_UNTRACKED_IMAGE | alpine:latest | 如果启用了ECS_ENABLE_UNTRACKED_IMAGE_CLEANUP ,ECS代理不应删除的镜像的imageName:tag 列表,以逗号分隔 | ||
ECS_DISABLE_DOCKER_HEALTH_CHECK | false | 是否禁用ECS Agent的Docker容器健康检查 | false | false |
ECS_NVIDIA_RUNTIME | nvidia | 用于将Nvidia GPU设备传递给容器的Nvidia运行时 | nvidia | 不适用 |
ECS_ALTERNATE_CREDENTIAL_PROFILE | default | 备用凭证角色/配置文件名称 | default | default |
ECS_ENABLE_SPOT_INSTANCE_DRAINING | true | 是否为容器实例启用竞价实例排空功能。如果设置为true,当容器实例收到竞价中断通知时,代理将把实例状态设置为DRAINING,从而优雅地关闭并替换实例上运行的所有属于服务的任务。建议在使用竞价实例时将此项设置为true 。 | false | false |
ECS_LOG_ROLLOVER_TYPE | size | hourly | 确定容器代理日志文件是基于大小还是每小时进行轮换。默认情况下,代理日志文件每小时轮换一次。 | hourly | hourly |
ECS_LOG_OUTPUT_FORMAT | logfmt | json | 确定日志输出格式。当使用json格式时,日志中的每一行都将是一个结构化的JSON映射。 | logfmt | logfmt |
ECS_LOG_MAX_FILE_SIZE_MB | 10 | 当ECS_LOG_ROLLOVER_TYPE变量设置为size时,此变量决定日志文件在轮换前的最大大小(以MB为单位)。如果轮换类型设置为hourly,则忽略此变量。 | 10 | 10 |
ECS_LOG_MAX_ROLL_COUNT | 24 | 确定要保留的轮换日志文件数量。达到此限制后,将删除较旧的日志文件。 | 24 | 24 |
ECS_LOG_DRIVER | awslogs | fluentd | gelf | json-file | journald | logentries | syslog | splunk | 代理容器使用的日志驱动程序。 | json-file | 不适用 |
ECS_LOG_OPTS | {"option":"value"} | 用于配置ECS_LOG_DRIVER 中设置的日志驱动程序的选项。 | {} | 不适用 |
ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE | true | 是否启用awslogs日志驱动程序通过任务执行IAM角色的凭证进行身份验证。如果要在指定了任务执行IAM角色的任务中使用awslogs日志驱动程序,则需要设置为true。当使用版本等于或晚于V1.16.0-1的ecs-init RPM时,此环境变量默认设置为true。 | false | false |
ECS_FSX_WINDOWS_FILE_SERVER_SUPPORTED | true | 容器实例是否支持FSx for Windows File Server卷类型。此变量仅在代理版本1.47.0及更高版本中支持。 | false | true |
ECS_ENABLE_RUNTIME_STATS | true | 确定是否为代理启用pprof。如果启用,可以通过代理的自检端口访问不同的配置文件(例如,curl http://localhost:51678/debug/pprof/heap > heap.pprof )。此外,代理的运行时统计信息会记录到/var/log/ecs/runtime-stats.log 文件中。 | false | false |
ECS_EXCLUDE_IPV6_PORTBINDING | true | 确定代理是否应在使用默认网络模式时排除IPv6端口绑定。如果启用,IPv6端口绑定将被过滤掉,DescribeTasks API调用的响应将不显示任务的IPv6端口绑定,但它仍包含在任务元数据端点中。 | true | true |
ECS_WARM_POOLS_CHECK | true | 是否确保进入EC2 Auto Scaling组预热池的实例被阻止注册到集群。仅在使用EC2自动扩展时设置为true。 | false | false |
ECS_SKIP_LOCALHOST_TRAFFIC_FILTER | false | 默认情况下,ecs-init服务会添加一个iptable规则,以丢弃非本地到localhost的数据包,如果它们不是现有转发连接或DNAT的一部分,并在停止时移除该规则。如果设置为true,则不会添加或移除该规则。 | false | false |
ECS_ALLOW_OFFHOST_INTROSPECTION_ACCESS | true | 默认情况下,ecs-init服务会添加一个iptable规则,以阻止来自主机外部(或awsvpc网络模式下的容器)对代理自检端口的访问,并在停止时移除该规则。如果设置为true,则不会添加或移除该规则。 | false | false |
ECS_OFFHOST_INTROSPECTION_INTERFACE_NAME | eth0 | 用于阻止主机外部代理自检端口访问的主要网络接口名称。 | eth0 | eth0 |
ECS_ENABLE_GPU_SUPPORT | true | 是否使用支持GPU的容器实例。此参数是为代理指定的。您还必须为GPU配置任务定义。有关更多信息 | false | 不适用 |
HTTP_PROXY | 10.0.0.131:3128 | Amazon ECS代理用于连接互联网的HTTP代理的主机名(或IP地址)和端口号。例如,如果您的容器实例没有通过Amazon VPC互联网网关或NAT网关或实例的外部网络访问,将使用此代理。如果设置了此变量,还必须设置NO_PROXY变量以过滤来自代理的Amazon EC2实例元数据和Docker守护程序流量。 | null | null |
NO_PROXY | <对于Linux:169.254.169.254,169.254.170.2,/var/run/docker.sock | 对于Windows:169.254.169.254,169.254.170.2,\.\pipe\docker_engine> | 不应转发到指定HTTP_PROXY的HTTP流量。您必须指定169.254.169.254,/var/run/docker.sock以过滤来自代理的Amazon EC2实例元数据和Docker守护程序流量。 | null | null |
ECS_GMSA_SUPPORTED | true | 是否在任务中使用gMSA身份验证到Active Directory。每个任务必须在容器定义的dockerSecurityOpts 参数中指定凭据规范文件的位置。在Linux上,这需要credentials-fetcher守护程序。 | false | false |
CREDENTIALS_FETCHER_HOST | unix:///var/credentials-fetcher/socket/credentials_fetcher.sock | 用于创建到credentials-fetcher守护程序的连接;以支持Linux上的gMSA。对于大多数用户来说,默认值就足够了,只有在用户配置自定义credentials-fetcher套接字路径时才需要修改,即CF_UNIX_DOMAIN_SOCKET_DIR。 | unix:///var/credentials-fetcher/socket/credentials_fetcher.sock | 不适用 |
CREDENTIALS_FETCHER_SECRET_NAME_FOR_DOMAINLESS_GMSA | secretmanager-secretname | 用于支持Linux上gMSA的扩展选项credentials-fetcher守护程序。如果用户在非域加入的实例上配置gMSA,他们需要创建一个具有访问权限以检索gMSA账户主体的Active Directory用户,并将其存储在secrets manager中。 | secretmanager-secretname | 不适用 |
ECS_DYNAMIC_HOST_PORT_RANGE | 100-200 | 这指定了代理用于分配主机端口的动态主机端口范围,用于容器端口映射。如果范围内没有可用端口供容器使用,包括客户容器和Service Connect Agent容器(如果启用了Service Connect),服务部署将失败。 | 由/proc/sys/net/ipv4/ip_local_port_range 定义 | 49152-65535 |
ECS_TASK_PIDS_LIMIT | 100 | 指定在容器实例上启动的每个任务的进程ID限制cgroup设置。此设置映射到ECS任务级别的pids.max cgroup设置。详见https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html#pid。如果未设置,进程ID将不受限制。最小值为1,最大值为4194304(4*1024*1024) | 未设置 | 在Windows上不支持 |
ECS_EBSTA_SUPPORTED | true | 是否使用支持EBS任务附加的容器实例。此变量由ecs-init正确设置。其值表示是否已设置支持实例EBS卷的正确环境。ECS仅在平台类型支持此功能时才安排EBSTA任务。有关其他EBS支持详情,请查看EBS卷注意事项 | true | 在Windows上不支持 |
此外,以下环境变量可用于配置ecs-init服务的行为。使用ECS-Init时,所有环境变量(包括上述ECS Agent变量)都从"/etc/ecs/ecs.config"路径读取: |
环境变量名称 | 示例值 | 描述 | 默认值 |
---|---|---|---|
ECS_SKIP_LOCALHOST_TRAFFIC_FILTER | <true | false> | 默认情况下,ecs-init服务会添加一条iptable规则,以丢弃非本地到localhost的数据包(如果它们不是现有转发连接或DNAT的一部分),并在停止时删除该规则。如果将ECS_SKIP_LOCALHOST_TRAFFIC_FILTER 设置为true,则不会添加/删除此规则。 | false |
ECS_ALLOW_OFFHOST_INTROSPECTION_ACCESS | <true | false> | 默认情况下,ecs-init服务会添加一条iptable规则,以阻止从主机外部(或awsvpc网络模式下的容器)访问ECS Agent的自检端口,并在停止时删除该规则。如果将ECS_ALLOW_OFFHOST_INTROSPECTION_ACCESS 设置为true,则不会添加/删除此规则。 | false |
ECS_OFFHOST_INTROSPECTION_INTERFACE_NAME | eth0 | 用于阻止主机外部访问代理自检端口的主网络接口名称。默认值为eth0 | eth0 |
ECS_AGENT_LABELS | {"test.label.1":"value1","test.label.2":"value2"} | 添加到ECS Agent容器的标签。 | |
ECS_AGENT_APPARMOR_PROFILE | unconfined | 指定在其下运行ecs-agent容器的AppArmor配置文件名称。这仅适用于启用了AppArmor的系统,如Ubuntu、Debian和SUSE。如果未设置,则默认为ecs-init写入的配置文件(ecs-agent-default)。 | ecs-agent-default |
持久性
在生产环境中运行Amazon ECS容器代理时,其datadir
应在Docker容器的多次运行之间保持持久。如果不保持这些数据的持久性,代理每次启动时都会注册一个新的容器实例ARN,并且无法更新之前运行的任务状态。
标志
代理还支持以下标志:
-k
— 代理将不要求与之通信的服务具有有效的SSL证书。我们不建议使用此标志。-loglevel
— 选项:[<crit>|<error>|<warn>|<info>|<debug>]
。代理将在给定级别输出到stdout。如果存在ECS_LOGLEVEL
环境变量,则会覆盖此设置。
Make目标(在Linux上)
以下目标可用。每个目标可以通过make <target>
运行。
Make目标 | 描述 |
---|---|
release-agent | (默认代理构建) 构建代理,获取所需依赖项,并将镜像.tar保存到磁盘 |
generic-rpm-integrated | 构建init rpm包并将.rpm包保存到磁盘 |
generic-deb-integrated | 构建init deb包并将.deb包保存到磁盘 |
release | (旧版代理构建) 在Docker容器内构建代理并将其打包到基于scratch的镜像中 |
gobuild | 运行代理的普通go build ,并将二进制文件存储在./out/amazon-ecs-agent 中 |
static | 运行go build 以在./out/amazon-ecs-agent 中生成静态二进制文件 |
test | 使用go test 运行所有单元测试 |
test-in-docker | 在Docker容器内运行所有测试 |
run-integ-tests | 运行engine 和stats 包中的所有集成测试 |
clean | 删除构建产物。注意:这不会删除Docker镜像 |
贡献
欢迎贡献和反馈!我们将考虑并回应提案和拉取请求。有关更多信息,请参阅CONTRIBUTING.md文件。
如果您发现ECS代理行为存在bug/问题,请在此处提出。
如果您有功能请求,请在AWS Containers路线图上提出。
Amazon Web Services目前不为此软件的修改版本提供支持。
安全披露
如果您认为发现了潜在的安全问题,请不要在Issues中发布。相反,请按照此处的说明操作或直接发送电子邮件至AWS安全团队。
许可证
Amazon ECS容器代理根据Apache 2.0许可证授权。