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

时间:2019-07-05 06:38:25

标签: amazon-web-services devops amazon-ecs service-discovery

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

示例:

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

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

  

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

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

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

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

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

enter image description here

2 个答案:

答案 0 :(得分:2)

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

  • 如果 Service1 (在您的情况下为nginx)需要与具有AWS ServiceDiscovery选项并使用{{ 3}}记录,然后 Service1 需要知道它需要执行DNS redis查找而不是DNS SRV(地址)查找。
  • 您在这里有多个选择。首先,如果您要继续使用A记录使用,则您的客户端SRV需要使用SRVservice选项{{3 }}仅在nginx的nginx版本中。在答案的底部检查我已经测试过的示例nginx配置。

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

available

  • 其他选项,如果您不想依赖resolve/service记录,而要进行标准SRV记录查找,那么您将必须对容器使用A模式并选择{{1 }}选项。

premium

  • 使用DNS A选项,则您对awsvpc的查询将正常工作。
  • 使用DNS A选项时,存在一些限制。由于ENI的数量限制取决于EC2实例家族,因此您无法在同一EC2实例上为给定服务创建多个任务,因此我只希望使用SRV记录。

示例nginx DNS SRV选项配置:

A

一些参考-

aws ecs service enter image description here

答案 1 :(得分:0)

我想详细说明@Imarn详细答案,因为大多数答案都谈论SRV DNS记录类型,并仅针对高级版本的Nginx(和SRV展示Nginx示例)。

如果您使用ECS Fargate并配置了A DNS记录。最重要的是配置适当的resolver

从文档中

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

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

该地址可以指定为 域名或IP地址,带有可选端口。如果端口不是 如果指定,则使用端口53。在名称服务器中查询名称服务器 循环时尚。

话说回来,解析器必须解析私有DNS。因此,我们需要使用NS DNS记录。 使用8.8.8.8作为解析器将不起作用,因为此DNS无法解析私有DNS。

NS代表“名称服务器”,该记录表明哪个DNS服务器 对该域具有权威性(该服务器包含实际的DNS 记录)。一个域通常会有多个NS记录,这些记录可以 指明该域的主要和备用名称服务器。

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

aws route53 list-resource-record-sets --hosted-zone-id %HOSTED_ZONE_ID% --query "ResourceRecordSets[?Type == 'NS']"

选择其中一个资源记录并将其放入Nginx resolver(包括结尾的.)。

Nginx基本模板:

events {
  worker_connections 768;
}

http {
  # DNS Resolver
  resolver ns-###.awsdns-####.com. valid=10s;
  gzip on;
  gzip_proxied any;
  gzip_types text/plain application/json;
  gzip_min_length 1000;
  fastcgi_buffers 16 16k; 
  fastcgi_buffer_size 32k;

  server {

    listen 80;
    
    location / {
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header Host $host;
          proxy_redirect   off;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          # This is the important part
          proxy_pass http://ecs-fargate-svc.local:8080;
    }

    location = /health-check {
      return 200 'all good';
    }

  }
}

需要考虑的几点:

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

我的服务发现:

enter image description here

文档:

Nginx resolver

The name server (NS) record