本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
AZ: Application Slowdown
您可以使用 “可用区:应用程序减速” 场景在单个可用区 (AZ) 内的资源之间引入额外的延迟。这种延迟会产生许多应用程序速度减慢的症状,即部分中断,有时被称为灰色故障。它会增加目标资源之间的网络流延迟。网络流量代表计算资源之间的流量,即在服务器、容器和服务之间传输请求、响应和其他通信的数据包。该场景可以帮助验证可观测性设置,调整警报阈值,发现应用程序对减速的敏感性,并练习关键的运营决策,例如AZ疏散。
默认情况下,该场景会将选定可用区内目标资源之间的 100% 网络流量增加 200 毫秒的延迟,持续时间为 30 分钟。您可以使用 AWS FIS 控制台中的编辑共享参数对话框在场景级别调整以下参数,然后将其应用于基础操作:
-
可用区-您可以选择场景中要损坏的可用区。
-
毫秒 (ms) 延迟-根据应用程序的灵敏度和需求进行调整。例如,您可以为更敏感的应用程序设置较低的延迟,也可以设置更高的延迟以测试超时处理。考虑使用当前应用程序延迟的倍数作为基准。
-
流量百分比-减少以损害部分流量。例如,您可以添加 200 毫秒的延迟,影响 25% 的网络流,以进行更微妙的测试。
-
持续时间-设置实验的运行时间。您可以缩短时间以加快测试速度,也可以运行更长的持续测试。例如,将持续时间设置为 2 小时,以测试受损条件下的恢复机制。
-
资源定位-您可以使用标签(用于 EC2 实例或 Fargate 上 EC2 的 ECS 任务)或标签(适用于开启的 EKS pod)来定义整个场景的目标资源。 EC2您可以指定自己的标签和标签,也可以使用场景中提供的默认值。如果您不想使用标签或标签,则可以通过指定其他参数来编辑目标资源的操作。
-
自定义-如果您不想定位 EC2 或 ECS 资源,则可以将操作保留为默认标签。实验找不到任何可以瞄准的资源,因此该操作将被跳过。但是,如果您不想以 EKS 资源为目标,则应将 EKS 操作和目标完全从场景中删除,因为它需要提供 EKS 集群标识符。要进行更精细的自定义,您可以直接修改实验模板中的单个操作。
操作
通过在网络流上引入额外的延迟,然后通过应用程序传播,以下操作共同帮助在单个可用区中创建应用程序速度减慢的许多症状。这些操作并行运行,默认情况下,每个操作都会增加 200 毫秒的延迟,持续 30 分钟。在这段时间之后,延迟恢复到正常水平。该场景至少需要以下一种资源类型才能运行: EC2 实例、ECS 任务或 EKS Pod。
ECS 网络延迟
AZ:应用程序减速包括 aws: ecs:,用于引task-network-latency入 EC S 任务的延迟。该操作的目标是所选可用区中的任务。默认情况下,它的目标任务的标签名AZApplicationSlowdown为,值为LatencyForECS。您可以用自己的标签替换默认标签,也可以将场景标签添加到任务中。如果未找到有效任务,则将跳过此操作。在 ECS 上运行实验之前,应按照 ECS 任务操作的设置步骤进行操作。
EKS 网络延迟
AZ:应用程序减速包括 aws: eks:,用于引入 EKS pod 的延迟。pod-network-latency该操作的目标是选定可用区中的 Pod。默认情况下,它的目标是集群中带有格式为 key=value 的标签的 pod。提供的默认标签是AZApplicationSlowdown=LatencyForEKS。你可以用自己的标签替换默认标签,也可以将此标签添加到你的 pod 中。如果未找到有效的 pod,则将跳过此操作。在 EKS 上运行实验之前,应按照 EK S pod 操作的设置步骤进行操作。
EC2 网络延迟
AZ:应用程序减速使用 a ws: ssm: send-command 操作来运行-Network-Laten cy-Sources 文档,为实例引入延AWSFIS-Run迟。 EC2 该操作的目标是所选可用区中的实例。默认情况下,它的目标实例的标签名AZApplicationSlowdown为,值为LatencyForEC2。您可以用自己的标签替换默认标签,也可以将此标签添加到您的实例中。如果未找到有效实例,则将跳过此操作。在运行 EC2 使用 SSM 的实验之前,您应该配置 AWS Systems Manager 代理。
限制
-
此场景不包括停止条件。应将适用于您应用程序的正确停止条件添加到实验模板中。
要求
-
向 AWS FIS 实验角色添加所需的权限。
-
您需要将选定可用区内以下 3 种类型中的任何一种中的一种或多种资源作为目标: EC2 实例、ECS 任务或 EKS Pod。
-
场景中的所有目标都必须位于同一 VPC 中。
Permissions
要运行此场景,您需要一个具有允许 FIS 代入角色的信任策略的 IAM 角色以及实验中目标资源类型的托管策略: EC2、ECS 和 EKS。当您从 AZ:应用程序减速场景中创建实验模板时,FIS 会使用信任策略和以下 AWS 托管策略为您创建角色:
如果您使用现有 IAM 角色运行 “AZ:应用程序减速” 场景,则可以附加以下策略来向 AWS FIS 授予必要的权限:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DescribeTasks", "Effect": "Allow", "Action": "ecs:DescribeTasks", "Resource": "*" }, { "Sid": "DescribeContainerInstances", "Effect": "Allow", "Action": "ecs:DescribeContainerInstances", "Resource": "arn:aws:ecs:*:*:container-instance/*/*" }, { "Sid": "DescribeInstances", "Effect": "Allow", "Action": "ec2:DescribeInstances", "Resource": "*" }, { "Sid": "DescribeSubnets", "Effect": "Allow", "Action": "ec2:DescribeSubnets", "Resource": "*" }, { "Sid": "DescribeCluster", "Effect": "Allow", "Action": "eks:DescribeCluster", "Resource": "arn:aws:eks:*:*:cluster/*" }, { "Sid": "TargetResolutionByTags", "Effect": "Allow", "Action": "tag:GetResources", "Resource": "*" }, { "Sid": "SendCommand", "Effect": "Allow", "Action": [ "ssm:SendCommand" ], "Resource": [ "arn:aws:ec2:*:*:instance/*", "arn:aws:ssm:*:*:managed-instance/*", "arn:aws:ssm:*:*:document/*" ] }, { "Sid": "ListCommands", "Effect": "Allow", "Action": [ "ssm:ListCommands" ], "Resource": "*" }, { "Sid": "CancelCommand", "Effect": "Allow", "Action": [ "ssm:CancelCommand" ], "Resource": "*" } ] }
场景内容
以下内容定义了场景。可以保存此 JSON,并使用 AWS create-experiment-template
{ "tags": { "Name": "AZ: Application Slowdown" }, "description": "Add latency between resources within a single AZ.", "actions": { "LatencyForEKS": { "actionId": "aws:eks:pod-network-latency", "parameters": { "delayMilliseconds": "200", "duration": "PT30M", "flowsPercent": "100", "interface": "DEFAULT", "kubernetesServiceAccount": "fis-service-account", "sources": "us-east-1a" }, "targets": { "Pods": "TargetsForEKS" } }, "LatencyForEC2": { "actionId": "aws:ssm:send-command", "parameters": { "duration": "PT30M", "documentArn": "arn:aws:ssm:us-east-1::document/AWSFIS-Run-Network-Latency-Sources", "documentParameters": "{\"DelayMilliseconds\":\"200\",\"Sources\":\"us-east-1a\",\"Interface\":\"DEFAULT\",\"TrafficType\":\"egress\",\"DurationSeconds\":\"1800\",\"FlowsPercent\":\"100\",\"InstallDependencies\":\"True\"}" }, "targets": { "Instances": "TargetsForEC2" } }, "LatencyForECS": { "actionId": "aws:ecs:task-network-latency", "parameters": { "delayMilliseconds": "200", "duration": "PT30M", "flowsPercent": "100", "installDependencies": "true", "sources": "us-east-1a", "useEcsFaultInjectionEndpoints": "true" }, "targets": { "Tasks": "TargetsForECS" }, "startAfter": [] } }, "targets": { "TargetsForEKS": { "parameters": { "availabilityZoneIdentifier": "us-east-1a", "clusterIdentifier": "", "namespace": "default", "selectorType": "labelSelector", "selectorValue": "AZApplicationSlowdown=LatencyForEKS" }, "resourceType": "aws:eks:pod", "selectionMode": "ALL" }, "TargetsForEC2": { "filters": [ { "path": "Placement.AvailabilityZone", "values": [ "us-east-1a" ] } ], "resourceTags": { "AZApplicationSlowdown": "LatencyForEC2" }, "resourceType": "aws:ec2:instance", "selectionMode": "ALL" }, "TargetsForECS": { "filters": [ { "path": "AvailabilityZone", "values": [ "us-east-1a" ] } ], "resourceTags": { "AZApplicationSlowdown": "LatencyForECS" }, "resourceType": "aws:ecs:task", "selectionMode": "ALL" } }, "experimentOptions": { "accountTargeting": "single-account", "emptyTargetResolutionMode": "skip" }, "stopConditions": [ { "source": "none" } ] }