我正在尝试使2个服务通过AWS ECS服务中的服务发现端点进行通信。
示例:
Service1 :运行任务定义以运行nginx和phpfpm
Service2 :运行任务定义以运行Redis
现在,我需要使service1容器与service2进行通信 容器
根据Internet上的文档和资源。这是我所做的,无法满足需要。
现在,在使用通常采用以下格式的服务发现端点时
service_discovery_service_name.service_discovery_namespace.
错误日志显示,无法解析名称。
答案 0 :(得分:2)
根据我们的谈话,这是正在发生的事情的摘要。
nginx
)需要与具有AWS ServiceDiscovery选项并使用{{ 3}}记录,然后 Service1 需要知道它需要执行DNS redis
查找而不是DNS SRV
(地址)查找。您在这里有多个选择。首先,如果您要继续使用A
记录使用,则您的客户端SRV需要使用SRV
和service
选项{{3 }}仅在nginx的nginx版本中。在答案的底部检查我已经测试过的示例nginx配置。
还请确保您创建带有前缀resolve
的AWS Service发现名称,否则,我在没有前缀的nginx配置中会遇到配置SRV _http._tcp
选项的问题。
resolve/service
记录,而要进行标准SRV
记录查找,那么您将必须对容器使用A
模式并选择{{1 }}选项。awsvpc
的查询将正常工作。示例nginx DNS SRV选项配置:
A
一些参考-
答案 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
)。我的服务发现:
文档: