如何在 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.我最近遇到了同样的问题,但是我们采用了与为每个任务设置主机名不同的路径。
当 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 任务定义中配置主机名的主要内容,如果未能解决你的问题,请参考以下文章
Amazon ECS:任务定义不支持 launch_type FARGATE