在EC2或ECS上的docker中使用IMDS(v2)和token

6l7fqoea  于 2023-04-11  发布在  Docker
关注(0)|答案(2)|浏览(217)

我想在运行在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标志,它就可以工作,但这对我来说不是一个解决方案。
谢谢

jljoyd4f

jljoyd4f1#

为了从docker容器访问IMDSv2元数据,必须在示例元数据配置中增加IMDSv2的跳数限制。从aws docs
在容器环境中,如果跃点限制为1,则IMDSv2响应不会返回,因为转到容器被视为额外的网络跃点。为避免回退到IMDSv1的过程以及由此产生的延迟,建议在容器环境中将跃点限制设置为2
要更改跳数限制,可以在awscli中使用modify-instance-metadata-options

aws ec2 modify-instance-metadata-options \
    --instance-id <instance_id> \
    --http-put-response-hop-limit 2 \
    --http-endpoint enabled
vc6uscn9

vc6uscn92#

如果in不起作用,可以尝试增加跳数限制值。
我们的背景是:EC2示例上的RKE2 +纤毛。
我们已经将跳数限制从2增加到3,并且它可以工作。
跳跃限制=2

curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"
^C
bash-4.2# curl http://169.254.169.254/latest/meta-data/
bash-4.2# curl http://169.254.169.254/latest/meta-data/ -vv
*   Trying 169.254.169.254:80...
* Connected to 169.254.169.254 (169.254.169.254) port 80 (#0)
> GET /latest/meta-data/ HTTP/1.1
> Host: 169.254.169.254
> User-Agent: curl/7.87.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 401 Unauthorized
< Content-Length: 0
< Date: Thu, 06 Apr 2023 09:02:51 GMT
< Server: EC2ws
< Connection: close
< Content-Type: text/plain
<
* Closing connection 0

增加跳限后=3

curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" -vv
*   Trying 169.254.169.254:80...
* Connected to 169.254.169.254 (169.254.169.254) port 80 (#0)
> PUT /latest/api/token HTTP/1.1
> Host: 169.254.169.254
> User-Agent: curl/7.87.0
> Accept: */*
> X-aws-ec2-metadata-token-ttl-seconds: 21600
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< X-Aws-Ec2-Metadata-Token-Ttl-Seconds: 21600
< Content-Length: 56
< Date: Thu, 06 Apr 2023 09:14:54 GMT
< Server: EC2ws
< Connection: close
< Content-Type: text/plain
<
* Closing connection 0
AQAEAPrjYxOT2_9q00Flibi5iB-KbE..redacted

相关问题