无法使AWS ECS服务通过服务发现进行通信

Tar*_*ung 6 service-discovery amazon-web-services amazon-ecs devops

我正在尝试使2个服务通过AWS ECS服务中的服务发现终端节点进行通信。

例:

Service1:运行任务定义以运行nginx和phpfpm

Service2:运行任务定义以运行Redis

现在,我需要使service1容器与service2容器通信

根据互联网上的文档和资源。这是我所做的,无法满足需要。

  1. 我们需要打开服务发现(完成
  2. 设置适当的服务名称和名称空间,它们将用作服务发现端点(完成
  3. 使用以上属性集创建任务定义并创建服务(完成
  4. 现在,AWS将在Route53上生成SRV记录(确定

现在,当使用服务发现端点时,通常采用以下格式 service_discovery_service_name.service_discovery_namespace.

错误日志显示,无法解析名称。

在此处输入图片说明

Imr*_*ran 13

根据我们的谈话,这里是正在发生的事情的一些摘要。

  • 如果Service1nginx在您的情况下)需要使用 AWS ServiceDiscovery 选项与Service2 ( redis)交互并使用SRV记录,则Service1需要知道它需要执行 DNSSRV查找而不是 DNS A(地址)查找。
  • 您在这里有多种选择。首先,如果你想继续使用SRV记录,然后使用您的客户端的nginx需要代理的Redis与选择上游服务器serviceresolve它们是可用的只有在高端nginx的版本。检查我在有效答案底部测试过的示例 nginx 配置。

  • 还要确保您创建了带有前缀的 AWS 服务发现名称,_http._tcp否则,我resolve/service在没有前缀的 nginx 配置中遇到了配置 SRV选项的问题。

aws ecs 服务

  • 其他选项,如果您不想依赖SRV记录而是转到标准A记录查找,那么您将必须使用awsvpc容器模式并选择A选项。

在此处输入图片说明

  • 使用 DNS A 选项,您的查询service_discovery_service_name.service_discovery_namespace将正常工作。
  • 对于 DNS A 选项,有一些限制。由于 ENI 数量限制取决于 EC2 实例系列,因此您无法为同一 EC2 实例上的给定服务创建多个任务,因此我更喜欢仅 SRV 记录。

示例 nginx DNS SRV 选项配置:

stream {
    resolver 172.31.0.2;
    upstream redis {
        zone tcp_servers 64k;
        server redisservice.local service=_http._tcp resolve;
    }
    server {
        listen 12345;
        status_zone tcp_server;
        proxy_pass redis;
    }
}
Run Code Online (Sandbox Code Playgroud)

一些参考——

https://aws.amazon.com/blogs/aws/amazon-ecs-service-discovery/ https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-service-discovery.html


Ami*_*nes 8

我想详细阐述@Imran 的详细答案,因为大多数答案都讨论SRVDNS 记录类型并仅显示 Nginx 高级版本的 Nginx 示例(以及SRV)。

\n

如果您使用 ECS Fargate 并配置了ADNS 记录。最重要的是配置一个合适的resolver.

\n

来自文档:

\n
\n

配置名称服务器,用于将上游服务器的名称解析为\n地址,例如:

\n

解析器 127.0.0.1 [::1]:5353;

\n
\n
\n

该地址可以指定为\n域名或 IP 地址,并带有可选端口。如果未指定端口,则使用端口 53。名称服务器以循环方式\n进行查询。

\n
\n

话虽如此,解析器必须解析私有 DNS。因此,我们需要使用NSDNS 记录。\n使用8.8.8.8 n用作解析器将不起作用,因为此 DNS 无法解析专用 DNS。

\n
\n

NS 代表 \xe2\x80\x98 名称服务器\xe2\x80\x99,此记录指示哪个 DNS 服务器对该域具有权威性(哪个服务器包含实际的 DNS 记录)。一个域通常会有多个 NS 记录,这些记录可以表示该域的主名称服务器和备份名称服务器。

\n
\n

为了获取 DNS 解析器,请运行以下命令:

\n
aws route53 list-resource-record-sets --hosted-zone-id %HOSTED_ZONE_ID% --query "ResourceRecordSets[?Type == \'NS\']"\n
Run Code Online (Sandbox Code Playgroud)\n

选择一条资源记录并将其放入 Nginx resolver(包括尾随.)。

\n

Nginx基本模板:

\n
events {\n  worker_connections 768;\n}\n\nhttp {\n  # DNS Resolver\n  resolver ns-###.awsdns-####.com. valid=10s;\n  gzip on;\n  gzip_proxied any;\n  gzip_types text/plain application/json;\n  gzip_min_length 1000;\n  fastcgi_buffers 16 16k; \n  fastcgi_buffer_size 32k;\n\n  server {\n\n    listen 80;\n    \n    location / {\n          proxy_set_header X-Real-IP $remote_addr;\n          proxy_set_header Host $host;\n          proxy_redirect   off;\n          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n          # This is the important part\n          proxy_pass http://ecs-fargate-svc.local:8080;\n    }\n\n    location = /health-check {\n      return 200 \'all good\';\n    }\n\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

需要考虑的几点:

\n
    \n
  • 不要忘记添加映射端口(在我的示例中8080)。
  • \n
  • 确保安全组允许 VPC 内的流量。
  • \n
  • 由于使用 Fargate 并且我们的日志有限,请考虑在 ECS Fargate 任务所在的 VPC 中创建一个 EC2 实例,并尝试curl\\ping URL\\DNS 记录。
  • \n
\n

我的服务发现:

\n

在此输入图像描述

\n

文档:

\n

Nginx 解析器

\n

名称服务器 (NS) 记录

\n