Service Connect 概念 - Amazon Elastic Container Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Service Connect 概念

Service Connect 功能可创建相关服务的虚拟网络。可以在多个不同的命名空间中使用相同的服务配置,以运行独立但相同的应用程序集。Service Connect 定义了 Amazon ECS 服务中的代理容器。通过这种方式,就可以使用相同的任务定义在具有不同 Service Connect 配置的不同命名空间中运行相同的应用程序。Amazon ECS 服务启动的每项任务都会在任务中运行一个代理容器。

Service Connect 适用于同一命名空间内的 Amazon ECS 服务之间的连接。对于以下应用程序,您需要使用其他互连方法连接到配置了 Service Connect 的 Amazon ECS 服务:

  • 在其他命名空间中配置的 Amazon ECS 任务

  • 未针对 Service Connect 配置的 Amazon ECS 任务

  • Amazon ECS 之外的其他应用程序

这些应用程序可以通过 Service Connect 代理进行连接,但无法解析 Service Connect 端点名称。

若要让这些应用程序解析 Amazon ECS 任务的 IP 地址,则需使用另一种互连方法。有关互连方法的列表,请参阅 选择互连方法

Service Connect 术语

以下服务可与 Service Connect 一起使用:

端口名称

为特定端口映射分配名称的 Amazon ECS 任务定义配置。此配置仅供 Amazon ECS Service Connect 使用。

客户端别名

分配端点中使用的端口号的 Amazon ECS 服务配置。此外,客户端别名可以分配端点的 DNS 名称,覆盖发现名称。如果 Amazon ECS 服务中未提供发现名称,则客户端别名将覆盖端口名称作为端点名称。有关端点示例,请参阅端点的定义。可以为一项 Amazon ECS 服务分配多个客户端别名。此配置仅供 Amazon ECS Service Connect 使用。

发现名称

可以为任务定义中的指定端口创建的可选中间名称。此名称用于创建 Amazon Cloud Map 服务。如果此名称未提供,则使用任务定义中的端口名称。可以为 Amazon ECS 服务的特定端口分配多个发现名称。此配置仅供 Amazon ECS Service Connect 使用。

Amazon Cloud Map 服务名称在命名空间中必须是唯一的。由于此限制,对于每个命名空间中的特定任务定义,您只能有一个 Service Connect 配置,而没有发现名称。

端点

连接到 API 或网站的 URL。URL 包含协议、DNS 名称和端口。有关一般端点的更多信息,请参阅《Amazon Web Services 一般参考》中的 Amazon 词汇表中的端点

Service Connect 创建连接到 Amazon ECS 服务的端点,并在 Amazon ECS 服务中配置任务以连接到端点。URL 包含协议、DNS 名称和端口。您可以在任务定义中选择协议和端口名称,因为该端口必须与容器映像内的应用程序匹配。在服务中,您可以按名称选择每个端口,可以分配 DNS 名称。如果您未在 Amazon ECS 服务配置中指定 DNS 名称,则默认使用任务定义中的端口名称。例如,Service Connect 端点可以是 http://blog:80grpc://checkout:8080http://_db.production.internal:99

Service Connect 服务

Amazon ECS 服务中单一端点的配置。这是 Service Connect 配置的一部分,由控制台中的 Service Connect 和发现名称配置中的单行组成,或由 Amazon ECS 服务的 JSON 配置中的 services 列表中的一个对象组成。此配置仅供 Amazon ECS Service Connect 使用。

有关更多信息,请参阅《Amazon Elastic Container Service API 参考》中的 ServiceConnectService

命名空间

与 Service Connect 结合使用的 Amazon Cloud Map 命名空间的 Amazon 资源名称(ARN)短名称或全称。命名空间必须与 Amazon ECS 服务和集群在同一个 Amazon Web Services 区域 内。Amazon Cloud Map 中的命名空间类型不影响 Service Connect。

Service Connect 将 Amazon Cloud Map 命名空间用作相互对话的 Amazon ECS 任务的逻辑分组。每个 Amazon ECS 服务所属的命名空间只能是唯一的。命名空间中的服务可以分布在同一个 Amazon Web Services 账户 中的同一个 Amazon Web Services 区域 内的不同 Amazon ECS 集群中。由于每个集群都可以运行每种操作系统、CPU 架构、VPC 和 EC2、Fargate 和 External 类型的任务,因此您可以根据自己选择的任何标准随意组织服务。

客户端服务

一种运行网络客户端应用程序的 Amazon ECS 服务。此服务必须配置命名空间。服务中的每项任务都可以通过 Service Connect 代理容器发现并连接到命名空间中的所有端点。

如果任务中的任何容器需要从命名空间中的服务连接到端点,请选择客户端服务。如果前端、反向代理或负载均衡器应用程序通过其他方法(例如从 Elastic Load Balancing 中)接收外部流量,则它可以使用这种类型的 Service Connect 配置。

客户端-服务器服务

一种运行网络或 Web 服务应用程序的 Amazon ECS 服务。此服务必须配置命名空间和至少一个端点。使用端点即可访问服务中的每项任务。Service Connect 代理容器侦听端点名称和端口,将流量引导到任务中的应用程序容器。

如果有任何容器公开并侦听端口上的网络流量,请选择客户端-服务器服务。这些应用程序无需连接到同一命名空间中的其他客户端-服务器服务,但已配置客户端配置。后端、中间件、业务层或大多数微服务都会使用这种类型的 Service Connect 配置。如果您希望前端、反向代理或负载均衡器应用程序接收来自在相同命名空间中的使用 Service Connect 进行配置的其他服务的流量,则这些服务应使用此类 Service Connect 配置。

集群配置

您可以在创建集群时或通过更新集群来设置 Service Connect 的默认命名空间。如果您指定的命名空间名称不存在于同一个 Amazon Web Services 区域 和账户中,则会创建一个新的 HTTP 命名空间。

如果您创建集群并指定默认 Service Connect 命名空间,则在 Amazon ECS 创建命名空间期间,该集群将处于 PROVISIONING 状态等待。您可以在集群的状态中看到一个 attachment,它显示了命名空间的状态。默认情况下,附件不显示在 Amazon CLI 中,您必须添加 --include ATTACHMENTS 才能查看。

Service Connect 服务配置

Service Connect 旨在要求最低配置。您需要为要在任务定义中与 Service Connect 结合使用的每个端口映射设置一个名称。在服务中,您需要开启 Service Connect 并选择一个命名空间来创建客户端服务。要创建客户端-服务器服务,您需要添加与其中一个端口映射的名称相匹配的单个 Service Connect 服务配置。Amazon ECS 重复使用任务定义中的端口号和端口名来定义 Service Connect 服务和端点。要覆盖这些值,可以在控制台中使用其他参数 DiscoveryDNSPort,或者在 Amazon ECS API 中分别使用 discoveryNameclientAliases

以下示例显示了在同一 Amazon ECS 服务中一起使用的每种 Service Connect 配置。提供了 Shell 注释,但请注意,用于 Amazon ECS 服务的 JSON 配置不支持注释。

{ ... serviceConnectConfiguration: { enabled: true, namespace: "internal", #config for client services can end here, only these two parameters are required. services: [{ portName: "http" }, #minimal client - server service config can end here.portName must match the "name" parameter of a port mapping in the task definition. { discoveryName: "http-second" #name the discoveryName to avoid a Task def port name collision with the minimal config in the same Cloud Map namespace portName: "http" }, { clientAliases: [{ dnsName: "db", port: 81 }] #use when the port in Task def is not the port that client apps use.Client apps can use http: //db:81 to connect discoveryName: "http-three" portName: "http" }, { clientAliases: [{ dnsName: "db.app", port: 81 }] #use when the port in Task def is not the port that client apps use.duplicates are fine as long as the discoveryName is different. discoveryName: "http-four" portName: "http", ingressPortOverride: 99 #If App should also accept traffic directly on Task def port. } ] } }

部署顺序

使用 Amazon ECS Service Connect 时,可以将每项 Amazon ECS 服务配置为运行接收网络请求的服务器应用程序(客户端-服务器服务),或者配置为运行发出请求的客户端应用程序(客户端服务)。

准备开始使用 Service Connect 时,从客户端-服务器服务开始。您可以向新服务或现有服务添加 Service Connect 配置。编辑和更新 Amazon ECS 服务以添加 Service Connect 配置后,Amazon ECS 将在命名空间中创建 Service Connect 端点。此外,Amazon ECS 在服务中创建新部署以替换当前正在运行的任务。

现有任务和其他应用程序可以继续连接到现有端点和外部应用程序。如果客户端-服务器服务通过横向扩展来添加任务,则来自客户端的新连接将立即在所有任务之间保持平衡。如果客户端-服务器服务已更新,则来自客户端的新连接将立即在新版本的任务之间保持平衡。

现有任务无法解析并连接到新端点。只有在同一命名空间中具有 Service Connect 配置且在此部署之后开始运行的新 Amazon ECS 任务才能解析并连接到此端点。例如,必须重新部署运行客户端应用程序的 Amazon ECS 服务,才能连接到新的数据库服务器端点。在服务器的部署完成后开始客户端部署。

这意味着客户端应用程序的操作员可以决定其应用程序的配置何时更改,即使服务器应用程序的操作员可以随时更改其配置。每次在命名空间中部署任何 Amazon ECS 服务时,命名空间中的端点列表均可能更改,但是现有任务和替换任务的行为仍然与最近部署后的行为相同。

考虑以下示例。

首先,假设您正在创建可在单个 Amazon CloudFormation 模板和单个 Amazon CloudFormation 堆栈中供公有互联网使用的应用程序。公共发现和可访问性应最后由 Amazon CloudFormation 创建,包括前端客户端服务。服务需要按此顺序创建,以防止前端客户端服务运行并向公众开放,但后端不会。这样可以避免在此期间向公众发送错误消息。在 Amazon CloudFormation 中,您必须使用 dependsOn,用于向 Amazon CloudFormation 指示多个 Amazon ECS 服务不能并行或同时进行。对于客户端任务连接到的每个后端客户端-服务器服务,您都应将 dependsOn 添加到前端客户端服务中。

其次,假设存在没有 Service Connect 配置的前端服务。任务正在连接到现有的后端服务。首先使用 DNS 中的相同名称或前端所用的 clientAlias,将客户端-服务器服务连接配置添加到后端服务。这会创建一个新部署,因此所有部署回滚检测或 Amazon Web Services Management Console、Amazon CLI、Amazon 开发工具包和其他方法将后端服务回滚并恢复到先前的部署和配置。如果您对后端服务的性能和行为感到满意,请向前端服务添加客户端或客户端-服务器 Service Connect 配置。只有新部署中的任务使用添加到这些新任务中的 Service Connect 代理。如果此配置有问题,通过使用部署回滚检测或 Amazon Web Services Management Console、Amazon CLI、Amazon 开发工具包和其他方法将后端服务回滚并恢复到先前的部署和配置,您可以回滚和恢复到以前的配置。如果您使用其他基于 DNS(而非 Service Connect)的服务发现系统,则在本地 DNS 缓存到期后,任何前端或客户端应用程序都会开始使用新端点并更改端点配置,这通常需要数小时。

联网

在默认配置中,Service Connect 代理侦听任务定义中的端口映射上的 containerPort。您需要在安全组中设置规则,以允许从 VPC CIDR,或者特別是从运行客户端的子网传入(进入)流量到此端口。

即使您在 Service Connect 服务配置中设置了端口号,这也不会更改 Service Connect 代理侦听的客户端-服务器服务的端口。当您设置此端口号时,Amazon ECS 会在这些任务内的 Service Connect 代理上更改客户端服务所连接的端点的端口。客户端服务中的代理使用 containerPort 连接到客户端-服务器服务中的代理。

如果要更改 Service Connect 代理侦听的端口,请更改客户端服务器服务的 Service Connect 配置中的 ingressPortOverride。如果您更改此端口号,则必须允许 Amazon VPC 安全组中此端口上的入站流量,该端口由通往此服务的流量使用。

您的应用程序发送到为 Service Connect 配置的 Amazon ECS 服务的流量要求 Amazon VPC 和子网具有允许您使用的 containerPortingressPortOverride 端口号的路由表规则和网络 ACL 规则。

您可以使用 Service Connect 在 VPC 之间发送流量。您必须注意对路由表规则、网络 ACL 和安全组的相同要求,因为它们适用于两种 VPC。

例如,两个集群在不同的 VPC 中创建任务。每个集群中的服务都配置为使用相同的命名空间。这两个服务中的应用程序无需任何 VPC DNS 配置即可解析命名空间中的每个端点。但是,除非 VPC 对等、VPC 或子网路由表以及 VPC 网络 ACL 允许您正在使用的 containerPortingressPortOverride 端口号上的流量,否则代理无法进行连接。

对于使用 bridge 联网模式的任务,您必须创建一个带有入站规则的安全组,该规则允许上动态端口范围内的流量。然后,将安全组分配给 Service Connect 集群中的所有 EC2 实例。

Service Connect 代理

如果使用 Service Connect 配置创建或更新 Amazon ECS 服务,Amazon ECS 则会在每个新任务启动时为其添加一个新容器。这种使用单独容器的模式称为 sidecar。此容器不存在于任务定义中,您无法对其进行配置。Amazon ECS 在 Amazon ECS 服务中管理此容器的配置。因此,您可以在多个 Amazon ECS 服务、命名空间之间重复使用相同的任务定义,也可以在没有 Service Connect 的情况下运行任务。

代理资源
  • 在任务定义中,任务 CPU 和内存限制是您需要为此容器配置的唯一参数。在 Amazon ECS 服务中,您唯一需要为此容器配置的参数是日志配置,您可以在 Service Connect 配置中找到此配置。有关 Service Connect 配置更多信息,请参阅 Service Connect 服务配置

  • 任务定义必须设置任务内存限制才能使用 Service Connect。未在其他容器的容器限制中分配的任务限制中的额外 CPU 和内存将由 Service Connect 代理容器和其他未设置容器限制的容器使用。

  • 我们建议为 Service Connect 代理容器的任务 CPU 和内存添加 256 个 CPU 单元和至少 64MiB 的内存。在 Amazon Fargate 上,可以设置的最低内存量为 512 MiB 内存。在 Amazon EC2 上,任务内存是可选的,但对于 Service Connect 来说是必需的。

  • 如果您希望此服务中的任务在峰值负载时每秒收到超过 500 个请求,我们建议在此 Service Connect 代理容器的任务定义中向您的任务 CPU 添加 512 个 CPU 单元。

  • 如果您希望在命名空间中创建 100 个以上的 Service Connect 服务,或者在命名空间内的所有 Amazon ECS 服务中总共创建 2000 个任务,我们建议在 Service Connect 代理容器的任务内存中添加 128 MiB 的内存。在命名空间中的所有 Amazon ECS 服务使用的每个任务定义中,您都应该执行此操作。

代理配置

您的应用程序通过与应用程序相同的任务连接到 sidecar 容器中的代理。Amazon ECS 会配置任务和容器,以便只有当应用程序连接到同一命名空间中的端点名称时,应用程序才会连接到代理。所有其他流量都不使用此代理。其他流量包括同一 VPC 中的 IP 地址、Amazon 服务端点和外部流量。

负载均衡

Service Connect 将代理配置为使用轮询策略在 Service Connect 端点中的任务之间进行负载均衡。连接所在任务中的本地代理在提供端点的客户端-服务器服务中挑选其中一个任务。

例如,考虑一个在名为 local 的命名空间中配置为客户端服务的 Amazon ECS 中运行 WordPress 的任务。还有另一项包含运行 MySQL 数据库的 2 个任务的服务。此服务配置为在同一命名空间中通过 Service Connect 提供一个称为 mysql 的端点。在 WordPress 任务中,WordPress 应用程序会使用端点名称连接到数据库。鉴于 Service Connect 配置,与该名称的连接会转到在同一个任务中在 sidecar 容器中运行的代理。然后,代理可以使用轮询策略连接到任一 MySQL 任务。

负载均衡策略:轮询

异常检测

此功能使用代理拥有的有关先前失败连接的数据,以避免向已连接失败的主机发送新连接。Service Connect 配置代理的异常检测功能以提供被动运行状况检查。

例如,考虑一个在名为 local 的命名空间中配置为客户端服务的 Amazon ECS 中运行 WordPress 的任务。还有另一项包含运行 MySQL 数据库的 2 个任务的服务。此服务配置为在同一命名空间中通过 Service Connect 提供一个称为 mysql 的端点。在 WordPress 任务中,WordPress 应用程序连接到在同一个任务的 sidecar 容器中运行的代理。代理可以连接到任一 MySQL 任务。如果代理与特定 MySQL 任务建立了多个连接,并且在过去 30 秒内有 5 个或以上的连接失败,则代理会在 30 到 300 秒内避开该 MySQL 任务。

重试

Service Connect 将代理配置为重试通过代理但失败的连接,第二次尝试将避免使用先前连接中的主机。这样可以确保通过 Service Connect 所进行的每次连接都不会因为一次性原因而失败。

重试次数:2

超时

Service Connect 将代理配置为客户端-服务器应用程序响应的最长等待时间。默认超时值为 15 秒,但该值可以更新。

可选参数:

idleTimeout – 连接在空闲时保持活动状态的时间(以秒为单位)。值为 0 将禁用 idleTimeout

HTTP/HTTP2/GRPCidleTimeout 默认值为 5 分钟。

TCPidleTimeout 默认值为 1 小时。

perRequestTimeout – 等待上游对每个请求做出完整响应的时长。值为 0 将禁用 perRequestTimeout。仅当应用程序容器的 appProtocolHTTP/HTTP2/GRPC 时才能设置。默认值为 15 秒。

注意

如果将 idleTimeout 设置为小于 perRequestTimeout 的时间,则连接将在达到 idleTimeout 而不是 perRequestTimeout 时关闭。