本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Cross-AZ: Traffic Slowdown
您可以使用跨可用区:流量减速场景来注入数据包丢失,以中断和减慢可用区之间的流量(AZs)。数据包丢失会损害跨可用区的通信,即部分中断,有时被称为灰色故障。它会在目标资源之间的网络流量中注入数据包丢失。网络流量代表计算资源之间的流量,即在服务器、容器和服务之间传输请求、响应和其他通信的数据包。该场景可以帮助验证可观测性设置,调整警报阈值,发现跨可用区通信中的应用程序敏感性和依赖性,并练习关键运营决策,例如可用区撤离。
默认情况下,该场景会向选定可用区的目标资源的 100% 出站网络流量注入 15% 的数据包丢失,持续时间为 30 分钟。您可以使用 AWS FIS 控制台中的编辑共享参数对话框在场景级别调整以下参数,然后将其应用于基础操作:
-
可用区-您可以选择要损坏的可用区,数据包丢失将从该可用区注入该区域 AZs 内的另一个可用区。
-
丢包-将数据包丢失调整为较低以进行细微的中断测试,例如5%,或更高以测试严重的通信性能下降和恢复机制,例如50%甚至100%以测试总体连接影响。
-
流量百分比-减少以损害部分流量。例如,您可以注入 15% 的数据包丢失,影响 25% 的网络流,以进行更微妙的测试。
-
持续时间-设置实验的运行时间。您可以缩短时间以加快测试速度,也可以运行更长的持续测试。例如,将持续时间设置为 2 小时,以帮助测试受损条件下的恢复机制。
-
资源定位-您可以使用标签(用于 EC2 实例或 Fargate 上 EC2 的 ECS 任务)或标签(适用于开启的 EKS pod)来定义整个场景的目标资源。 EC2您可以指定自己的标签和标签,也可以使用场景中提供的默认值。如果您不想使用标签或标签,则可以通过指定其他参数来编辑目标资源的操作。
-
自定义-如果您不想定位 EC2 或 ECS 资源,则可以将操作保留为默认标签。实验找不到任何可以瞄准的资源,因此该操作将被跳过。但是,如果您不想以 EKS 资源为目标,则应将 EKS 操作和目标完全从场景中删除,因为它需要提供 EKS 集群标识符。要进行更精细的自定义,您可以直接修改实验模板中的单个操作。
操作
以下操作共同帮助在网络层从目标可用区到该区域其他区域的出站通信 AZs 中引入数据包丢失,从而帮助制造两者之间 AZs 流量减速的症状。这些操作并行运行,默认情况下,每次注入 15% 的数据包丢失,持续 30 分钟。在这段时间之后,沟通恢复正常。该场景需要在所选可用区中至少有一种资源类型才能运行: EC2 实例、ECS 任务或 EKS Pod。
ECS 网络丢包
跨可用区:流量减速包括 aws: ecs:,用于task-network-packet-loss为 ECS 任务注入丢包。该操作以所选可用区中的任务为目标,并会影响其与该区域 AZs 中所有其他任务的出站通信。您可以通过编辑操作和在Sources字段中添加或移 AZs 除来进一步自定义影响范围。默认情况下,它的目标任务的标签名CrossAZTrafficSlowdown为,值为PacketLossForECS。您可以用自己的标签替换默认标签,也可以将场景标签添加到任务中。如果未找到有效任务,则将跳过此操作。在 ECS 上运行实验之前,应按照 ECS 任务操作的设置步骤进行操作。
EKS 网络数据包丢失
跨可用区:流量减速包括 a ws: eks:,用于为 pod-network-packet-loss EKS pod 注入丢包。该操作以所选可用区中的 Pod 为目标,并会影响它们与该区域 AZs 内所有其他容器的出站通信。您可以通过编辑操作和在Sources字段中添加或移 AZs 除来进一步自定义影响范围。默认情况下,它的目标是集群中带有格式为 key=value 的标签的 pod。提供的默认标签是CrossAZTraffic=PacketLossForEKS。你可以用自己的标签替换默认标签,也可以将此标签添加到你的 pod 中。如果未找到有效的 pod,则将跳过此操作。在 EKS 上运行实验之前,应按照 EK S pod 操作的设置步骤进行操作。
EC2 网络数据包丢失
跨可用区:流量减速使用 a ws: ssm: send-command 操作运行-Network-AWSFIS-Run Packet-Loss-Sources 文档,为实例注入数据包丢失,并损害它们与该地区所有其他地区的出站通信。 EC2 AZs 您可以通过编辑操作和在Sources字段中添加或移 AZs 除来进一步自定义影响范围。该操作的目标是所选可用区中的实例。默认情况下,它的目标实例的标签名CrossAZTrafficSlowdown为,值为PacketLossForEC2。您可以用自己的标签替换默认标签,也可以将此标签添加到您的实例中。如果未找到有效实例,则将跳过此操作。在运行 EC2 使用 SSM 的实验之前,您应该配置 AWS Systems Manager 代理。
限制
-
此场景不包括停止条件。应将适用于您应用程序的正确停止条件添加到实验模板中。
要求
-
向 AWS FIS 实验角色添加所需的权限。
-
您需要将选定可用区内以下 3 种类型中的任何一种中的一种或多种资源作为目标: EC2 实例、ECS 任务或 EKS Pod。
-
场景中的所有目标都必须位于同一 VPC 中。
Permissions
要运行此场景,您需要一个具有允许 FIS 代入角色的信任策略的 IAM 角色以及实验中目标资源类型的托管策略: EC2、ECS 和 EKS。当您根据跨可用区:流量减速场景创建实验模板时,FIS 会使用信任策略和以下 AWS 托管策略为您创建角色:
如果您使用现有 IAM 角色运行跨可用区:流量减速场景,则可以附加以下策略向 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": "Cross-AZ: Traffic Slowdown" }, "description": "Inject packet loss to disrupt and slow down traffic between AZs.", "actions": { "PacketLossForEC2": { "actionId": "aws:ssm:send-command", "parameters": { "duration": "PT30M", "documentArn": "arn:aws:ssm:us-east-1::document/AWSFIS-Run-Network-Packet-Loss-Sources", "documentParameters": "{\"Sources\":\"us-east-1b,us-east-1c,us-east-1d,us-east-1e,us-east-1f\",\"LossPercent\":\"15\",\"Interface\":\"DEFAULT\",\"TrafficType\":\"egress\",\"DurationSeconds\":\"1800\",\"FlowsPercent\":\"100\",\"InstallDependencies\":\"True\"}" }, "targets": { "Instances": "TargetsForEC2" } }, "PacketLossForECS": { "actionId": "aws:ecs:task-network-packet-loss", "parameters": { "sources": "us-east-1b,us-east-1c,us-east-1d,us-east-1e,us-east-1f", "lossPercent": "15", "duration": "PT30M", "flowsPercent": "100", "installDependencies": "true", "useEcsFaultInjectionEndpoints": "true" }, "targets": { "Tasks": "TargetsForECS" } }, "PacketLossForEKS": { "actionId": "aws:eks:pod-network-packet-loss", "parameters": { "sources": "us-east-1b,us-east-1c,us-east-1d,us-east-1e,us-east-1f", "lossPercent": "15", "duration": "PT30M", "flowsPercent": "100", "interface": "DEFAULT", "kubernetesServiceAccount": "fis-service-account" }, "targets": { "Pods": "TargetsForEKS" } } }, "targets": { "TargetsForEC2": { "filters": [ { "path": "Placement.AvailabilityZone", "values": [ "us-east-1a" ] } ], "resourceTags": { "CrossAZTrafficSlowdown": "PacketLossForEC2" }, "resourceType": "aws:ec2:instance", "selectionMode": "ALL" }, "TargetsForECS": { "filters": [ { "path": "AvailabilityZone", "values": [ "us-east-1a" ] } ], "resourceTags": { "CrossAZTrafficSlowdown": "PacketLossForECS" }, "resourceType": "aws:ecs:task", "selectionMode": "ALL" }, "TargetsForEKS": { "parameters": { "availabilityZoneIdentifier": "us-east-1a", "clusterIdentifier": "", "namespace": "default", "selectorType": "labelSelector", "selectorValue": "CrossAZTrafficSlowdown=PacketLossForEKS" }, "resourceType": "aws:eks:pod", "selectionMode": "ALL" } }, "experimentOptions": { "accountTargeting": "single-account", "emptyTargetResolutionMode": "skip" }, "stopConditions": [ { "source": "none" } ] }