虚拟网关 - AWS App Mesh

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

虚拟网关

虚拟网关允许网格外的资源与网格内的资源进行通信。虚拟网关代表在 Amazon ECS 服务、Kubernetes 服务或 Amazon EC2 实例中运行的某个 Envoy 代理。与虚拟节点(代表使用应用程序运行的 Envoy)不同,虚拟网关代表自己部署的 Envoy。

外部资源必须能够将 DNS 名称解析为分配给运行 Envoy 的服务或实例的 IP 地址。然后,Envoy 可以访问网格内部资源的所有 App Mesh 配置。在虚拟网关处理传入请求的配置是使用网关路由指定的。

重要

带有 HTTP 或 HTTP2 侦听器的虚拟网关将传入请求的主机名重写为网关路由目标虚拟服务的名称,默认情况下,网关路由中的匹配前缀将重写为 /。例如,如果您已将网关路由匹配前缀配置为 /chapter,如果传入请求是 /chapter/1,则请求将被重写为/1。要配置重写,请参阅网关路由中的创建网关路由部分。

创建虚拟网关时,不应配置proxyConfigurationuser

要完成端到端演练,请参阅配置入站网关

创建虚拟网关

注意

创建虚拟网关时,必须添加带有标签的命名空间选择器,以标识将网关路由与已创建的虚拟网关关联的命名空间列表。

AWS Management Console
使用 AWS Management Console 创建虚拟网关
  1. 打开 App Mesh 控制台,网址为 https://console.aws.amazon.com/appmesh/

  2. 选择要在其中创建虚拟网关。列出了您拥有的所有网格以及已与您共享的所有网格。

  3. 在左侧导航中选择虚拟网关

  4. 选择创建虚拟网关

  5. 对于虚拟网关名称,请输入虚拟网关的名称。

  6. (可选,但建议使用)配置客户端策略默认值

    1. (可选)如果您希望网关仅使用传输层安全性协议(TLS)与虚拟服务通信,请选择强制 TLS

    2. (可选)在端口中,指定一个或多个要与虚拟服务执行 TLS 通信的端口。

    3. 对于验证方法,选择下列选项之一。您指定的证书必须已存在且符合特定要求。有关更多信息,请参阅 证书要求

      • AWS Private Certificate Authority托管 - 选择一个或多个现有证书

      • Envoy 密钥发现服务 (SDS) 托管 – 输入 Envoy 使用密钥发现服务获取的密钥名称。

      • 本地文件托管 - 指定 Envoy 部署所在文件系统上的证书链文件的路径。

    4. (可选)输入主题备用名称。要添加其他 SAN,请选择添加 SAN。SAN 必须采用 FQDN 或 URI 格式。

    5. (可选)选择提供客户端证书和以下选项之一,以便在服务器请求客户端证书时提供该证书并启用双向 TLS 身份验证。要了解有关双向 TLS 的更多信息,请参阅 App Mesh 双向 TLS 身份验证文档。

      • Envoy 密钥发现服务 (SDS) 托管 – 输入 Envoy 使用密钥发现服务获取的密钥名称。

      • 本地文件托管 - 指定 Envoy 部署所在文件系统上的证书链文件和私钥的路径。有关使用本地文件加密的示例应用程序部署网格的完整端到端演练,请参阅 GitHub 上使用文件提供的 TLS 证书配置 TLS。

  7. (可选)要配置日志记录,请选择日志记录。输入您希望 Envoy 要使用的 HTTP 访问日志路径。建议您使用 /dev/stdout 路径,以便您可以使用 Docker 日志驱动程序来将 Envoy 日志导出至某个服务,如 Amazon CloudWatch Logs。

    注意

    日志必须仍由您应用程序中的代理进行接收并发送至目标。此文件路径仅指示 Envoy 要发送日志的位置。

  8. 配置侦听器

    1. 选择协议并指定 Envoy 侦听流量的端口http 侦听器允许连接转换到 websockets。您可以单击添加侦听器来添加多个侦听器。移按钮将移除该侦听器。

    2. (可选)启用连接池

      连接池限制虚拟网关 Envoy 可以同时建立的连接数。它旨在保护您的 Envoy 实例免受连接不堪重负,并允许您根据应用程序的需求调整流量整形。

      您可以为虚拟网关侦听器配置目标端连接池设置。App Mesh 默认将客户端连接池设置为无限,从而简化了网格配置。

      注意

      connectionPoolconnectionPool PortMapping 协议必须相同。如果您的侦听器协议为 grpchttp2,则仅指定 maxRequests。如果您的侦听器协议为 http,则可以同时指定 maxConnectionsmaxPendingRequests

      • 对于最大连接数,请指定最大出站连接数。

      • 对于最大请求数,指定可与虚拟网关 Envoy 建立的最大并行请求数。

      • (可选)在最大待处理请求数中,指定在达到最大连接数之后,Envoy 队列中排列的溢出请求数。默认值为 2147483647

    3. (可选)如果要为侦听器配置运行状况检查,请选择启用运行状况检查

      运行状况检查策略是可选的,但是如果您为运行状况策略指定任何值,则必须为正常阈值、运行状况检查间隔、运行状况检查协议超时时间运行状况不佳阈值指定值。

      • 对于 运行状况检查协议,请选择一个协议。如果选择 grpc,您的服务必须符合 GRPC 运行状况检查协议

      • 对于运行状况检查端口,指定应对其运行状况检查的端口。

      • 对于正常阈值,指定在声明侦听器运行状况良好之前,必须出现的连续成功的运行状况检查次数。

      • 对于运行状况检查间隔,指定执行每次运行状况检查间隔的时间(毫秒)。

      • 对于路径,指定运行状况检查请求的目标路径。仅当运行状况检查协议httphttp2 时才使用此值。其他协议将忽略此值。

      • 对于超时周期,指定接收来自运行状况检查的响应时要等待的时间(毫秒)。

      • 对于不正常阈值,指定在声明侦听器运行状况不正常之前,必须出现的连续失败的运行状况检查次数。

    4. (可选)如果要指定客户端是否使用 TLS 与此虚拟网关通信,请选择启用 TLS 终止

      • 对于模式,选择要在侦听器上配置 TLS 的模式。

      • 对于 Certificate method,执行下列操作之一:证书必须满足具体要求。有关更多信息,请参阅 证书要求

        • AWS Certificate Manager 托管 — 选择现有证书

        • Envoy 密钥发现服务 (SDS) 托管 – 输入 Envoy 使用密钥发现服务获取的密钥名称。

        • 本地文件托管 - 指定 Envoy 部署所在文件系统上的证书链私钥文件的路径。

      • (可选)如果客户端提供证书,请选择需要客户端证书和以下选项之一,以启用双向 TLS 身份验证。要了解有关双向 TLS 的更多信息,请参阅 App Mesh 双向 TLS 身份验证文档。

        • Envoy 密钥发现服务 (SDS) 托管 – 输入 Envoy 使用密钥发现服务获取的密钥名称。

        • 本地文件托管 - 指定 Envoy 部署所在文件系统上的证书链文件的路径。

      • (可选)输入主题备用名称。要添加其他 SAN,请选择添加 SAN。SAN 必须采用 FQDN 或 URI 格式。

  9. 选择创建虚拟网关以完成。

AWS CLI

使用 AWS CLI 创建虚拟网关。

使用以下命令创建虚拟网关并输入 JSON(用您自己的值替换红色值):

  1. aws appmesh create-virtual-gateway \ --mesh-name meshName \ --virtual-gateway-name virtualGatewayName \ --cli-input-json file://create-virtual-gateway.json
  2. create-virtual-gateway.json 示例的内容:

    { "spec": { "listeners": [ { "portMapping": { "port": 9080, "protocol": "http" } } ] } }
  3. 输出示例:

    { "virtualGateway": { "meshName": "meshName", "metadata": { "arn": "arn:aws:appmesh:us-west-2:123456789012:mesh/meshName/virtualGateway/virtualGatewayName", "createdAt": "2022-04-06T10:42:42.015000-05:00", "lastUpdatedAt": "2022-04-06T10:42:42.015000-05:00", "meshOwner": "123456789012", "resourceOwner": "123456789012", "uid": "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE", "version": 1 }, "spec": { "listeners": [ { "portMapping": { "port": 9080, "protocol": "http" } } ] }, "status": { "status": "ACTIVE" }, "virtualGatewayName": "virtualGatewayName" } }

有关使用AWS CLI 为 App Mesh 创建虚拟网关的更多信息,请参阅 AWS CLI 参考资料中的create-virtual-gateway 命令。

部署虚拟网关

部署仅包含 Envoy 容器的亚马逊 ECS 或 Kubernetes 服务。您也可以在亚马逊 EC2 实例上部署 Envoy 容器。有关更多信息,请参阅《App Mesh 和 Amazon EC2 入门》。有关如何在 Amazon ECS 上部署的更多信息,请参阅《App Mesh 和 Amazon ECS入门》《部署到 Kubernetes 的 AWS App Mesh 和 Kubernetes 入门》。您需要将 APPMESH_RESOURCE_ARN 环境变量设置为 mesh/mesh-name/virtualGateway/virtual-gateway-name,并且不得指定代理配置,这样代理的流量就不会被重定向到自身。默认情况下,当 Envoy 在指标和跟踪中引用自身时,App Mesh 使用您在 APPMESH_RESOURCE_ARN 中指定的资源的名称。您可以通过使用自己的名称设置 APPMESH_RESOURCE_CLUSTER 环境变量来覆盖此行为。

我们建议您部署容器的多个实例,并设置网络负载均衡器来对这些实例的流量进行负载均衡。负载均衡器的服务发现名称是您希望外部服务用来访问网格中的资源(例如 myapp .example.com)的名称。有关更多信息,请参阅创建网络负载均衡器 (Amazon ECS)、创建外部负载均衡器 (Kubernetes) 或教程:提高应用程序在 Amazon EC2 上的可用性。此外,您可以在我们的 App Mesh 示例中找到更多示例和演练。

启用代理授权。有关更多信息,请参阅 Envoy Proxy 授权

删除虚拟网关

AWS Management Console
要使用 AWS Management Console 删除虚拟网关
  1. 打开 App Mesh 控制台,网址为 https://console.aws.amazon.com/appmesh/

  2. 选择要从中删除虚拟网关的网格。列出了您拥有的所有网格以及已与您共享的所有网格。

  3. 在左侧导航中选择虚拟网关

  4. 选择要删除的虚拟网关,然后选择删除。如果虚拟网关有任何关联的网关路由,则无法将其删除。必须先删除所有关联的网关路由。您只能删除您的账户被列为资源所有者的虚拟网关。

  5. 在确认框中,键入 delete,然后选择删除

AWS CLI
要使用 AWS CLI 删除虚拟网关
  1. 使用以下命令删除您的虚拟网关(用您自己的值替换红色值):

    aws appmesh delete-virtual-gateway \ --mesh-name meshName \ --virtual-gateway-name virtualGatewayName
  2. 输出示例:

    { "virtualGateway": { "meshName": "meshName", "metadata": { "arn": "arn:aws:appmesh:us-west-2:123456789012:mesh/meshName/virtualGateway/virtualGatewayName", "createdAt": "2022-04-06T10:42:42.015000-05:00", "lastUpdatedAt": "2022-04-07T10:57:22.638000-05:00", "meshOwner": "123456789012", "resourceOwner": "123456789012", "uid": "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE", "version": 2 }, "spec": { "listeners": [ { "portMapping": { "port": 9080, "protocol": "http" } } ] }, "status": { "status": "DELETED" }, "virtualGatewayName": "virtualGatewayName" } }

有关使用 App Mesh 删除虚拟网关的更多信息,请参阅 AWS CLI 参考资料中的 delete-virtual-gateway 命令。AWS CLI