本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
AZ:应用程序放缓
您可以使用 “AZ:应用程序减速” 场景在单个可用区 (AZ) 内的资源之间引入额外的延迟。这种延迟会导致应用程序运行缓慢、部分中断(有时称为灰色故障)等许多症状。它增加了目标资源之间的网络流延迟。网络流量代表计算资源之间的流量,即在服务器、容器和服务之间传输请求、响应和其他通信的数据包。该场景可以帮助验证可观测性设置、调整警报阈值、发现应用程序对减速的敏感度,以及实施关键运营决策,例如亚利桑那州撤离。
默认情况下,该场景会为选定区域内目标资源之间的 100% 网络流量增加 200 毫秒的延迟,持续时间为 30 分钟。您可以使用 AWS FIS 控制台中的编辑共享参数对话框在场景级别调整以下参数,然后将其应用于基础操作:
-
可用区-您可以选择场景中要削弱的可用区。
-
毫秒 (ms) 延迟-根据应用程序的灵敏度和需求进行调整。例如,您可以为更敏感的应用程序设置较低的延迟,或者为测试超时处理设置更高的延迟。考虑使用当前应用程序延迟的倍数作为基准。
-
流量百分比-减少以损害部分流量。例如,您可以增加 200 毫秒的延迟,影响 25% 的网络流量,以便进行更细致的测试。
-
持续时间-设置实验运行多长时间。您可以缩短测试时间以加快测试,也可以运行更长的持续测试。例如,将持续时间设置为 2 小时,以测试受损条件下的恢复机制。
-
资源定位-您可以使用标签(适用于 EC2 或 Fargate 上的 EC2 实例或 ECS 任务)或标签(适用于 EC2 上的 EKS 容器)为整个场景定义目标资源。您可以指定自己的标签和标签,也可以使用场景中提供的默认值。如果您不想使用标签或标签,可以通过指定其他参数来编辑操作以定位资源。
-
自定义-如果您不想以 EC2 或 ECS 资源为目标,则可以将操作保留为默认标签。实验找不到任何可以瞄准的资源,该操作将被跳过。但是,如果您不想以 EKS 资源为目标,则应将 EKS 操作和目标完全从场景中删除,因为它需要提供 EKS 集群标识符。要进行更精细的自定义,您可以直接修改实验模板中的单个操作。
操作
以下操作加在一起,会给网络流量带来额外的延迟,然后通过应用程序传播,从而帮助在单个可用区中产生应用程序运行缓慢的许多症状。这些操作并行运行,默认情况下,每个操作都会增加 200 毫秒的延迟,持续 30 分钟。在此之后,延迟恢复到正常水平。该场景至少需要以下一种资源类型才能运行:EC2 实例、ECS 任务或 EKS 容器。
ECS 网络延迟
AZ:应用程序减速包括 aws: ecs: task-network-latency,以引入 ECS 任务延迟。该操作以所选可用区中的任务为目标。默认情况下,它以标签命名为的任务为目标AZApplicationSlowdown,其值为LatencyForECS。您可以将默认标签替换为自己的标签,也可以将场景标签添加到任务中。如果未找到有效的任务,则将跳过此操作。在 ECS 上运行实验之前,您应该按照 ECS 任务操作的设置步骤进行操作。
EKS 网络延迟
AZ:应用程序减速包括 aws: eks: pod-network-latency,以引入 EKS Pod 延迟。该操作以选定可用区中的窗格为目标。默认情况下,它的目标是集群中带有格式为 key=value 的标签的 pod。提供的默认标签是AZApplicationSlowdown=LatencyForEKS。你可以用自己的标签替换默认标签,也可以将这个标签添加到你的 pod 中。如果找不到有效的 pod,则将跳过此操作。在 EKS 上运行实验之前,您应该按照 EKS 窗格操作的设置步骤进行操作。
EC2 网络延迟
AZ:应用程序减速使用 aws: ssm: send-command 操作来运行AWSFIS-Run-Network-Latency-Sources文档,从而导致 EC2 实例延迟。该操作以所选可用区中的实例为目标。默认情况下,它以标签命名为的实例为目标AZApplicationSlowdown,其值为LatencyForEC2。您可以将默认标签替换为自己的标签,也可以将此标签添加到您的实例中。如果未找到有效的实例,则将跳过此操作。在使用 SSM 在 EC2 上运行实验之前,您应该配置 AWS 系统管理器代理。
限制
-
此场景不包括停止条件。应将适用于您应用程序的正确停止条件添加到实验模板中。
要求
-
向 AWS FIS 实验角色添加所需的权限。
-
您需要将所选可用区内以下 3 种类型中的任何一个或多个资源作为目标:EC2 实例、ECS 任务或 EKS Pod。
-
该场景的所有目标必须位于同一 VPC 中。
Permissions
要运行此方案,您需要一个 IAM 角色,其信任策略允许 FIS 代入该角色,以及您在实验中目标资源类型的托管策略: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 命令行界面(AWS CLI)中的 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" } ] }