使用服务发现连接具有 DNS 名称的 Amazon ECS 服务
您的 Amazon ECS 服务可以选择配置为使用 Amazon ECS 服务发现。服务发现使用 AWS Cloud Map API 操作,用于托管 Amazon ECS 服务的 HTTP 和 DNS 命名空间。有关更多信息,请参阅 AWS Cloud Map 开发人员指南 中的什么是 AWS Cloud Map。
服务发现在以下 AWS 区域可用:
区域名称 | 区域 |
---|---|
美国东部(弗吉尼亚州北部) |
us-east-1 |
美国东部(俄亥俄州) |
us-east-2 |
美国西部(加利福尼亚北部) |
us-west-1 |
美国西部(俄勒冈州) |
us-west-2 |
非洲(开普敦) |
af-south-1 |
亚太地区(香港) |
ap-east-1 |
亚太地区(孟买) |
ap-south-1 |
亚太地区(海得拉巴) |
ap-south-2 |
Asia Pacific (Tokyo) |
ap-northeast-1 |
Asia Pacific (Seoul) |
ap-northeast-2 |
Asia Pacific (Osaka) |
ap-northeast-3 |
亚太地区(新加坡) |
ap-southeast-1 |
亚太地区(悉尼) |
ap-southeast-2 |
亚太地区(雅加达) |
ap-southeast-3 |
亚太地区(墨尔本) |
ap-southeast-4 |
加拿大(中部) |
ca-central-1 |
加拿大西部(卡尔加里) |
ca-west-1 |
中国(北京) |
cn-north-1 |
中国(宁夏) |
cn-northwest-1 |
欧洲(法兰克福) |
eu-central-1 |
欧洲(苏黎世) |
eu-central-2 |
欧洲地区(爱尔兰) |
eu-west-1 |
欧洲地区(伦敦) |
eu-west-2 |
欧洲地区(巴黎) |
eu-west-3 |
欧洲(米兰) |
eu-south-1 |
欧洲地区(斯德哥尔摩) |
eu-north-1 |
以色列(特拉维夫) |
il-central-1 |
欧洲(西班牙) |
eu-south-2 |
中东(阿联酋) |
me-central-1 |
中东(巴林) |
me-south-1 |
南美洲(圣保罗) |
sa-east-1 |
AWS GovCloud(美国东部) |
us-gov-east-1 |
AWS GovCloud(美国西部) |
us-gov-west-1 |
服务发现概念
服务发现包括以下组件:
-
服务发现命名空间:共享相同域名的服务的逻辑组,例如
example.com
。此域名是您要向其路由流量的域名。您可以通过调用aws servicediscovery create-private-dns-namespace
命令或在 Amazon ECS 控制台中创建命名空间。您可以使用aws servicediscovery list-namespaces
命令来查看有关当前账户创建的命名空间的摘要信息。有关服务发现命令的更多信息,请参阅create-private-dns-namespace
(服务发现)list-namespaces
参考指南中的 AWS Cloud Map 和 AWS CLI。 -
服务发现服务:存在于服务发现命名空间中,由命名空间的服务名称和 DNS 配置组成。它提供了以下核心组件:
-
服务注册:让您可通过 DNS 或 AWS Cloud Map API 操作查找服务,并获取一个或多个可用于连接到该服务的可用终端节点。
-
-
服务发现实例:存在于服务发现中并包含与服务目录中的每个 Amazon ECS 服务相关联的属性。
-
实例属性:将以下元数据添加为配置为使用的每个 Amazon ECS 服务的自定义属性:
-
AWS_INSTANCE_IPV4
-对于A
记录,为 Route 53 响应 DNS 查询而返回和 AWS Cloud Map 在发现实例详细信息时返回的 IPv4 地址,例如192.0.2.44
。 -
AWS_INSTANCE_PORT
– 与服务发现服务关联的端口值。 -
AVAILABILITY_ZONE
– 任务启动到的可用区。对于使用 EC2 启动类型的任务,这是容器实例存在于的可用区。对于使用 Fargate 启动类型的任务,这是弹性网络接口存在于的可用区。 -
REGION
– 任务存在于的区域。 -
ECS_SERVICE_NAME
– 任务属于的 Amazon ECS 服务的名称。 -
ECS_CLUSTER_NAME
– 任务属于的 Amazon ECS 集群的名称。 -
EC2_INSTANCE_ID
- 在其上放置任务的容器实例的 ID。如果任务使用的是 Fargate 启动类型,则不会添加此自定义属性。 -
ECS_TASK_DEFINITION_FAMILY
- 任务使用的任务定义系列。 -
ECS_TASK_SET_EXTERNAL_ID
- 如果为外部部署创建任务集并将任务集与服务发现注册表关联,ECS_TASK_SET_EXTERNAL_ID
属性将包含任务集的外部 ID。
-
-
-
Amazon ECS 运行状况检查:Amazon ECS 执行定期容器级别的运行状况检查。如果终端节点不传递运行状况检查,则会将其从 DNS 路由中删除并标记为不正常。
服务发现注意事项
使用服务发现时应注意以下事项:
-
Fargate 上使用平台版本1.1.0或更高版本的任务支持服务发现。有关更多信息,请参阅 适用于 Amazon ECS 的 Fargate 平台版本。
-
配置为使用服务发现的服务每个服务限制为 1,000 个任务。这是由于 Route 53 服务配额造成的。
-
Amazon ECS 控制台中的创建服务工作流程仅支持向私有 DNS 命名空间注册服务。在创建 AWS Cloud Map 私有 DNS 命名空间时,将自动创建 Route 53 私有托管区域。
-
必须配置 VPC DNS 属性才能成功解析 DNS。有关如何配置属性的信息,请参阅 Amazon VPC 用户指南中 VPC 中的 DNS 支持。
-
为服务发现服务创建的 DNS 记录将始终注册任务的私有 IP 地址,而不是公有 IP 地址,即使使用公共命名空间也是如此。
-
服务发现要求任务指定
awsvpc
、bridge
或host
网络模式(不支持none
)。 -
如果服务任务定义使用
awsvpc
网络模式,您可以为每个服务任务创建A
或 SRV 记录的任何组合。如果您使用 SRV 记录,则需要端口。 -
如果服务任务定义使用
bridge
或host
网络模式,则 SRV 记录是唯一受支持的 DNS 记录类型。为每个服务任务创建 SRV 记录。SRV 记录必须从任务定义中指定容器名称和容器端口组合。 -
服务发现服务的 DNS 记录可以在 VPC 中查询。它们采用以下格式:
<service discovery service name>.<service discovery namespace>
。 -
在服务名称上执行 DNS 查询时,
A
记录会返回一组与任务对应的 IP 地址。SRV 记录会返回每个任务的一组 IP 地址和端口。 -
如果您有不超过 8 条正常的记录,Route 53 会向所有 DNS 查询提供所有正常记录。
-
如果所有记录都不正常,Route 53 会向 DNS 查询提供最多 8 条不正常的记录。
-
您可以为负载均衡器后面的服务配置服务发现,但服务发现流量会始终路由至此任务而不会路由至负载均衡器。
-
服务发现不支持使用 Classic Load Balancers。
-
我们建议对服务发现服务使用由 Amazon ECS 管理的容器级别的运行状况检查。
-
HealthCheckCustomConfig – Amazon ECS 代表您管理运行状况检查。Amazon ECS 使用来自容器和运行状况检查的信息以及您的任务状态,通过 AWS Cloud Map 更新运行状况。在创建服务发现服务时,使用
--health-check-custom-config
参数来指定。有关更多信息,请参阅 AWS Cloud Map API 参考中的 HealthCheckCustomConfig。
-
-
使用服务发现时创建的 AWS Cloud Map 资源必须手动清理。
-
在容器运行状况检查返回值之前,任务和实例将注册为
UNHEALTHY
。如果运行状况检查通过,则状态更新为HEALTHY
。如果容器运行状况检查失败,则服务发现实例将被注销。
服务发现定价
使用 Amazon ECS 服务发现的客户需要为 Route 53 资源和 AWS Cloud Map 发现 API 操作付费。这涉及到创建 Route 53 托管区域和查询服务注册表的成本。更多信息,请参阅 AWS Cloud Map 开发人员指南中的 AWS Cloud Map 定价。
Amazon ECS 执行容器级别的运行状况检查并将其公开到 AWS Cloud Map 自定义运行状况检查 API 操作。目前将此提供给客户没有任何额外成本。如果您为公开任务配置其他网络运行状况检查,则需要为这些运行状况检查付费。