我想在运行在EC2示例上的容器中使用IMDSv2。
我想使用令牌,因为它们在我的元数据选项中是必需的:
metadata_options {
http_tokens = "required"
http_endpoint = "enabled"
}
从EC2示例调用API会按预期返回我的令牌。curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"
但是,如果我尝试从docker容器调用它:
docker run -it curlimages/curl sh
/ $ curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"
curl: (56) Recv failure: Connection reset by peer
我只是有一个暂停。
根据this answer,它应该开箱即用,但事实并非如此。如果我添加一个--network=host
标志,它就可以工作,但这对我来说不是一个解决方案。
谢谢
2条答案
按热度按时间jljoyd4f1#
为了从docker容器访问IMDSv2元数据,必须在示例元数据配置中增加IMDSv2的跳数限制。从aws docs:
在容器环境中,如果跃点限制为1,则IMDSv2响应不会返回,因为转到容器被视为额外的网络跃点。为避免回退到IMDSv1的过程以及由此产生的延迟,建议在容器环境中将跃点限制设置为2
要更改跳数限制,可以在awscli中使用
modify-instance-metadata-options
:vc6uscn92#
如果in不起作用,可以尝试增加跳数限制值。
我们的背景是:EC2示例上的RKE2 +纤毛。
我们已经将跳数限制从2增加到3,并且它可以工作。
跳跃限制=2
增加跳限后=3