Amazon Elastic Container Service
开发人员指南 (API 版本 2014-11-13)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

service discovery

您的 Amazon ECS 服务可以选择配置为使用 Amazon ECS service discovery。服务发现使用 Amazon Route 53 自动命名 API 来管理服务任务的 DNS 条目,使其可在 VPC 中供搜索。有关更多信息,请参阅 Amazon Route 53 API Reference 中的为服务发现使用自动命名

注意

服务发现在以下区域可用:

区域名称 区域
美国东部(弗吉尼亚北部) us-east-1
美国东部 (俄亥俄) us-east-2
美国西部(俄勒冈) us-west-2
欧洲(爱尔兰) eu-west-1

服务发现概念

服务发现包括以下组件:

  • 服务发现命名空间:共享相同域名的服务的逻辑组,例如 example.com。每个 Route 53 托管区域和每个 VPC 需要一个命名空间。如果您从 Amazon ECS 控制台使用服务发现,则工作流为每个 ECS 集群创建一个私有命名空间。

  • 服务发现服务:存在于服务发现命名空间中,由命名空间的服务名称和 DNS 配置组成。它提供了以下核心组件:

    • 服务目录:让您可通过 DNS 或 Route 53 自动命名 API 查找服务,并获取一个或多个可用于连接到该服务的可用终端节点。

  • 运行状况检查:执行定期容器级别的运行状况检查。如果终端节点不传递运行状况检查,则会将其从 DNS 路由中删除并标记为不正常。有关更多信息,请参阅Amazon Route 53 如何检查您的资源的运行状况

服务发现注意事项

使用服务发现时应注意以下事项:

  • 支持公共命名空间,但您必须已将现有公共托管区域注册到 Route 53,然后再创建服务发现服务。

  • 服务发现只支持使用 awsvpc 网络模式的任务。

  • 服务发现服务的 DNS 记录可以在 VPC 中查询。它们采用以下格式:<service discovery service name>.<service discovery namespace>。有关示例,请参阅Creating a Service Using Service Discovery

  • 您可以为各个服务任务创建 A 或 SRV 记录的任意组合。如果您使用 SRV 记录,则需要端口。

  • 在服务名称上执行 DNS 查询时,A 记录返回与您任务对应的一组 IP 地址。SRV 记录返回各个任务的一组 IP 地址和端口。

  • 如果为 ECS 服务配置了负载均衡器并且启用了服务发现,则 A 记录用于将流量路由到负载均衡器。负载均衡器还会处理运行状况检查。

  • 为服务发现服务指定运行状况检查时,您必须使用由 Amazon ECS 或 Route 53 运行状况检查管理的自定义运行状况检查。运行状况检查的两个选项不能组合起来。

    • HealthCheckCustomConfig – Amazon ECS 代表您管理运行状况检查。Amazon ECS 使用来自容器和 Elastic Load Balancing 运行状况检查的信息以及您的任务状态来更新 Route 53 的运行状况。在创建服务发现服务时,使用 --health-check-custom-config 参数来指定。有关更多信息,请参阅 Amazon Route 53 API Reference 中的 HealthCheckCustomConfig

    • HealthCheckConfig – Route 53 创建运行状况检查来监控任务。这要求任务公开可用。在创建服务发现服务时,使用 --health-check-config 参数指定这种情况。有关更多信息,请参阅 Amazon Route 53 API Reference 中的 HealthCheckConfig

  • 如果您使用 Amazon ECS 控制台,则工作流为每个 ECS 服务创建一个服务发现服务,并将所有任务 IP 地址映射为 A 记录,或者将任务 IP 地址和端口映射为 SRV 记录。

  • 无法对配置了服务发现的现有 ECS 服务进行更新来更改服务发现配置。

注意

如果使用平台版本 v1.1.0 或更高版本,则 Fargate 任务支持服务发现。有关更多信息,请参阅 AWS Fargate 平台版本

服务发现定价

使用 Amazon ECS 服务发现的客户需要支付使用 Route 53 自动命名 API 的费用。这涉及到创建托管区域和查询服务注册表的成本。有关更多信息,请参阅 Amazon Route 53 定价

Amazon ECS 执行容器级别的运行状况检查,并将此信息公开给 Route 53 自定义运行状况检查 API,此功能目标可供客户使用,没有额外成本。如果您为公开任务配置其他网络运行状况检查,则会向您收取这些运行状况检查的费用。

使用服务发现创建服务

服务发现已集成到 Amazon ECS 控制台的创建服务向导中。有关更多信息,请参阅 创建服务

以下教程演示如何通过服务发现和 AWS CLI,使用 Fargate 任务创建 ECS 服务。

注意

只有美国东部 (弗吉尼亚北部) 区域支持 Fargate 任务。

本教程假设以下先决条件已完成:

使用服务发现和 AWS CLI 创建服务

  1. 在现有 VPC 中创建一个名为 staging 的私有命名空间:

    aws servicediscovery create-private-dns-namespace --name staging --vpc vpc-abcd1234 --region us-east-1

    输出:

    { "OperationId": "h2qe3s6dxftvvt7riu6lfy2f6c3jlhf4-je6chs2e" }
  2. 使用来自之前输出的 OperationId,验证已成功创建私有命名空间。

    aws servicediscovery get-operation --operation-id h2qe3s6dxftvvt7riu6lfy2f6c3jlhf4-je6chs2e

    输出:

    { "Operation": { "Id": "h2qe3s6dxftvvt7riu6lfy2f6c3jlhf4-je6chs2e", "Type": "CREATE_NAMESPACE", "Status": "SUCCESS", "CreateDate": 1519777852.502, "UpdateDate": 1519777856.086, "Targets": { "NAMESPACE": "ns-uejictsjen2i4eeg" } } }
  3. 创建名为 myapplication 的服务发现服务。

    aws servicediscovery create-service --name myapplication --dns-config NamespaceId="ns-uejictsjen2i4eeg",DnsRecords=[{Type="A",TTL="300"}] --health-check-custom-config FailureThreshold=1 --region us-east-1

    输出:

    { "Service": { "Id": "srv-utcrh6wavdkggqtk", "Arn": "arn:aws:servicediscovery:region:aws_account_id:service/srv-utcrh6wavdkggqtk", "Name": "myapplication", "DnsConfig": { "NamespaceId": "ns-uejictsjen2i4eeg", "DnsRecords": [ { "Type": "A", "TTL": 300 } ] }, "HealthCheckCustomConfig": { "FailureThreshold": 1 }, "CreatorRequestId": "e49a8797-b735-481b-a657-b74d1d6734eb" } }
  4. 创建要使用的名为 staging 的 ECS 集群。

    aws ecs create-cluster --cluster-name staging --region us-east-1

    输出:

    { "cluster": { "clusterArn": "arn:aws:ecs:us-east-1:809632081692:cluster/staging", "clusterName": "staging", "status": "ACTIVE", "registeredContainerInstancesCount": 0, "runningTasksCount": 0, "pendingTasksCount": 0, "activeServicesCount": 0, "statistics": [] } }
  5. 注册与 Fargate 兼容的任务定义。它需要使用 awsvpc 网络模式。以下为用于本教程的示例任务定义。

    使用以下任务定义的内容创建名为 fargate-task.json 的文件:

    { "taskDefinition": { "family": "first-run-task-definition", "networkMode": "awsvpc", "containerDefinitions": [ { "name": "sample-app", "image": "httpd:2.4", "portMappings": [ { "containerPort": 80, "hostPort": 80, "protocol": "tcp" } ], "essential": true, "entryPoint": [ "sh", "-c" ], "command": [ "/bin/sh -c \"echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' > /usr/local/apache2/htdocs/index.html && httpd-foreground\"" ], } ], "requiresCompatibilities": [ "FARGATE" ], "cpu": "256", "memory": "512" } }

    使用您创建的 fargate-task.json 文件注册任务定义。

    aws ecs register-task-definition --cli-input-json file://fargate-task.json --region us-east-1
  6. 使用您将要创建的 ECS 服务的内容创建名为 ecs-service-discovery.json 的文件。本示例使用在上一步中创建的任务定义。由于示例任务定义使用 awsvpc 网络模式,awsvpcConfiguration 是必需的。

    { "cluster": "staging", "serviceName": "ecs-service-discovery", "taskDefinition": "first-run-task-definition", "serviceRegistries": [ { "registryArn": "arn:aws:servicediscovery:region:aws_account_id:service/srv-utcrh6wavdkggqtk" } ], "launchType": "FARGATE", "platformVersion": "1.1.0", "networkConfiguration": { "awsvpcConfiguration": { "assignPublicIp": "ENABLED", "securityGroups": [ "sg-abcd1234" ], "subnets": [ "subnet-abcd1234" ] } }, "desiredCount": 1 }
  7. 创建 ECS 服务,指定 Fargate 启动类型和 1.1.0 平台版本,它将使用服务发现。

    aws ecs create-service --cli-input-json file://ecs-service-discovery.json --region us-east-1

    输出:

    { "service": { "serviceArn": "arn:aws:ecs:region:aws_account_id:service/ecs-service-discovery", "serviceName": "ecs-service-discovery", "clusterArn": "arn:aws:ecs:region:aws_account_id:cluster/default", "loadBalancers": [], "serviceRegistries": [ { "registryArn": "arn:aws:servicediscovery:region:aws_account_id:service/srv-utcrh6wavdkggqtk" } ], "status": "ACTIVE", "desiredCount": 1, "runningCount": 0, "pendingCount": 0, "launchType": "FARGATE", "platformVersion": "1.1.0", "taskDefinition": "arn:aws:ecs:region:aws_account_id:task-definition/first-run-task-definition:4", "deploymentConfiguration": { "maximumPercent": 200, "minimumHealthyPercent": 100 }, "deployments": [ { "id": "ecs-svc/9223370516993140842", "status": "PRIMARY", "taskDefinition": "arn:aws:ecs:region:aws_account_id:task-definition/first-run-task-definition:4", "desiredCount": 1, "pendingCount": 0, "runningCount": 0, "createdAt": 1519861634.965, "updatedAt": 1519861634.965, "launchType": "FARGATE", "platformVersion": "1.1.0", "networkConfiguration": { "awsvpcConfiguration": { "subnets": [ "subnet-abcd1234" ], "securityGroups": [ "sg-abcd1234" ], "assignPublicIp": "ENABLED" } } } ], "roleArn": "arn:aws:iam::aws_account_id:role/ECSServiceLinkedRole", "events": [], "createdAt": 1519861634.965, "placementConstraints": [], "placementStrategy": [], "networkConfiguration": { "awsvpcConfiguration": { "subnets": [ "subnet-abcd1234" ], "securityGroups": [ "sg-abcd1234" ], "assignPublicIp": "ENABLED" } } } }

然后,您可以验证正确创建了所有内容并查询您的 DNS 信息。

验证服务发现配置

配置了服务发现之后,您可以使用 Route 53 自动命名 API 或者在 VPC 中使用 dig 来查询,如下所述。

  1. 创建 ECS 服务并且至少成功运行了一个任务之后,您可以列出服务发现实例来确认它已设置:

    aws servicediscovery list-instances --service-id srv-utcrh6wavdkggqtk --region us-east-1

    输出:

    { "Instances": [ { "Id": "16becc26-8558-4af1-9fbd-f81be062a266", "Attributes": { "AWS_INSTANCE_IPV4": "172.31.87.2" } } ] }
  2. 在 Route 53 托管区域中为服务发现服务创建的 DNS 记录可以使用以下 CLI 命令查询。

    首先,获取有关您命名空间的信息,这包括 Route 53 托管区域 ID:

    aws servicediscovery get-namespace --id ns-uejictsjen2i4eeg --region us-east-1

    输出:

    { "Namespace": { "Id": "ns-uejictsjen2i4eeg", "Arn": "arn:aws:servicediscovery:region:aws_account_id:namespace/ns-uejictsjen2i4eeg", "Name": "cli-tutorial", "Type": "DNS_PRIVATE", "Properties": { "DnsProperties": { "HostedZoneId": "Z35JQ4ZFDRYPLV" } }, "CreateDate": 1519777852.502, "CreatorRequestId": "9049a1d5-25e4-4115-8625-96dbda9a6093" } }

    然后,获取托管区域的资源记录集:

    aws route53 list-resource-record-sets --hosted-zone-id Z35JQ4ZFDRYPLV --region us-east-1

    输出:

    { "ResourceRecordSets": [ { "Name": "staging.", "Type": "NS", "TTL": 172800, "ResourceRecords": [ { "Value": "ns-1536.awsdns-00.co.uk." }, { "Value": "ns-0.awsdns-00.com." }, { "Value": "ns-1024.awsdns-00.org." }, { "Value": "ns-512.awsdns-00.net." } ] }, { "Name": "staging.", "Type": "SOA", "TTL": 900, "ResourceRecords": [ { "Value": "ns-1536.awsdns-00.co.uk. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400" } ] }, { "Name": "myapplication.staging.", "Type": "A", "SetIdentifier": "16becc26-8558-4af1-9fbd-f81be062a266", "MultiValueAnswer": true, "TTL": 300, "ResourceRecords": [ { "Value": "172.31.87.2" } ] } ] }
  3. 您还可以使用 dig,从您 VPC 中的实例通过以下命令查询 DNS:

    dig +short myapplication.staging

    输出:

    172.31.87.2