App Mesh 最佳实践 - AWS App Mesh

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

App Mesh 最佳实践

为了实现计划部署期间和某些主机计划外丢失期间零失败请求的目标,本主题中的最佳实践实施以下策略:

为显著减少或消除故障,我们建议您在以下所有实践中实施这些建议。

通过重试来检测所有路由

将所有虚拟服务配置为使用虚拟路由器,并为所有路由设置默认重试策略。这可通过重新选择主机并发送新请求来缓解请求失败的情况。对于重试策略,我们建议在支持重试事件类型的每种路径类型中为 maxRetries 指定至少两个值,并为每种重试事件指定以下选项:

  • TCPconnection-error

  • HTTP 和 HTTP/2stream-error 以及 gateway-error

  • gRPCcancelled 以及 unavailable

其他重试事件可能不安全,需要根据具体情况考虑这些事件,例如:请求不具有幂等性。您需要考虑并测试 maxRetriesperRetryTimeout 的值,这些值获得请求延迟最大值(maxRetries * perRetryTimeout)与提高更多重试的成功率之间进行适当的权衡。此外,当 Envoy 尝试连接到已不存在的端点时,您应该预计该请求会消耗全部内容 perRetryTimeout。若想配置重试策略,请参阅 创建路由,然后选择要进行路由的协议。

注意

如果您在 2020 年 7 月 29 日当天或之后实施了路由,但没有指定重试策略,那么 App Mesh 可能会自动为您在 2020 年 7 月 29 日当天或之后创建的每条路径创建与之前策略相似的默认重试策略。有关更多信息,请参阅 默认路由重试策略

调整部署速度

使用滚动部署时,请降低总体部署速度。默认情况下,Amazon ECS 配置的部署策略至少针对 100% 的正常任务和 200% 的总任务。部署后,会导致两个高漂移点产生:

  • 在准备完成请求之前,Envoy 可以看到新任务 100% 规模的实例集(有关缓解措施,请参阅 实施容器运行状况检查)。

  • 任务终止期间,Envoy 可以看到旧任务 100% 规模的实例集。

配置这些部署限制后,容器编排工具可能会进入一种状态,它们会同时隐藏所有原目标,同时显示所有新目标。由于您的 Envoy 数据面板最终是一致的,这可能会导致数据面板中可见的目标集与编排工具的角度有所不同。为缓解这种情况,我们建议将正常运行的任务比例保持在至少 100%,但将总任务比例降至 125%。这可以减少分歧,提高重试的可靠性。我们建议针对不同的容器运行时系统使用以下设置。

Amazon ECS

如果您的服务所需计数为两个或三个,请将 maximumPercent 设置为 150%。否则,请将 maximumPercent 设置为 125%。

Kubernetes

配置您的部署 update strategy,设置 maxUnavailable 为 0% 和 maxSurge 25%。有关部署的更多信息,请参阅 Kubernetes 文档中的部署

在横向缩减之前先进行横向扩展

横向扩展和横向缩减均可能导致重试时请求失败。虽然有些任务建议可以缓解横向扩展情况,但横向缩减的唯一建议是最大限度地降低在任何时候横向缩减任务的百分比。我们建议您使用部署策略,在横向扩展旧任务或部署之前,先扩展新的 Amazon ECS 任务或 Kubernetes 部署。这种扩展策略可以降低横向缩减任务或部署的缩放百分比,同时保持相同的速度。这种做法适用于亚马逊 ECS 任务和 Kubernetes 部署。

实施容器运行状况检查

在纵向扩展场景中,Amazon ECS 任务中的容器可能会出现故障,且最初可能没有响应。对于不同的容器运行时系统,我们推荐以下建议:

Amazon ECS

为缓解这种情况,我们建议使用容器运行状况检查和容器依赖关系排序,以确保 Envoy 在任何需要出站网络连接的容器启动之前运行良好。要在任务定义中正确配置应用程序容器和 Envoy 容器,请参阅容器依赖关系

Kubernetes

没有,因为在 Kubernetes 的 App Mesh 控制器中注册和注销实例时,没有考虑 Kubernetes 的AWS Cloud Map存活性和就绪性探头。有关更多信息,请参阅 GitHub 问题 #132