

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

# 虚拟节点
<a name="virtual_nodes"></a>

**重要**  
终止支持通知：2026 年 9 月 30 日， AWS 将停止对的支持。 AWS App Mesh 2026 年 9 月 30 日之后，您将无法再访问 AWS App Mesh 控制台或 AWS App Mesh 资源。有关更多信息，请访问此博客文章[从迁移 AWS App Mesh 到 Amazon ECS Service Connect](https://aws.amazon.com/blogs/containers/migrating-from-aws-app-mesh-to-amazon-ecs-service-connect)。

虚拟节点充当特定任务组的逻辑指针，如 Amazon ECS 服务或 Kubernetes 部署。当您创建虚拟节点时，必须为任务组指定服务发现方法。您的虚拟节点预计的任何入站流量被指定为*侦听器*。虚拟节点向其发送出站流量的任何虚拟服务都被指定为*后端*。

新虚拟节点的响应元数据包含与该虚拟节点关联的 Amazon 资源名称 (ARN)。在 Amazon ECS 任务定义或容器组 (pod) 规范中将此值设置为任务组的 Envoy 代理容器的 `APPMESH_RESOURCE_ARN` 环境变量。例如，值可能为 `arn:aws:appmesh:us-west-2:111122223333:mesh/myMesh/virtualNode/myVirtualNode`。它随后将映射到 `node.id` 和 `node.cluster` Envoy 参数。在设置该变量时，您必须使用 `1.15.0` 或更高版本的 Envoy 映像。有关 App Mesh Envoy 变量的更多信息，请参阅 [Envoy 镜像](envoy.md)。

**注意**  
默认情况下，当 Envoy 在指标和跟踪中引用自身时，App Mesh 使用您在 `APPMESH_RESOURCE_ARN` 中指定的资源的名称。您可以通过使用自己的名称设置 `APPMESH_RESOURCE_CLUSTER` 环境变量来覆盖此行为。

## 创建虚拟节点
<a name="vn-create-virtual-node"></a>

------
#### [ AWS 管理控制台 ]

**要使用创建虚拟节点 AWS 管理控制台**

1. 打开 App Mesh 控制台，网址为[https://console.aws.amazon.com/appmesh/](https://console.aws.amazon.com/appmesh/)。

1. 选择要在其中创建虚拟节点的网格。列出了您拥有的所有网格以及已与您[共享](sharing.md)的所有网格。

1. 在左侧导航中选择**虚拟节点**。

1. 选择**创建虚拟节点**，然后为您的虚拟节点指定设置。

1. 对于**虚拟节点名称**，输入虚拟节点名称。

1. 对于**服务发现方法**，选择以下选项之一：
   + **DNS**-指定虚拟节点所代表的实际服务的 **DNS 主机名**。Envoy 代理部署在亚马逊 VPC 中。代理向为 VPC 配置的 DNS 服务器发送域名解析请求。如果主机名解析，则 DNS 服务器返回一个或多个 IP 地址。有关 VPC DNS 设置的更多信息，请参阅[将 DNS 与您的 VPC 一起使用](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html)。对于 **DNS 响应类型**（可选），指定 DNS 解析器返回的端点类型。**负载均衡器**表示 DNS 解析器返回一组负载均衡的端点。**端点**意味着 DNS 解析器正在返回所有端点。默认情况下，假定响应类型为 **负载均衡器**。
**注意**  
如果您使用 **Route53**，则需要使用**负载均衡器**。
   + **AWS Cloud Map**— 指定现有的**服务名称**和 HTTP **命名空间**。或者，您也可以通过选择**添加行**并指定**键**和**值**来指定 App Mesh 可以查询 AWS Cloud Map 的属性。只有匹配所有指定 key/value 对的实例才会被返回。要使用 AWS Cloud Map，您的账户必须具有`AWSServiceRoleForAppMesh`[服务相关角色](using-service-linked-roles.md)。有关的更多信息 AWS Cloud Map，请参阅《[AWS Cloud Map 开发人员指南》](https://docs.aws.amazon.com/cloud-map/latest/dg/)。
   + **无**— 如果您的虚拟节点不希望任何入口流量，请选择该项。

1. 

**IP 版本首选项**

   通过切换**覆盖默认 IP 版本行为，控制网格内的流量应使用哪个 IP 版本**。默认情况下，App Mesh 使用各种 IP 版本。
**注意**  
在虚拟节点上设置 IP 首选项只会覆盖为该特定节点上的网格设置的 IP 首选项。
   + 默认
     + Envoy 的 DNS 解析器优先使用 `IPv6` 并在必要时回退到 `IPv4`。
     +  AWS Cloud Map 如果有的`IPv4`话，我们会使用返回的地址，然后回过头来使用该`IPv6`地址。
     + 为本地应用程序创建的端点使用 `IPv4` 地址。
     + Envoy 侦听器绑定到所有 `IPv4` 地址。
   + IPv6 首选
     + Envoy 的 DNS 解析器优先使用 `IPv6` 并在必要时回退到 `IPv4`。
     + 返回的地`IPv6`址将在可用 AWS Cloud Map 时使用，然后回退为使用该`IPv4`地址
     + 为本地应用程序创建的端点使用 `IPv6` 地址。
     + Envoy 侦听器绑定到所有 `IPv4` 和 `IPv6` 地址。
   + IPv4 首选
     + Envoy 的 DNS 解析器优先使用 `IPv4` 并在必要时回退到 `IPv6`。
     +  AWS Cloud Map 如果有的`IPv4`话，我们会使用返回的地址，然后回过头来使用该`IPv6`地址。
     + 为本地应用程序创建的端点使用 `IPv4` 地址。
     + Envoy 侦听器绑定到所有 `IPv4` 和 `IPv6` 地址。
   + IPv6 只有
     + Envoy 的 DNS 解析器仅使用 `IPv6`。
     + 仅使用返回`IPv6` AWS Cloud Map 的地址。如果 AWS Cloud Map 返回 `IPv4` 地址，则不使用 IP 地址，并将空结果返回给 Envoy。
     + 为本地应用程序创建的端点使用 `IPv6` 地址。
     + Envoy 侦听器绑定到所有 `IPv4` 和 `IPv6` 地址。
   + IPv4 只有
     + Envoy 的 DNS 解析器仅使用 `IPv4`。
     + 仅使用返回`IPv4` AWS Cloud Map 的地址。如果 AWS Cloud Map 返回 `IPv6` 地址，则不使用 IP 地址，并将空结果返回给 Envoy。
     + 为本地应用程序创建的端点使用 `IPv4` 地址。
     + Envoy 侦听器绑定到所有 `IPv4` 和 `IPv6` 地址。

1. 

**（可选）**客户端策略默认值** - 配置与后端虚拟服务通信时的默认要求。**
**注意**  
如果要为现有虚拟节点启用传输层安全性协议 (TLS)，则建议您创建一个新的虚拟节点，来代表与现有虚拟节点相同的服务，以便在其上启用 TLS。然后使用虚拟路由器和路由逐渐将流量转移到新的虚拟节点。有关创建路由和调整过渡权重的更多信息，请参阅 [Routes](routes.md)。如果您使用 TLS 更新现有提供流量的虚拟节点，则下游客户端 Envoy 代理可能会在您更新的虚拟节点的 Envoy 代理收到证书之前收到 TLS 验证上下文。这可能会导致下游 Envoy 代理上出现 TLS 协商错误。
必须为使用由后端服务的虚拟节点表示的应用程序部署的 Envoy 代理启用[代理授权](proxy-authorization.md)。我们建议您在启用代理授权时，将访问权限限制为仅访问该虚拟节点正在与之通信的虚拟节点。
   + （可选）如果要求虚拟节点使用传输层安全性协议 (TLS) 与所有后端通信，请选择**强制使用 TLS**。
   + （可选）如果您只想要求对一个或多个特定端口使用 TLS，请在**端口**中输入一个数字。要添加其他端口，请选择**添加端口**。如果您未指定任何端口，则会对所有端口强制执行 TLS。
   + 对于**验证方法**，选择下列选项之一。您指定的证书必须已经存在且符合特定要求。有关更多信息，请参阅 [证书要求](tls.md#virtual-node-tls-prerequisites)。
     + **AWS 私有证书颁发机构**托管 — 选择一个或多个现有**证书**。有关使用带有 ACM 证书加密的示例应用程序部署网格的完整演练，请参阅在启用 Certificate M [anager 的情况下配置 TLS](https://github.com/aws/aws-app-mesh-examples/tree/main/walkthroughs/tls-with-acm)。 end-to-end AWS GitHub
     + **Envoy 密钥发现服务 (SDS)** 托管 — 输入 Envoy 将使用密钥发现服务获取的密钥名称。
     + **本地文件托管** – 指定 Envoy 部署所在文件系统上的**证书链**文件的路径。有关使用本地文件加密的示例应用程序部署网格的完整演练，请参阅使用[文件提供的 TLS 证书配置 TLS](https://github.com/aws/aws-app-mesh-examples/tree/main/walkthroughs/howto-tls-file-provided) GitHub。 end-to-end
   + （可选）输入**主题备用名称**。要添加其他内容 SANs，请选择**添加 SAN**。 SANs 必须采用 FQDN 或 URI 格式。
   + （可选）选择**提供客户端证书**和以下选项之一，以便在服务器请求客户端证书时提供该证书并启用双向 TLS 身份验证。要了解有关双向 TLS 的更多信息，请参阅 App Mesh [双向 TLS 身份验证](https://docs.aws.amazon.com/app-mesh/latest/userguide/mutual-tls.html)文档。
     + **Envoy 密钥发现服务 (SDS)** 托管 — 输入 Envoy 将使用密钥发现服务获取的密钥名称。
     + **本地文件托管** - 指定 Envoy 部署所在文件系统上的**证书链**文件和**私钥**的路径。

1. 

**（可选）**服务后端** - 指定虚拟节点将与之通信的 App Mesh 虚拟服务。**
   + 输入您的虚拟节点与之通信的虚拟服务的 App Mesh 虚拟服务名称或完整 Amazon 资源名称 (ARN)。
   + （可选）如果要为后端设置唯一的 TLS 设置，请选择 **TLS 设置**，然后选择**覆盖默认值**。
     + （可选）如果要求虚拟节点使用 TLS 与所有后端通信，请选择**强制使用 TLS**。
     + （可选）如果您只想要求对一个或多个特定端口使用 TLS，请在**端口**中输入一个数字。要添加其他端口，请选择**添加端口**。如果您未指定任何端口，则会对所有端口强制执行 TLS。
     + 对于**验证方法**，选择下列选项之一。您指定的证书必须已经存在且符合特定要求。有关更多信息，请参阅 [证书要求](tls.md#virtual-node-tls-prerequisites)。
       + **AWS 私有证书颁发机构**托管 — 选择一个或多个现有**证书**。
       + **Envoy 密钥发现服务 (SDS)** 托管 — 输入 Envoy 将使用密钥发现服务获取的密钥名称。
       + **本地文件托管** – 指定 Envoy 部署所在文件系统上的**证书链**文件的路径。
     + （可选）输入**主题备用名称**。要添加其他内容 SANs，请选择**添加 SAN**。 SANs必须采用 FQDN 或 URI 格式。
     + （可选）选择**提供客户端证书**和以下选项之一，以便在服务器请求客户端证书时提供该证书并启用双向 TLS 身份验证。要了解有关双向 TLS 的更多信息，请参阅 App Mesh [双向 TLS 身份验证](https://docs.aws.amazon.com/app-mesh/latest/userguide/mutual-tls.html)文档。
       + **Envoy 密钥发现服务 (SDS)** 托管 — 输入 Envoy 将使用密钥发现服务获取的密钥名称。
       + **本地文件托管** — 指定 Envoy 部署所在文件系统上的**证书链**文件和**私钥**的路径。
   + 要添加其他后端，请选择**添加后端**。

1. （可选）**日志记录**

   要配置日志记录，请输入您希望 Envoy 要使用的 HTTP 访问日志路径。我们推荐使用该`/dev/stdout`路径，以便您可以使用 Docker 日志驱动程序将您的 Envoy 日志导出到诸如 Amazon Lo CloudWatch gs 之类的服务。
**注意**  
日志必须仍由您应用程序中的代理进行接收并发送至目标。此文件路径仅指示 Envoy 要发送日志的位置。

1. **侦听器配置**

   侦听器支持`HTTP`、`HTTP/2`、`GRPC` 和 `TCP`协议。不支持 `HTTPS`。

   1. 如果您的虚拟节点需要入站流量，请为**侦听器**指定**端口**和**协议**。**http** 侦听器允许连接转换到 websockets。您可以单击**添加侦听器**来添加多个侦听器。**移除**按钮将移除该侦听器。

   1. 

**（可选）**启用连接池****

      连接池限制 Envoy 可以同时与本地应用程序集群建立的连接数量。它旨在保护您的本地应用程序免受连接不堪重负，并允许您根据应用程序的需求调整流量整形。

      您可以为虚拟节点侦听器配置目标端连接池设置。App Mesh 默认将客户端连接池设置为无限，从而简化了网格配置。
**注意**  
连接池和端口映射协议必须相同。如果您的侦听器协议为 tcp，则仅指定 maxConnections。如果您的侦听器协议为 grpc 或 http2，则仅指定 maxRequests。如果您的监听器协议是 http，则可以同时指定 maxConnections 和。 maxPendingRequests
      + 对于**最大连接数**，请指定最大出站连接数。
      + （可选）在**最大待处理请求数**中，指定在达到**最大连接数**之后，Envoy 队列中将排列的溢出请求数。默认值为 `2147483647`。

   1. 

**（可选）**启用异常值检测****

      应用于客户端 Envoy 的异常值检测允许客户端对观察到的已知不良故障的连接立即采取行动。它是一种断路器实现形式，用于跟踪上游服务中各个主机的运行状况。

      异常值检测会动态确定上游集群中端点的性能是否与其他集群中的端点不同，并将其从运行正常的负载平衡集中移除。
**注意**  
要有效地为服务器虚拟节点配置异常值检测，该虚拟节点的服务发现方法可以 AWS Cloud Map 是 DNS，响应类型字段设置为`ENDPOINTS`。如果您使用响应类型为 DNS 服务发现方法 `LOADBALANCER`，则 Envoy 代理只会选择一个 IP 地址来路由到上游服务。这会使从一组主机中弹出运行状况不佳的主机的异常值检测行为无效。有关 Envoy 代理与服务发现类型相关的行为的更多详细信息，请参阅服务发现方法部分。
      + 对于**服务器错误**，请指定弹出所需的连续 5xx 错误数。
      + 对于**异常值检测间隔**，请指定弹射扫描分析之间的时间间隔和单位。
      + 对于**基本摘除持续时间**，指定摘除主机的基本时间和单位。
      + 对于**摘除百分比**，指定负载平衡池中可摘除的主机的最大百分比。

   1. 

**（可选）**启用运行状况检查** — 配置运行状况检查策略的设置。**

      运行状况检查策略是可选的，但是如果您为运行状况策略指定任何值，则必须为**正常阈值、运行状况****检查间隔、运行状况检查****协议**、**超时时间**和**运行状况不佳阈值**指定值。
      + 对于 **运行状况检查协议**，请选择一个协议。如果选择 **grpc**，您的服务必须符合 [GRPC 运行状况检查协议](https://github.com/grpc/grpc/blob/master/doc/health-checking.md)。
      + 对于**运行状况检查端口**，指定应对其运行状况检查的端口。
      + 对于**正常阈值**，指定在声明侦听器运行状况良好之前，必须出现的连续成功的运行状况检查次数。
      + 对于**运行状况检查间隔**，指定执行每次运行状况检查间隔的时间（毫秒）。
      + 对于**路径**，指定运行状况检查请求的目标路径。仅当**运行状况检查协议**为 `http` 或 `http2` 时才使用此值。对于其他协议，该值将被忽略。
      + 对于**超时周期**，指定接收来自运行状况检查的响应时要等待的时间（毫秒）。
      + 对于**不正常阈值**，指定在声明侦听器运行状况不正常之前，必须出现的连续失败的运行状况检查次数。

   1. 

**（可选）**启用 TLS 终止** — 配置其他虚拟节点如何使用 TLS 与该虚拟节点通信。**
      + 对于**模式**，选择要在侦听器上配置 TLS 的模式。
      + 对于 **Certificate method**，执行下列操作之一：证书必须满足具体要求。有关更多信息，请参阅 [证书要求](tls.md#virtual-node-tls-prerequisites)。
        + **AWS Certificate Manager 托管**-选择现有**证书**。
        + **Envoy 密钥发现服务 (SDS)** 托管 — 输入 Envoy 将使用密钥发现服务获取的密钥名称。
        + **本地文件托管** — 在部署 Envoy 代理的文件系统上指定**证书链**文件的路径以及**私钥**。
      + （可选）选择**需要客户端证书**和以下选项之一，以便在客户端提供证书时启用双向 TLS 身份验证。要了解有关双向 TLS 的更多信息，请参阅 App Mesh [双向 TLS 身份验证](https://docs.aws.amazon.com/app-mesh/latest/userguide/mutual-tls.html)文档。
        + **Envoy 密钥发现服务 (SDS)** 托管 — 输入 Envoy 将使用密钥发现服务获取的密钥名称。
        + **本地文件托管** – 指定 Envoy 部署所在文件系统上的**证书链**文件的路径。
      + （可选）输入**主题备用名称**。要添加其他内容 SANs，请选择**添加 SAN**。 SANs必须采用 FQDN 或 URI 格式。

   1. 

**（可选）**超时****
**注意**  
 如果您指定的超时时间大于默认值，请务必设置虚拟路由器和超时时间大于默认值的路由。但是，如果您将超时时间缩短到低于默认值的值，则可以选择更新 Route 的超时时间。有关更多信息，请参阅[路由](https://docs.aws.amazon.com/app-mesh/latest/userguide/routes.html)。
      + **请求超时** ** — 如果您为侦听器的协议选择了 **grpc**、**http** 或 **http2**，则可以指定请求超时。**默认值为 15 秒。`0` 值禁用超时。
      + **空闲时长** — 您可以为任何侦听器协议指定空闲时长。默认值为 300 秒。

1. 选择**创建虚拟节点**以完成。

------
#### [ AWS CLI ]

**使用 AWS CLI创建虚拟节点。**

使用以下命令和输入 JSON 文件创建使用 DNS 进行服务发现的虚拟节点（用您自己的*red*值替换值）：

1. 

   ```
   aws appmesh create-virtual-node \
   --cli-input-json file://create-virtual-node-dns.json
   ```

1.  create-virtual-node-dns.json **示例**的内容：

   ```
   {
       "meshName": "meshName",
       "spec": {
           "listeners": [
               {
                   "portMapping": {
                       "port": 80,
                       "protocol": "http"
                   }
               }
           ],
           "serviceDiscovery": {
               "dns": {
                   "hostname": "serviceBv1.svc.cluster.local"
               }
           }
       },
       "virtualNodeName": "nodeName"
   }
   ```

1. 输出示例：

   ```
   {
       "virtualNode": {
           "meshName": "meshName",
           "metadata": {
               "arn": "arn:aws:appmesh:us-west-2:210987654321:mesh/meshName/virtualNode/nodeName",
               "createdAt": "2022-04-06T09:12:24.348000-05:00",
               "lastUpdatedAt": "2022-04-06T09:12:24.348000-05:00",
               "meshOwner": "123456789012",
               "resourceOwner": "210987654321",
               "uid": "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE",
               "version": 1
           },
           "spec": {
               "listeners": [
                   {
                       "portMapping": {
                           "port": 80,
                           "protocol": "http"
                       }
                   }
               ],
               "serviceDiscovery": {
                   "dns": {
                       "hostname": "serviceBv1.svc.cluster.local"
                   }
               }
           },
           "status": {
               "status": "ACTIVE"
           },
           "virtualNodeName": "nodeName"
       }
   }
   ```

有关使用 for App Mesh 创建虚拟节点的更多信息，请参阅 AWS CLI 参考中的[create-virtual-node](https://docs.aws.amazon.com/cli/latest/reference/appmesh/create-virtual-node.html)命令。 AWS CLI 

------

## 删除虚拟节点
<a name="delete-virtual-node"></a>

**注意**  
如果虚拟节点在任何[路由](routes.md)中被指定为目标或在任何[虚拟服务](virtual_services.md)中指定为提供者，则无法将其删除。

------
#### [ AWS 管理控制台 ]

**要使用删除虚拟节点 AWS 管理控制台**

1. 打开 App Mesh 控制台，网址为[https://console.aws.amazon.com/appmesh/](https://console.aws.amazon.com/appmesh/)。

1. 选择要从中删除虚拟节点的虚拟网格。列出了您拥有的所有网格以及已与您[共享](sharing.md)的所有网格。

1. 在左侧导航中选择**虚拟节点**。

1. 在**虚拟节点**表中，选择要删除的虚拟节点，然后选择**删除**。要删除虚拟节点，您的账户 ID 必须列在虚拟节点的**网格所有者****或资源所有者**列中。

1. 在确认框中，键入 **delete**，然后选择**删除**。

------
#### [ AWS CLI ]

**要使用删除虚拟节点 AWS CLI**

1. 使用以下命令删除您的虚拟节点（用您自己的*red*值替换这些值）：

   ```
   aws appmesh delete-virtual-node \
        --mesh-name meshName \
        --virtual-node-name nodeName
   ```

1. 输出示例：

   ```
   {
       "virtualNode": {
           "meshName": "meshName",
           "metadata": {
               "arn": "arn:aws:appmesh:us-west-2:210987654321:mesh/meshName/virtualNode/nodeName",
               "createdAt": "2022-04-06T09:12:24.348000-05:00",
               "lastUpdatedAt": "2022-04-07T11:03:48.120000-05:00",
               "meshOwner": "123456789012",
               "resourceOwner": "210987654321",
               "uid": "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE",
               "version": 2
           },
           "spec": {
               "backends": [],
               "listeners": [
                   {
                       "portMapping": {
                           "port": 80,
                           "protocol": "http"
                       }
                   }
               ],
               "serviceDiscovery": {
                   "dns": {
                       "hostname": "serviceBv1.svc.cluster.local"
                   }
               }
           },
           "status": {
               "status": "DELETED"
           },
           "virtualNodeName": "nodeName"
       }
   }
   ```

有关使用 for App Mesh 删除虚拟节点的更多信息，请参阅 AWS CLI 参考中的[delete-virtual-node](https://docs.aws.amazon.com/cli/latest/reference/appmesh/delete-virtual-node.html)命令。 AWS CLI 

------