【发布时间】:2019-11-15 18:35:53
【问题描述】:
我正在尝试让 2 个服务通过 AWS ECS 服务中的服务发现端点进行通信。
示例:
Service1:运行任务定义来运行nginx和phpfpm
Service2:运行任务定义来运行redis
现在,我需要让 service1 容器与 service2 通信 容器
根据互联网上的文档和资源。这就是我所做的,无法实现需求。
- 我们需要开启服务发现(完成)
- 设置正确的服务名称和命名空间,作为服务发现端点(完成)
- 创建任务定义并使用上述属性集创建服务(完成)
- 现在 AWS 将在 Route53 上生成一条 SRV 记录(OK)
现在,当使用服务发现端点时,通常采用格式
service_discovery_service_name.service_discovery_namespace.
错误日志显示,无法解析名称。
【问题讨论】:
-
您需要在为每个服务任务分配 IP 的 Route53 中创建 DNS
Type A记录而不是SRV。只有当您的通信支持 SRV 记录查找时,您才需要SRV记录,即客户端需要知道它需要执行 SRV 查找然后获取 IP。 -
@Imran 是的,但是 aws ECS 具有该功能的内置权利,并且也生成了 A 记录,该记录又指向实例的 IP 地址
-
您在任务定义中使用了哪种 docker 网络模式?如果您不使用
awspvc,那么它将仅创建SRV类型,然后指向A类型。当您执行nslookup myapp.local时,您将不会得到任何东西,因为它的类型是SRV而不是A。当您尝试nslookup -type=srv myapp.local时,您将获得 SRV 列表,然后您可以尝试nslookup {taskid}.myapp.local提供容器的 IP。除非您的客户端支持执行 SRV 查找然后执行 IP 查找,否则您最好只创建A记录。如果您需要示例,请告诉我,将其作为答案发布。 -
我的任务定义网络模式是桥接,它创建的 SRV 具有 taskid 和指向容器 ip 的 A 记录。请检查在编辑问题部分上传的图片@Imran
-
这就是我要说的!您的客户端(Service1)需要知道它需要对 Service2 执行
SRV查找,然后使用 SRV 结果(端口和主机名)的详细信息进行通信。例如 - 如果您的 Service1 是 nginx,那么 premium 是 nginx supports 的版本。如果您的 Service1 是phpfpm,我不确定它是否支持 SRV 查找通信。首先understandSRV记录与A类型有何不同。
标签: amazon-web-services devops amazon-ecs service-discovery