如何在Docker Swarm中部署aws-xray-daemon并解决区域获取报错?
X-Ray Daemon 部署到Docker Swarm的配置问题
尝试将amazon/aws-xray-daemon部署到Docker Swarm集群时,参考项目公开文档未找到足够的可配置项说明,初始使用的部署配置如下:
services: xrayd: image: amazon/aws-xray-daemon deploy: restart_policy: delay: 2m
服务启动后,日志持续输出以下错误内容:
2021-02-27T04:50:38Z [Info] Initializing AWS X-Ray daemon 3.2.0 2021-02-27T04:50:38Z [Info] Using buffer memory limit of 78 MB 2021-02-27T04:50:38Z [Info] 1248 segment buffers allocated 2021-02-27T04:50:39Z [Error] Unable to retrieve the region from the EC2 instance EC2MetadataRequestError: failed to get EC2 instance identity document caused by: RequestError: send request failed caused by: Get http://169.254.169.254/latest/dynamic/instance-identity/document: dial tcp 169.254.169.254:80: connect: network is unreachable 2021-02-27T04:50:39Z [Error] Cannot fetch region variable from config file, environment variables and ec2 metadata.
针对对应EC2实例已经配置了包含完整xray:*操作权限的IAM策略,上述报错依然没有消失。
问题根因
X-Ray Daemon获取AWS区域的逻辑是按优先级依次尝试:先读取本地配置文件中的区域设置,再读取进程环境变量中的区域参数,最后才会尝试请求EC2实例元数据服务(固定访问地址169.254.169.254)拉取实例所属区域。
日志中明确提示connect: network is unreachable,说明容器网络层面根本无法连通这个元数据地址,流程在拉取区域的环节就中断了,还没进入到校验IAM权限的步骤,之前配置的IAM权限完全没有被调用,和IAM权限设置无关。
修复操作
- 最快的修复方式是跳过元数据拉取环节,给服务显式指定所在的AWS区域。在部署配置的服务定义块下增加环境变量配置,将
AWS_REGION设置为集群实际部署的AWS区域即可,调整后的配置参考:
services: xrayd: image: amazon/aws-xray-daemon environment: - AWS_REGION=替换为你的集群实际所在的AWS区域,比如us-east-1 deploy: restart_policy: delay: 2m
重新部署服务后,Daemon会直接读取环境变量中的区域值,不再尝试访问元数据接口,相关报错就会消失。
- 如果业务上必须让容器访问EC2元数据服务,需要逐节点排查容器网络链路:先确认节点本身可以正常访问169.254.169.254,再检查Swarm的overlay网络规则、自定义iptables配置、出口网络策略有没有拦截该地址的80端口流量,确保容器的请求可以正常路由到元数据服务即可。
内容的提问来源于stack exchange,提问作者Archimedes Trajano
相关产品推荐
相关产品推荐

