开始使用Amazon App Mesh和Amazon ECS - Amazon App Mesh
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

开始使用Amazon App Mesh和Amazon ECS

本主题可帮助您使用Amazon App Mesh使用在 Amazon ECS 上运行的实际服务。本教程涵盖了几种 App Mesh 资源类型的基本功能。

场景

要说明如何使用 App Mesh,请假定您的一款应用程序具有以下特征:

  • 由两个名为的服务组成serviceAserviceB.

  • 这两个服务均注册到名为 apps.local 的命名空间。

  • ServiceA 通过 HTTP/2 和端口 80 与 serviceB 通信。

  • 您已部署版本 2 的 serviceB,并采用名称 serviceBv2apps.local 命名空间中注册了该服务。

您的要求如下:

  • 你想发送 75% 的流量来自serviceAserviceB以及 25% 的流量流向serviceBv2以容量预留serviceBv2在你发送 100% 的流量之前,没有错误serviceA去吧。

  • 您希望能够轻松调整流量权重,以便一旦证明 serviceBv2 可靠便可将 100% 的流量发送到该服务。一旦所有流量都被发送到serviceBv2,您要停用serviceB.

  • 您不希望为实际服务更改任何现有的应用程序代码或服务发现注册,以满足先前的要求。

为了满足您的要求,您决定创建一个包含虚拟服务、虚拟节点、虚拟路由器和路由的 App Mesh 服务网格。实现网格后,您可以更新服务以使用 Envoy 代理。更新后,您的服务将通过 Envoy 代理相互通信,而不是直接相互通信。

先决条件

  • 对 App Mesh 概念的现有理解。有关更多信息,请参阅 什么是 Amazon App Mesh?

  • 对亚马逊 ECS 概念的现有理解。有关更多信息,请参阅什么是 Amazon ECS在 Amazon Elastic Service 开发人员指南中

  • App Mesh 支持在 DNS 中注册的 Linux 服务,Amazon Cloud Map,或两者。要使用此入门指南,我们建议您提供三个已注册到 DNS 的现有服务。本主题中的过程假设现有服务被命名为serviceA,serviceB,以及serviceBv2并且所有服务都可以通过名为的命名空间被发现apps.local.

    即使服务不存在,您也可以创建服务网格及其资源,但在部署实际服务之前,您无法使用网格。有关在 Amazon ECS 上发现服务的更多信息,请参阅服务发现. 要使用服务发现创建 Amazon ECS 服务教程:使用服务发现创建服务. 如果您还没有运行服务,可以使用服务发现创建 Amazon ECS 服务.

第 1 步:创建网格和虚拟服务

服务网格是一种用于驻留在其内的服务之间的网络流量的逻辑边界。有关更多信息,请参阅 服务网格。虚拟服务是实际服务的抽象。有关更多信息,请参阅 虚拟服务

创建以下资源:

  • 名为 apps 的网格,因为此场景中的所有服务均注册到 apps.local 命名空间。

  • 名为 serviceb.apps.local 的虚拟服务,因为虚拟服务表示可以使用该名称发现的服务,并且您不希望更改代码以引用其他名称。稍后的步骤中将添加名为 servicea.apps.local 的虚拟服务。

您可以使用Amazon Web Services Management Console或者Amazon CLI版本 1.18.116 或更高版本或 2.0.38 或更高版本完成以下步骤。如果使用 Amazon CLI,请使用 aws --version 命令检查已安装的 Amazon CLI 版本。如果你没有安装 1.18.116 或更高版本或 2.0.38 或更高版本,那么你必须安装或更新Amazon CLI. 选择要使用的工具所对应的选项卡。

Amazon Web Services Management Console
  1. 在以下位置打开 App Mesh 控制台首次运行向导https://console.aws.amazon.com/appmesh/get-started.

  2. 对于 Mesh name (网格名称),输入 apps

  3. 对于 Virtual service name (虚拟服务名称),输入 serviceb.apps.local

  4. 要继续,请选择 Next

Amazon CLI
  1. 使用 create-mesh 命令创建网格。

    aws appmesh create-mesh --mesh-name apps
  2. 使用 create-virtual-service 命令创建虚拟服务。

    aws appmesh create-virtual-service --mesh-name apps --virtual-service-name serviceb.apps.local --spec {}

第 2 步:创建虚拟节点

虚拟节点充当实际服务的逻辑指针。有关更多信息,请参阅 虚拟节点

创建名为 serviceB 的虚拟节点,因为某个虚拟节点表示名为 serviceB 的实际服务。可使用主机名 serviceb.apps.local,通过 DNS 发现虚拟节点所表示的实际服务。或者,也可以使用 Amazon Cloud Map 发现实际服务。虚拟节点将采用 HTTP/2 协议在端口 80 上侦听流量。此外,还支持其他协议和运行状况检查。您将在后面的步骤中为 serviceBv2serviceA 创建虚拟节点。

Amazon Web Services Management Console
  1. 对于 Virtual node name (虚拟节点名称),输入 serviceB

  2. 对于服务发现方法,选择DNS然后输入入serviceb.apps.local为了DNS 主机名.

  3. 下面侦听器配置,选择htpate为了协议然后输入入80为了端口.

  4. 要继续,请选择 Next

Amazon CLI
  1. 使用以下内容创建名为 create-virtual-node-serviceb.json 的文件:

    { "meshName": "apps", "spec": { "listeners": [ { "portMapping": { "port": 80, "protocol": "http2" } } ], "serviceDiscovery": { "dns": { "hostname": "serviceB.apps.local" } } }, "virtualNodeName": "serviceB" }
  2. 使用创建虚拟节点create-virtual-node命令使用 JSON 文件作为输入。

    aws appmesh create-virtual-node --cli-input-json file://create-virtual-node-serviceb.json

第 3 步:创建虚拟路由器和路由

虚拟路由器路由网格中一个或多个虚拟服务的流量。有关更多信息,请参阅 虚拟路由器路由

创建以下资源:

  • 名为 serviceB 的虚拟路由器,因为 serviceB.apps.local 虚拟服务不会启动与任何其他服务的出站通信。请记住,您之前创建的虚拟服务是实际 serviceb.apps.local 服务的抽象。虚拟服务将流量发送到虚拟路由器。虚拟路由器使用端口 80 上的 HTTP/2 协议监听流量。此外,还支持其他协议。

  • 名为 serviceB 的路由。它将 100% 的流量路由到serviceB虚拟节点。添加后,权重将在稍后的步骤中进行serviceBv2虚拟节点。虽然本指南中未作介绍,但您可以为路由添加额外的筛选条件,并添加重试策略,从而使 Envoy 代理在遇到通信问题时会多次尝试将流量发送到虚拟节点。

Amazon Web Services Management Console
  1. 对于 Virtual router name (虚拟路由器名称),输入 serviceB

  2. 下面侦听器配置,选择htpate为了协议并指定80为了端口.

  3. 对于 Route name (路由名称),输入 serviceB

  4. 对于 Route type (路由类型),选择 http2

  5. 对于虚拟节点名称目标配置,ELECTserviceB然后输入入100为了Weight.

  6. 下面匹配项配置,请选择一个方法.

  7. 要继续,请选择 Next

Amazon CLI
  1. 创建虚拟路由器。

    1. 使用以下内容创建名为 create-virtual-router.json 的文件:

      { "meshName": "apps", "spec": { "listeners": [ { "portMapping": { "port": 80, "protocol": "http2" } } ] }, "virtualRouterName": "serviceB" }
    2. 使用创建虚拟路由器create-virtual-router命令使用 JSON 文件作为输入。

      aws appmesh create-virtual-router --cli-input-json file://create-virtual-router.json
  2. 创建路由。

    1. 使用以下内容创建名为 create-route.json 的文件:

      { "meshName" : "apps", "routeName" : "serviceB", "spec" : { "httpRoute" : { "action" : { "weightedTargets" : [ { "virtualNode" : "serviceB", "weight" : 100 } ] }, "match" : { "prefix" : "/" } } }, "virtualRouterName" : "serviceB" }
    2. 采用 JSON 文件作为输入,使用 create-route 命令创建路由。

      aws appmesh create-route --cli-input-json file://create-route.json

第 4 步:审核和创建

根据之前的说明审核设置。

Amazon Web Services Management Console

如果需要对任何部分进行任何更改,请选择 Edit (编辑)。在您对设置感到满意后,选择 Create mesh (创建网格)

Status (状态) 屏幕将显示已创建的所有网格资源。您可以通过选择 View mesh (查看网格) 来在控制台中查看创建的资源。

Amazon CLI

使用 describe-mesh 命令查看所创建网格的设置。

aws appmesh describe-mesh --mesh-name apps

查看您使用创建的虚拟服务的设置describe-virtual-service命令。

aws appmesh describe-virtual-service --mesh-name apps --virtual-service-name serviceb.apps.local

查看您使用创建的虚拟节点的设置describe-virtual-node命令。

aws appmesh describe-virtual-node --mesh-name apps --virtual-node-name serviceB

查看您使用创建的虚拟路由器的设置describe-virtual-router命令。

aws appmesh describe-virtual-router --mesh-name apps --virtual-router-name serviceB

使用 describe-route 命令查看所创建路由的设置。

aws appmesh describe-route --mesh-name apps \ --virtual-router-name serviceB --route-name serviceB

第 5 步:创建额外资源

要完成此场景,您需要执行以下操作:

  • 创建名为 serviceBv2 的虚拟节点,以及名为 serviceA 的虚拟节点。这两个虚拟节点均通过 HTTP/2 和端口 80 侦听请求。对于serviceA虚拟节点,配置后端serviceb.apps.local. 从的所有出站流量serviceA虚拟节点被发送到名为的虚拟服务serviceb.apps.local. 虽然本指南中未作介绍,但您还可以为虚拟节点指定用于写入访问日志的文件路径。

  • 创建一个名为的额外虚拟服务servicea.apps.local,它将所有流量直接发送到serviceA虚拟节点。

  • 更新在上一步中创建的 serviceB 路由,以将 75% 的流量发送到 serviceB 虚拟节点,将 25% 的流量发送到 serviceBv2 虚拟节点。随着时间的推移,您可以继续修改权重,直到 serviceBv2 收到 100% 的流量。一旦所有流量都发送到serviceBv2,你可以关闭然后停止serviceB虚拟节点和实际服务。在更改权重时,不需要对代码进行任何修改,因为 serviceb.apps.local 虚拟服务名称和实际服务名称没有改变。回想一下,serviceb.apps.local 虚拟服务将流量发送到虚拟路由器,该路由器将流量路由到虚拟节点。虚拟节点的服务发现名称可以随时更改。

Amazon Web Services Management Console
  1. 在左侧导航窗格中,选择 Meshes (网格)

  2. 选择在上一步中创建的 apps 网格。

  3. 在左侧导航窗格中,选择 Virtual nodes (虚拟节点)

  4. 选择 Create virtual node (创建虚拟节点)

  5. 对于虚拟节点名称输入入入serviceBv2,对于服务发现方法,选择DNS,对于DNS 主机名输入入入servicebv2.apps.local.

  6. 对于侦听器配置,ELECThtpate为了协议然后输入入80为了端口.

  7. 选择 Create virtual node (创建虚拟节点)

  8. 再次选择 Create virtual node (创建虚拟节点)。输入入serviceA对于虚拟节点名称. 对于 Service discovery method (服务发现方法),选择 DNS,并为 DNS hostname (DNS 主机名) 输入 servicea.apps.local

  9. 对于输入虚拟服务名称新后端输入入入serviceb.apps.local.

  10. 下面侦听器配置,选择htpate为了协议输入入入80为了端口,然后选择创建虚拟节点.

  11. 在左侧导航窗格中,选择 Virtual routers (虚拟路由器),然后从列表中选择 serviceB 虚拟路由器。

  12. Routes (路由) 下,选择在上一步中创建的名为 ServiceB 的路由,然后选择 Edit (编辑)

  13. 下面目标,虚拟节点名称,更改的值Weight为了serviceB75.

  14. 选择添加目标,选择serviceBv2从下拉列表中,将值设置为Weight25.

  15. 选择 Save(保存)。

  16. 在左侧导航窗格中,选择 Virtual services (虚拟服务),然后选择 Create virtual service (创建虚拟服务)

  17. 输入入servicea.apps.local为了虚拟服务名称,ELECT虚拟节点为了Provider,ELECTserviceA为了虚拟节点,然后选择创建虚拟服务

Amazon CLI
  1. 创建 serviceBv2 虚拟节点。

    1. 使用以下内容创建名为 create-virtual-node-servicebv2.json 的文件:

      { "meshName": "apps", "spec": { "listeners": [ { "portMapping": { "port": 80, "protocol": "http2" } } ], "serviceDiscovery": { "dns": { "hostname": "serviceBv2.apps.local" } } }, "virtualNodeName": "serviceBv2" }
    2. 创建 虚拟节点。

      aws appmesh create-virtual-node --cli-input-json file://create-virtual-node-servicebv2.json
  2. 创建 serviceA 虚拟节点。

    1. 使用以下内容创建名为 create-virtual-node-servicea.json 的文件:

      { "meshName" : "apps", "spec" : { "backends" : [ { "virtualService" : { "virtualServiceName" : "serviceb.apps.local" } } ], "listeners" : [ { "portMapping" : { "port" : 80, "protocol" : "http2" } } ], "serviceDiscovery" : { "dns" : { "hostname" : "servicea.apps.local" } } }, "virtualNodeName" : "serviceA" }
    2. 创建 虚拟节点。

      aws appmesh create-virtual-node --cli-input-json file://create-virtual-node-servicea.json
  3. 更新在上一步中创建的 serviceb.apps.local 虚拟服务,以将其流量发送到 serviceB 虚拟路由器。最初创建虚拟服务时,它不会向任何位置发送流量,因为尚未创建 serviceB 虚拟路由器。

    1. 使用以下内容创建名为 update-virtual-service.json 的文件:

      { "meshName" : "apps", "spec" : { "provider" : { "virtualRouter" : { "virtualRouterName" : "serviceB" } } }, "virtualServiceName" : "serviceb.apps.local" }
    2. 使用更新虚拟服务update-virtual-service命令。

      aws appmesh update-virtual-service --cli-input-json file://update-virtual-service.json
  4. 更新在上一步中创建的 serviceB 路径。

    1. 使用以下内容创建名为 update-route.json 的文件:

      { "meshName" : "apps", "routeName" : "serviceB", "spec" : { "http2Route" : { "action" : { "weightedTargets" : [ { "virtualNode" : "serviceB", "weight" : 75 }, { "virtualNode" : "serviceBv2", "weight" : 25 } ] }, "match" : { "prefix" : "/" } } }, "virtualRouterName" : "serviceB" }
    2. 使用 update-route 命令更新路由。

      aws appmesh update-route --cli-input-json file://update-route.json
  5. 创建 serviceA 虚拟服务。

    1. 使用以下内容创建名为 create-virtual-servicea.json 的文件:

      { "meshName" : "apps", "spec" : { "provider" : { "virtualNode" : { "virtualNodeName" : "serviceA" } } }, "virtualServiceName" : "servicea.apps.local" }
    2. 创建虚拟服务。

      aws appmesh create-virtual-service --cli-input-json file://create-virtual-servicea.json

网格摘要

在创建服务网格之前,您具有三个名为 servicea.apps.localserviceb.apps.localservicebv2.apps.local 的实际服务。除实际服务之外,现在您还具有一个服务网格,其中包含用以表示实际服务的以下资源:

  • 两个虚拟服务。代理通过虚拟路由器将所有流量从 servicea.apps.local 虚拟服务发送到 serviceb.apps.local 虚拟服务。

  • 三个名为 serviceAserviceBserviceBv2 的虚拟节点。Envoy 代理使用为虚拟节点配置的服务发现信息来查找实际服务的 IP 地址。

  • 一个虚拟路由器,其路由指示 Envoy 代理将 75% 的入站流量路由到 serviceB 虚拟节点,将 25% 的流量路由到 serviceBv2 虚拟节点。

第 6 步:更新服务

创建网格后,您需要完成以下任务:

  • 授权您在每个 Amazon ECS 任务中部署的 Envoy 代理读取一个或多个虚拟节点的配置。有关如何向代理授权的更多信息,请参阅代理授权

  • 更新您现有的每个 Amazon ECS 任务定义以使用 Envoy 代理。

凭证

Envoy 容器需要Amazon Identity and Access Management用于对发送到 App Mesh 服务的请求进行签名的证书。对于使用 Amazon EC2 启动类型部署的 Amazon ECS 任务,证书可以来自实例角色或者来自的任务 IAM 角色. 使用 Fargate 启动类型部署的 Amazon ECS 任务无法访问提供实例 IAM 配置文件证书的 Amazon EC2 元数据服务器。要提供证书,您必须将 IAM 任务角色附加到使用 Fargate 启动类型部署的所有任务。

如果使用 Amazon EC2 启动类型部署任务,则无法访问 Amazon EC2 元数据服务器,如中所述重要注释任务的 IAM 角色,则还必须将任务 IAM 角色附加到该任务上。您分配给实例或任务的角色必须附加一个 IAM 策略,如中所述代理授权.

要使用以下命令更新任务定义Amazon Web Services Management Console

以下步骤仅显示如何更新此场景的 taskB 任务。您还需要通过更改相应值来更新 taskBv2taskA 任务。

  1. 打开位于 https://console.aws.amazon.com/redshift/ 的 Amazon ECS 控制台。

  2. 从导航栏中,选择包含您的任务定义的区域。

  3. 在导航窗格中,选择 Task Definitions

  4. Task Definitions (任务定义) 页面上,选择要修订的任务定义左侧的框。从先决条件和之前的步骤中,您可能已具有名为 taskAtaskBtaskBv2 的任务定义。选择 taskB,然后选择 Create new revision (创建新修订)

  5. 创建任务定义的新修订版页面上,进行以下更改以启用 App Mesh 应用程序的以下更改。

    1. 对于服务集成,要配置 App Mesh 集成的参数,请选择启用App Mesh然后执行以下操作:

      1. 对于应用程序的应用程序的应用程序的应用程序,选择要用于 App Mesh 应用程序的容器名称。必须已在任务定义中定义此容器。

      2. 对于特使图片,完成以下任务并输入返回的值。

        • 全部支持的除此之外的地区me-south-1,ap-east-1,ap-southeast-3,eu-south-1,以及af-south-1. 你可以更换区域代码与除此之外的任何地区me-south-1,ap-east-1,ap-southeast-3,eu-south-1,以及af-south-1.

          840364872350.dkr.ecr.region-code.amazonaws.com/aws-appmesh-envoy:v1.23.1.0-prod
        • me-south-1 地区:

          772975370895.dkr.ecr.me-south-1.amazonaws.com/aws-appmesh-envoy:v1.23.1.0-prod
        • ap-east-1 地区:

          856666278305.dkr.ecr.ap-east-1.amazonaws.com/aws-appmesh-envoy:v1.23.1.0-prod
        • ap-southeast-3 地区:

          909464085924.dkr.ecr.ap-southeast-3.amazonaws.com/aws-appmesh-envoy:v1.23.1.0-prod
        • eu-south-1 地区:

          422531588944.dkr.ecr.eu-south-1.amazonaws.com/aws-appmesh-envoy:v1.23.1.0-prod
        • af-south-1 地区:

          924023996002.dkr.ecr.af-south-1.amazonaws.com/aws-appmesh-envoy:v1.23.1.0-prod
        • cn-north-1 地区:

          919366029133.dkr.ecr.cn-north-1.amazonaws.com.cn/aws-appmesh-envoy:v1.23.1.0-prod
        • cn-northwest-1 地区:

          919830735681.dkr.ecr.cn-northwest-1.amazonaws.com.cn/aws-appmesh-envoy:v1.23.1.0-prod
        • Public repository

          public.ecr.aws/appmesh/aws-appmesh-envoy:v1.23.1.0-prod
        重要

        仅支持 v1.9.0.0-prod 或更高版本与 App Mesh 一起使用。

      3. 对于网格名称,选择要使用的App Mesh(应用程序的App Mesh)。在本主题中,创建的网格名称为 apps.

      4. 对于 Virtual node name (虚拟节点名称),选择要使用的 App Mesh 虚拟节点。例如,对于 taskB 任务,您可以选择在上一步中创建的 serviceB 虚拟节点。

      5. Virtual node port (虚拟节点端口) 的值将使用您在创建虚拟节点时指定的侦听器端口进行预填充。

      6. 选择 Apply (应用),然后选择 Confirm (确认)。将创建一个新的 Envoy 代理容器并将其添加到任务定义中,同时还会创建支持该容器的设置。然后 Envoy 代理容器会预先填充App Mesh代理配置下一步的设置。

    2. 对于 Proxy Configuration (代理配置),请验证所有预填充值。

    3. 对于网络模式,请确保awsvpc已ELECT。要了解有关 awsvpc 网络模式的更多信息,请参阅使用 awsvpc 网络模式进行任务联网

  6. 选择 Create(创建)

  7. 使用更新后的任务定义更新服务。有关更多信息,请参阅更新服务

控制台创建任务定义的 json 规范。您可以修改某些设置,但不能修改其他设置。有关更多信息,请在以下部分中展开以下部分。

代理配置

要将您的 Amazon ECS 服务配置为使用 App Mesh,您的服务的任务定义必须包含以下代理配置部分。将代理配置 type 设置为 APPMESH,并 containerName 配置为 envoy。相应地设置以下属性值。

IgnoredUID

Envoy 代理不会路由来自使用此用户 ID 的进程的流量。您可以为此属性值选择所需的任何用户 ID,但此 ID 必须与任务定义中的 Envoy 容器的 user ID 相同。此匹配允许 Envoy 忽略其自己的流量,而无需使用代理。出于历史原因,我们的示例使用 1337

ProxyIngressPort

这是 Envoy 代理容器的入站端口。将此值设置为 15000

ProxyEgressPort

这是 Envoy 代理容器的出站端口。将此值设置为 15001

AppPorts

指定您的应用程序容器监听的任何入站端口。在此示例中,应用程序容器在端口 9080 上侦听。您指定的端口必须与虚拟节点侦听器上配置的端口匹配。

EgressIgnoredIPs

Envoy 不会将流量代理至这些 IP 地址。将该值设置为169.254.170.2,169.254.169.254,它忽略了 Amazon EC2 元数据服务器和 Amazon ECS 任务元数据端点。元数据终端节点为任务证书提供 IAM 角色。您可以添加其他地址。

EgressIgnoredPorts

您可以添加以逗号分隔的端口列表。Envoy 不会将流量转发至这些端口。即使您没有列出任何端口,端口 22 也会被忽略。

注意

可以忽略的最大出站端口数为 15。

"proxyConfiguration": { "type": "APPMESH", "containerName": "envoy", "properties": [{ "name": "IgnoredUID", "value": "1337" }, { "name": "ProxyIngressPort", "value": "15000" }, { "name": "ProxyEgressPort", "value": "15001" }, { "name": "AppPorts", "value": "9080" }, { "name": "EgressIgnoredIPs", "value": "169.254.170.2,169.254.169.254" }, { "name": "EgressIgnoredPorts", "value": "22" } ] }

应用程序容器 Envoy 依赖项

您的任务定义中的应用程序容器必须等待 Envoy 代理来引导和启动之后才能启动。为了确保这种情况发生,你可以设置一个dependsOn每个应用程序容器定义中的部分等待 Envoy 容器报告为HEALTHY. 以下代码显示了包含此依赖项的应用程序容器定义示例。以下示例中的所有属性都是必需的。某些属性值也是必需的,但某些属性值是可替换的

{ "name": "appName", "image": "appImage", "portMappings": [{ "containerPort": 9080, "hostPort": 9080, "protocol": "tcp" }], "essential": true, "dependsOn": [{ "containerName": "envoy", "condition": "HEALTHY" }] }

Envoy 容器定义

您的亚马逊 ECS 任务定义必须包含 App Mesh Envoy 容器镜像。

  • 全部支持的除此之外的地区me-south-1,ap-east-1,ap-southeast-3,eu-south-1,以及af-south-1. 你可以更换区域代码与除此之外的任何地区me-south-1,ap-east-1,ap-southeast-3,eu-south-1,以及af-south-1.

    840364872350.dkr.ecr.region-code.amazonaws.com/aws-appmesh-envoy:v1.23.1.0-prod
  • me-south-1 地区:

    772975370895.dkr.ecr.me-south-1.amazonaws.com/aws-appmesh-envoy:v1.23.1.0-prod
  • ap-east-1 地区:

    856666278305.dkr.ecr.ap-east-1.amazonaws.com/aws-appmesh-envoy:v1.23.1.0-prod
  • ap-southeast-3 地区:

    909464085924.dkr.ecr.ap-southeast-3.amazonaws.com/aws-appmesh-envoy:v1.23.1.0-prod
  • eu-south-1 地区:

    422531588944.dkr.ecr.eu-south-1.amazonaws.com/aws-appmesh-envoy:v1.23.1.0-prod
  • af-south-1 地区:

    924023996002.dkr.ecr.af-south-1.amazonaws.com/aws-appmesh-envoy:v1.23.1.0-prod
  • cn-north-1 地区:

    919366029133.dkr.ecr.cn-north-1.amazonaws.com.cn/aws-appmesh-envoy:v1.23.1.0-prod
  • cn-northwest-1 地区:

    919830735681.dkr.ecr.cn-northwest-1.amazonaws.com.cn/aws-appmesh-envoy:v1.23.1.0-prod
  • Public repository

    public.ecr.aws/appmesh/aws-appmesh-envoy:v1.23.1.0-prod
重要

仅支持 v1.9.0.0-prod 或更高版本与 App Mesh 一起使用。

在 Envoy 项目团队合并支持 App Mesh 的更改之前,必须使用 App Mesh Envoy 容器镜像。有关其他详细信息,请参阅GitHub 路线图问题.

以下示例中的所有属性都是必需的。某些属性值也是必需的,但某些属性值是可替换的

注意
  • Envoy 容器定义必须标记为 essential

  • 我们建议分配512CPU 单元,至少64Envoy 容器有 MiB 的内存。在 Fargate 上,你能设置的最低值是1024MiB 的内存。

  • Amazon ECS 服务的虚拟节点名称必须设置为APPMESH_RESOURCE_ARN属性。此属性需要版本1.15.0或更晚的 Envoy 图片。有关更多信息,请参阅 特使图片

  • user 设置的值必须与任务定义代理配置中的 IgnoredUID 值匹配。在此示例中,我们使用的是 1337.

  • 此处显示的运行状况检查等待 Envoy 容器正确启动,然后向 Amazon ECS 报告 Envoy 容器运行状况良好,可以启动应用程序容器。

  • 默认情况下,当 Envoy 在指标和跟踪中引用自身时,App Mesh 使用您在 APPMESH_RESOURCE_ARN 中指定的资源的名称。您可以通过使用自己的名称设置 APPMESH_RESOURCE_CLUSTER 环境变量来覆盖此行为。此属性需要版本1.15.0或更晚的 Envoy 图片。有关更多信息,请参阅 特使图片

以下代码显示 Envoy 容器定义示例。

{ "name": "envoy", "image": "840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy:v1.23.1.0-prod", "essential": true, "environment": [{ "name": "APPMESH_RESOURCE_ARN", "value": "arn:aws:appmesh:us-west-2:111122223333:mesh/apps/virtualNode/serviceB" }], "healthCheck": { "command": [ "CMD-SHELL", "curl -s http://localhost:9901/server_info | grep state | grep -q LIVE" ], "startPeriod": 10, "interval": 5, "timeout": 2, "retries": 3 }, "user": "1337" }

示例任务定义

以下示例 Amazon ECS 任务定义显示了如何将上面的示例合并到任务定义中taskB. 提供了使用或不使用 Amazon ECS 启动类型为两种 Amazon ECS 启动类型创建任务的示例Amazon X-Ray. 可根据需要更改可替换的 值,为此场景中名为 taskBv2taskA 的任务创建任务定义。用您的网格名称和虚拟节点名称替换 APPMESH_RESOURCE_ARN 值,并用您的应用程序侦听的端口列表替换代理配置 AppPorts 值。默认情况下,当 Envoy 在指标和跟踪中引用自身时,App Mesh 使用您在 APPMESH_RESOURCE_ARN 中指定的资源的名称。您可以通过使用自己的名称设置 APPMESH_RESOURCE_CLUSTER 环境变量来覆盖此行为。以下示例中的所有属性都是必需的。某些属性值也是必需的,但某些属性值是可替换的

如果您正在按证书部分所述运行 Amazon ECS 任务,则需要添加现有的任务 IAM 角色,举个例子。

重要

Fargate 必须使用大于 1024 的端口值。

例 亚马逊 ECS 任务定义的 JSON-Fargate 启动类型

{ "family" : "taskB", "memory" : "1024", "cpu" : "0.5 vCPU", "proxyConfiguration" : { "containerName" : "envoy", "properties" : [ { "name" : "ProxyIngressPort", "value" : "15000" }, { "name" : "AppPorts", "value" : "9080" }, { "name" : "EgressIgnoredIPs", "value" : "169.254.170.2,169.254.169.254" }, { "name": "EgressIgnoredPorts", "value": "22" }, { "name" : "IgnoredUID", "value" : "1337" }, { "name" : "ProxyEgressPort", "value" : "15001" } ], "type" : "APPMESH" }, "containerDefinitions" : [ { "name" : "appName", "image" : "appImage", "portMappings" : [ { "containerPort" : 9080, "protocol" : "tcp" } ], "essential" : true, "dependsOn" : [ { "containerName" : "envoy", "condition" : "HEALTHY" } ] }, { "name" : "envoy", "image" : "840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy:v1.23.1.0-prod", "essential" : true, "environment" : [ { "name" : "APPMESH_VIRTUAL_NODE_NAME", "value" : "mesh/apps/virtualNode/serviceB" } ], "healthCheck" : { "command" : [ "CMD-SHELL", "curl -s http://localhost:9901/server_info | grep state | grep -q LIVE" ], "interval" : 5, "retries" : 3, "startPeriod" : 10, "timeout" : 2 }, "memory" : "500", "user" : "1337" } ], "requiresCompatibilities" : [ "FARGATE" ], "taskRoleArn" : "arn:aws:iam::123456789012:role/ecsTaskRole", "executionRoleArn" : "arn:aws:iam::123456789012:role/ecsTaskExecutionRole", "networkMode" : "awsvpc" }

例 Amazon ECS 任务定义的 JSONAmazon X-Ray-Fargate 启动类型

X-Ray 允许您收集有关应用程序所服务的请求的数据,并提供可用于可视化流量的工具。使用 Envoy 的 X-Ray 驱动程序使 Envoy 能够向 X-Ray 报告跟踪信息 您可以使用以下方法启用 X-Ray 跟踪特使配置. 根据配置,Envoy 将跟踪数据发送到以 A 模式运行的 X-Ray 守护进程边车容器和守护程序将跟踪转发给 X-Ray 服务。一旦跟踪信息发布到 X-Ray,则可以使用 X-Ray 控制台可视化服务调用图和请求跟踪详细信息。以下 JSON 表示启用 X-Ray 集成的任务定义。

{ "family" : "taskB", "memory" : "1024", "cpu" : "512", "proxyConfiguration" : { "containerName" : "envoy", "properties" : [ { "name" : "ProxyIngressPort", "value" : "15000" }, { "name" : "AppPorts", "value" : "9080" }, { "name" : "EgressIgnoredIPs", "value" : "169.254.170.2,169.254.169.254" }, { "name": "EgressIgnoredPorts", "value": "22" }, { "name" : "IgnoredUID", "value" : "1337" }, { "name" : "ProxyEgressPort", "value" : "15001" } ], "type" : "APPMESH" }, "containerDefinitions" : [ { "name" : "appName", "image" : "appImage", "portMappings" : [ { "containerPort" : 9080, "protocol" : "tcp" } ], "essential" : true, "dependsOn" : [ { "containerName" : "envoy", "condition" : "HEALTHY" } ] }, { "name" : "envoy", "image" : "840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy:v1.23.1.0-prod", "essential" : true, "environment" : [ { "name" : "APPMESH_VIRTUAL_NODE_NAME", "value" : "mesh/apps/virtualNode/serviceB" }, { "name": "ENABLE_ENVOY_XRAY_TRACING", "value": "1" } ], "healthCheck" : { "command" : [ "CMD-SHELL", "curl -s http://localhost:9901/server_info | grep state | grep -q LIVE" ], "interval" : 5, "retries" : 3, "startPeriod" : 10, "timeout" : 2 }, "memory" : "500", "user" : "1337" }, { "name" : "xray-daemon", "image" : "amazon/aws-xray-daemon", "user" : "1337", "essential" : true, "cpu" : "32", "memoryReservation" : "256", "portMappings" : [ { "containerPort" : 2000, "protocol" : "udp" } ] } ], "requiresCompatibilities" : [ "FARGATE" ], "taskRoleArn" : "arn:aws:iam::123456789012:role/ecsTaskRole", "executionRoleArn" : "arn:aws:iam::123456789012:role/ecsTaskExecutionRole", "networkMode" : "awsvpc" }

例 亚马逊 ECS 任务定义的 JSON-EC2 启动类型

{ "family": "taskB", "memory": "256", "proxyConfiguration": { "type": "APPMESH", "containerName": "envoy", "properties": [ { "name": "IgnoredUID", "value": "1337" }, { "name": "ProxyIngressPort", "value": "15000" }, { "name": "ProxyEgressPort", "value": "15001" }, { "name": "AppPorts", "value": "9080" }, { "name": "EgressIgnoredIPs", "value": "169.254.170.2,169.254.169.254" }, { "name": "EgressIgnoredPorts", "value": "22" } ] }, "containerDefinitions": [ { "name": "appName", "image": "appImage", "portMappings": [ { "containerPort": 9080, "hostPort": 9080, "protocol": "tcp" } ], "essential": true, "dependsOn": [ { "containerName": "envoy", "condition": "HEALTHY" } ] }, { "name": "envoy", "image": "840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy:v1.23.1.0-prod", "essential": true, "environment": [ { "name": "APPMESH_VIRTUAL_NODE_NAME", "value": "mesh/apps/virtualNode/serviceB" } ], "healthCheck": { "command": [ "CMD-SHELL", "curl -s http://localhost:9901/server_info | grep state | grep -q LIVE" ], "startPeriod": 10, "interval": 5, "timeout": 2, "retries": 3 }, "user": "1337" } ], "requiresCompatibilities" : [ "EC2" ], "taskRoleArn" : "arn:aws:iam::123456789012:role/ecsTaskRole", "executionRoleArn" : "arn:aws:iam::123456789012:role/ecsTaskExecutionRole", "networkMode": "awsvpc" }

例 Amazon ECS 任务定义的 JSONAmazon X-Ray-EC2 启动类型

{ "family": "taskB", "memory": "256", "cpu" : "1024", "proxyConfiguration": { "type": "APPMESH", "containerName": "envoy", "properties": [ { "name": "IgnoredUID", "value": "1337" }, { "name": "ProxyIngressPort", "value": "15000" }, { "name": "ProxyEgressPort", "value": "15001" }, { "name": "AppPorts", "value": "9080" }, { "name": "EgressIgnoredIPs", "value": "169.254.170.2,169.254.169.254" }, { "name": "EgressIgnoredPorts", "value": "22" } ] }, "containerDefinitions": [ { "name": "appName", "image": "appImage", "portMappings": [ { "containerPort": 9080, "hostPort": 9080, "protocol": "tcp" } ], "essential": true, "dependsOn": [ { "containerName": "envoy", "condition": "HEALTHY" } ] }, { "name": "envoy", "image": "840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy:v1.23.1.0-prod", "essential": true, "environment": [ { "name": "APPMESH_VIRTUAL_NODE_NAME", "value": "mesh/apps/virtualNode/serviceB" }, { "name": "ENABLE_ENVOY_XRAY_TRACING", "value": "1" } ], "healthCheck": { "command": [ "CMD-SHELL", "curl -s http://localhost:9901/server_info | grep state | grep -q LIVE" ], "startPeriod": 10, "interval": 5, "timeout": 2, "retries": 3 }, "user": "1337" }, { "name": "xray-daemon", "image": "amazon/aws-xray-daemon", "user": "1337", "essential": true, "cpu": 32, "memoryReservation": 256, "portMappings": [ { "containerPort": 2000, "protocol": "udp" } ] } ], "requiresCompatibilities" : [ "EC2" ], "taskRoleArn" : "arn:aws:iam::123456789012:role/ecsTaskRole", "executionRoleArn" : "arn:aws:iam::123456789012:role/ecsTaskExecutionRole", "networkMode": "awsvpc" }

高级主题

使用App Mesh 进行金丝雀部署

Canary 部署和发布可帮助您在旧版本的应用程序和新部署的版本之间切换流量。它还监控新部署版本的运行状况。如果新版本有任何问题,Canary 部署可以自动将流量切换回旧版本。Canary 部署使您能够在应用程序版本之间切换流量,同时获得更多控制。

有关如何使用 App Mesh 为 App Mesh 对Amazon ECS 实施金丝雀部署的更多信息,请参阅使用 App Mesh 为 Amazon ECS 创建包含金丝雀部署的管道

注意

有关 App Mesh 的更多示例和演练,请参阅App Mesh 示例存储库.