如何在 ECS Fargate 任务定义中配置主机名

Posted

技术标签:

【中文标题】如何在 ECS Fargate 任务定义中配置主机名【英文标题】:How to configure hostname in ECS Fargate task definition 【发布时间】:2018-07-26 08:00:06 【问题描述】:

我们正在从 ECS 迁移到 Fargate。在 ECS 中,我们可以像这样在任务定义中设置主机名: “主机名”:“%HOST_NAME%”

创建失败并出现错误“当 networkMode=awsvpc 时容器不支持主机名” 有没有办法设置主机名?

【问题讨论】:

comand 参数解决了我的问题echo "$(ip a | grep -A2 eth1 | grep inet | awk 'print $2' | sed 's#/.*##g' ) $(hostname)" >> /etc/hosts 。仍然无法设置主机名 在你的命令中我应该用我想要的实际主机名替换 $(hostname) 吗?例如,我可以用 $(mySpecialHostname) 代替它吗?如果不是,我在该命令中实际在哪里指定主机名? 可能的欺骗:***.com/q/50215187/4298208 【参考方案1】:

尽管文档明确指出不支持此功能,但有一种解决方法。您可以创建一个 bootstrap_ecs.sh 文件并覆盖容器 ENTRYPOINT 以在运行时引用它(或者将以下内容添加到您自己的引导脚本中)。您可以在从 ECS 运行时使用它。否则,请使用您的标准 ENTRYPOINT 和 COMMAND。

bootstrap_ecs.sh

#!/bin/bash

ifconfig # prints full IP info
echo "Detecting 'eth1' interface..."
DETECTED_IP=$(ifconfig -a | grep -A2 eth1 | grep inet | awk 'print $2' | sed 's#/.*##g' | grep "\.")
if [[ -z $DETECTED_IP ]]; then
    echo "Detecting 'eth0' interface ('eth1' not found)..."
    DETECTED_IP=$(ifconfig -a | grep -A2 eth0 | grep inet | awk 'print $2' | sed 's#/.*##g' | grep "\." | head -1)
fi
DETECTED_HOSTNAME=$(hostname)
echo -e "\n\nDETECTED_IP=$DETECTED_IP\nDETECTED_HOSTNAME=$DETECTED_HOSTNAME\n\n"
# Note: newer OS versions us `ip` instead of `ifconfig`

# Echo for debugging. You can comment/delete the 1st and 3rd lines once everything is working.
echo -e "Current file contents:\n $(cat /etc/hosts)"
echo "$DETECTED_IP $DETECTED_HOSTNAME" >> /etc/hosts
echo -e "\n\n\nUpdated file contents:\n $(cat /etc/hosts)"

CMD="$@"
$CMD

【讨论】:

建议从ifconfig 提取IP 的更简单技巧。试试这个:ifconfig -a |awk '/eth0/,/^$/ if ($1=="inet") print $2【参考方案2】:

AWS documentation 表示The hostname parameter is not supported if using the awsvpc networkMode. FARGATE 不支持除 awsvpc 之外的任何内容,因此无法在 FARGATE 启动类型的任务定义中设置主机名。

【讨论】:

Fwiw,虽然目前是评分最高的答案,但这个答案并不完全正确 - 请参阅下面的我的答案,其中显示了如何初始化主机名。诚然,它需要一个自定义引导脚本,但当然可以利用。【参考方案3】:

让我分享一个我申请设置Avro Schema Registry的技巧。这可能有助于回答这个问题。 Schema Registry 需要设置 SCHEMA_REGISTRY_HOST_NAME 环境变量。使用 AWS Fargate 和 awsvpc 网络模式,无法在任务定义中显式设置主机名属性,正如该线程中已经指出的那样。对于水平扩展,您需要多个注册表实例,每个实例都有自己的 SCHEMA_REGISTRY_HOST_NAME 值。我以以下方式覆盖了任务定义中的Command 属性(HOSTNAME 由 Docker 提供,在awsvpc 机制下,它可靠地反映了主机名):

sh,-c,export SCHEMA_REGISTRY_HOST_NAME=$HOSTNAME;/etc/confluent/docker/run

这种方法的缺点是您现在依赖于图像的实现细节;在这种情况下,来自 Dockerfile 的原始 CMD 语句。这就是为什么使用带有图像名称的特定版本标签而不是依赖latest 标签总是很重要的原因。

附:作为参考,这是我原来的 comment on Issues 1126 用于 Schema Registry。

【讨论】:

谢谢,欧文! $HOSTNAME arg 想法对我很有用。 此方法已停止工作。添加此评论,希望对以后的读者有所帮助。看起来 AWS ECS 正在更改 ECS 任务/容器中 HOSTNAME 变量的值。我有几乎相同的实现,它在我的 dev aws 帐户中运行。它在 prod aws 帐户中失败,因为 $HOSTNAME 不再是熟悉的“ip-a-b-c-d..compute.internal”。相反,它是“-【参考方案4】:

我最近遇到了同样的问题,但是我们采用了与为每个任务设置主机名不同的路径。

当 datadog-agent 在 ECS 和 Fargate 的 sidecar 容器中运行时,存在一个未解决的 GitHub 问题:https://github.com/DataDog/datadog-agent/issues/3159

这导致发现DD_DOGSTATSD_TAG_CARDINALITY=orchestrator 设置在 ECS 和 Fargate 上运行时会自动添加 task_arn 标签。 https://docs.datadoghq.com/getting_started/tagging/assigning_tags/?tab=containerizedenvironments#environment-variables

【讨论】:

以上是关于如何在 ECS Fargate 任务定义中配置主机名的主要内容,如果未能解决你的问题,请参考以下文章

如何查看 ECS Fargate 容器内的日志?

Amazon ECS:任务定义不支持 launch_type FARGATE

如何诊断 ECS Fargate 任务启动失败?

AWS ECS Fargate - 任务未运行

如何从运行 Fargate ECS 任务中查看 Python 打印语句?

AWS ECS Fargate 和端口映射