Cross-AZ: Traffic Slowdown - AWS 故障注入服務

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Cross-AZ: Traffic Slowdown

您可以使用跨可用區域:流量慢速方案來注入封包遺失,以中斷和減慢可用區域 (AZs) 之間的流量。封包遺失會影響跨可用區通訊、部分中斷,有時稱為灰色故障。它會在目標資源之間的網路流程上注入封包遺失。網路流程代表運算資源之間的流量,也就是伺服器、容器和服務之間承載請求、回應和其他通訊的資料封包。此案例有助於驗證可觀測性設定、調整警示閾值、在跨可用區域通訊中探索應用程式敏感度和相依性,以及練習 AZ 疏散等關鍵操作決策。

根據預設,案例會將 15% 封包遺失注入 100% 來自所選 AZ 之目標資源的傳出網路流程,持續時間為 30 分鐘。您可以使用 AWS FIS 主控台中的編輯共用參數對話方塊,在案例層級調整下列參數,然後套用至基礎動作:

  • 可用區域 - 您可以選擇要影響的可用區域,而封包遺失會從該可用區域注入該區域內的其他AZs。

  • 封包遺失 - 將封包遺失降低以進行細微的中斷測試,例如 5% 或更高,以測試嚴重的通訊降級和復原機制,例如 50%,或甚至 100% 的總連線影響。

  • 流程百分比 - 減少以損害一部分的流量。例如,您可以注入 15% 的封包遺失,影響 25% 的網路流程,以進行更細微的測試。

  • 持續時間 - 設定實驗執行的時間長度。您可以縮短以加快測試速度,或執行更長的持續測試。例如,將持續時間設定為 2 小時,以協助在受損條件下測試復原機制。

  • 資源目標 - 您可以使用標籤 (適用於 EC2 執行個體或 EC2 或 Fargate 上的 ECS 任務) 或標籤 (適用於 EC2 上的 EKS Pod),為整體案例定義目標資源。您可以指定自己的標籤和標籤,或使用案例中提供的預設值。如果您不想使用標籤或標籤,您可以透過指定其他參數,將動作編輯為目標資源。

  • 自訂 - 如果您不想將 EC2 或 ECS 資源設為目標,則可以保留具有預設標籤的動作。實驗不會找到任何要鎖定的資源,而且會略過動作。不過,如果您不想將 EKS 資源設為目標,您應該從案例中完全移除 EKS 動作和目標,因為它需要提供 EKS 叢集識別符。如需更精細的自訂,您可以直接修改實驗範本中的個別動作。

動作

以下動作結合起來,透過將來自目標 AZs 的傳出通訊封包遺失引入網路層區域中的其他 AZs,有助於在 AZ 之間建立流量變慢的症狀。這些動作會平行執行,每個動作預設會注入 15% 封包遺失 30 分鐘。在此期間之後,通訊會恢復正常。此案例在選取的 AZ 中至少需要下列其中一個資源類型才能執行:EC2 執行個體、ECS 任務或 EKS Pod。

ECS 網路封包遺失

跨可用區:流量緩慢包括 aws:ecs:task-network-packet-loss,以注入 ECS 任務的封包遺失。動作以所選 AZ 中的任務為目標,並損害其與區域中所有其他 AZs的傳出通訊。您可以透過編輯動作並從 Sources 欄位新增或移除 AZs進一步自訂影響的範圍。根據預設,它會以標籤https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-using-tags.html名為 CrossAZTrafficSlowdown 且值為 的任務為目標PacketLossForECS。您可以使用自己的標籤取代預設標籤,或將案例標籤新增至任務。如果找不到有效的任務,則會略過此動作。在 ECS 上執行實驗之前,您應該遵循 ECS 任務動作的設定步驟

EKS 網路封包遺失

跨可用區:流量緩慢包括 aws:eks:pod-network-packet-loss,以注入 EKS Pod 的封包遺失。動作以所選 AZ 中的 Pod 為目標,並影響其與區域中所有其他 AZs傳出通訊。您可以透過編輯動作並從 Sources 欄位新增或移除 AZs進一步自訂影響的範圍。根據預設,它以具有格式 key=value 標籤的叢集內的 Pod 為目標。提供的預設標籤為 CrossAZTraffic=PacketLossForEKS。您可以使用自己的標籤取代預設標籤,或將此標籤新增至 Pod。如果找不到有效的 Pod,則會略過此動作。在 EKS 上執行實驗之前,您應該遵循 EKS Pod 動作的設定步驟

EC2 網路封包遺失

跨可用區:Traffic Slowdown 使用 aws:ssm:send-mand 動作來執行 AWSFIS-Run-Network-Packet-Loss-Sources 文件,以注入 EC2 執行個體的封包遺失,並損害其與區域中所有其他AZs傳出通訊。您可以透過編輯動作並從 Sources 欄位新增或移除 AZs進一步自訂影響的範圍。動作以所選 AZ 中的執行個體為目標。根據預設,它會以標籤https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html名為 CrossAZTrafficSlowdown 且值為 的執行個體為目標PacketLossForEC2。您可以使用自己的標籤取代預設標籤,或將此標籤新增至執行個體。如果找不到有效的執行個體,則會略過此動作。在使用 SSM 在 EC2 上執行實驗之前,您應該設定 AWS Systems Manager 代理程式

限制

  • 此案例不包含停止條件。應用程式正確的停止條件應新增至實驗範本。

要求

  • 將必要的許可新增至 AWS FIS 實驗角色

  • 您需要將下列 3 種類型中的任何一種資源設為目標:EC2 執行個體、ECS 任務或 EKS Pod。

  • 案例的所有目標都必須位於相同的 VPC 中。

許可

若要執行此案例,您需要具有信任政策的 IAM 角色,允許 FIS 擔任您在實驗中目標資源類型的角色和受管政策: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 命令列界面 (AWS CLI) 中的 create-experiment-template 命令來建立實驗範本。如需最新版本的案例,請造訪 FIS 主控台中的案例程式庫,並前往內容索引標籤。

{ "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" } ] }