使用 AWS FISaws: eks: pod 动作 - AWS 故障注入服务

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

使用 AWS FISaws: eks: pod 动作

你可以使用 aws: eks: pod 操作将故障注入集群中运行的 Kubernetes 容器中。EKS

启动操作后,会FIS检索 FISPod 容器镜像。然后使用此镜像在目标EKS集群中创建 pod。新创建的 pod 负责注入、控制和监控故障。对于除了 aws: eks: pod-delete 之外的所有FISEKS操作,都是通过使用临时容器来实现的,这是一项 Kub ernetes 功能,允许在现有 pod 中创建临时容器。临时容器在 Target Pod 中执行所需的故障注入任务。

Diagram showing FIS Pod creation and fault injection process in an EKS 集群 environment.
  1. FIS在集群中创建实验模板中提供的 FIS Pod。

  2. P FIS od 在目标 Pod 中创建一个临时容器。

  3. FISPod 控制和监视临时容器的故障注入,并FIS控制和监控 Pod。FIS

实验完成后或发生错误时,临时容器和 P FIS od 将被移除。

操作

限制

  • 以下操作不适用于 AWS Fargate:

    • aws:eks:pod-network-blackhole-port

    • aws:eks:pod-network-latency

    • aws:eks:pod-network-packet-loss

  • 以下操作不支持 bridge 网络模式

    • aws:eks:pod-network-blackhole-port

    • aws:eks:pod-network-latency

    • aws:eks:pod-network-packet-loss

  • 您无法使用资源或资源ARNs标签在实验模板中识别 aws: eks: pod 类型的目标。必须使用必要资源参数来标识目标。

  • 操作 aws:eks:pod-network-latencyaws:eks:pod-network-packet-loss 不应以同一容器组(Pod)为目标并行运行。根据您指定的 maxErrors 参数值,该操作可能以已完成或失败状态结束:

    • 如果 maxErrorsPercent 为 0(默认值),则该操作将以失败状态结束。

    • 否则,失败将增加 maxErrorsPercent 预算。如果失败的注入次数未达到提供的 maxErrors,则该操作将以已完成状态结束。

    • 您可以从目标容器组(Pod)中注入的临时容器的日志中识别出这些失败。它将失败,并显示 Exit Code: 16

  • 操作 aws:eks:pod-network-blackhole-port 不应与其他以同一容器组(Pod)为目标并使用相同 trafficType 的操作并行运行。支持使用不同流量类型的并行操作。

  • FIS只有当目标 pod 的设置为时,才能监控故障注入securityContext的状态readOnlyRootFilesystem: false。如果没有此配置,所有 EKS pod 操作都将失败。

要求

  • 安装   AWS CLI 在你的电脑上。只有当你要使用时才需要这样做 AWS CLI 来创建IAM角色。有关更多信息,请参阅安装或更新 AWS CLI.

  • 在计算机上安装 kubectl。只有在与EKS集群交互以配置或监控目标应用程序时才需要这样做。有关更多信息,请参阅 https://kubernetes.io/docs/tasks/tools/

  • 支持的最低版本EKS为 1.23。

创建实验角色

要运行实验,你需要为实验配置一个IAM角色。有关更多信息,请参阅 适用于 AWS FIS 实验的 IAM 角色。此角色所需的权限取决于您正在使用的操作。请参阅 AWS FISaws:eks:pod旨在为您的操作找到必要权限的操作。

配置 Kubernetes 服务账户

配置 Kubernetes 服务账户,使用指定 Kubernetes 命名空间中的目标运行实验。在以下示例中,服务帐号为 myserviceaccount 命名空间是 default。 请注意 default 是标准的 Kubernetes 命名空间之一。

配置 Kubernetes 服务账户
  1. 创建一个名为 rbac.yaml 的文件,并添加以下内容。

    kind: ServiceAccount apiVersion: v1 metadata: namespace: default name: myserviceaccount --- kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: default name: role-experiments rules: - apiGroups: [""] resources: ["configmaps"] verbs: [ "get", "create", "patch", "delete"] - apiGroups: [""] resources: ["pods"] verbs: ["create", "list", "get", "delete", "deletecollection"] - apiGroups: [""] resources: ["pods/ephemeralcontainers"] verbs: ["update"] - apiGroups: [""] resources: ["pods/exec"] verbs: ["create"] - apiGroups: ["apps"] resources: ["deployments"] verbs: ["get"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: bind-role-experiments namespace: default subjects: - kind: ServiceAccount name: myserviceaccount namespace: default - apiGroup: rbac.authorization.k8s.io kind: User name: fis-experiment roleRef: kind: Role name: role-experiments apiGroup: rbac.authorization.k8s.io
  2. 运行以下命令。

    kubectl apply -f rbac.yaml

向IAM用户和角色授予访问 Kubernetes 的权限 APIs

按照文档中将IAM身份与 Kubernetes 权限关联中介绍的步骤进行操作。EKS

我们建议按照Access Entries通过访问条目向IAM用户授予对 Kubernetes 的访问权限中所述的步骤来使用EKS

aws eks create-access-entry \ --principal-arn arn:aws:iam::123456789012:role/fis-experiment-role \ --username fis-experiment \ --cluster-name my-cluster
重要

为了利用访问入口,必须将EKS群集的身份验证模式配置为API_AND_CONFIG_MAPAPI模式。

您也可以使用以下命令来创建身份映射。有关更多信息,请参阅eksctl文档中的管理IAM用户和角色

eksctl create iamidentitymapping \ --arn arn:aws:iam::123456789012:role/fis-experiment-role \ --username fis-experiment \ --cluster my-cluster
重要

利用 eksctl 工具包配置身份映射将导致在中创建条目。aws-auth ConfigMap需要注意的是,这些生成的条目不支持包含路径组件。因此,作为输入ARN提供的内容不得包含路径段(例如arn:aws:iam::123456789012:role/service-role/fis-experiment-role)。

容器组(pod)容器映像

提供的 pod 容器镜像 AWS FIS托管在亚马逊ECR。当您引用来自亚马逊的图片时ECR,必须使用完整图片URI。

Pod 容器镜像也可以在AWSECR公共画廊中找到。

AWS 区域 图片 URI
美国东部(俄亥俄) 051821878176.dkr.ecr.us-east-2.amazonaws.com/aws-fis-pod:0.1
美国东部(弗吉尼亚州北部) 731367659002.dkr.ecr.us-east-1.amazonaws.com/aws-fis-pod:0.1
美国西部(加利福尼亚北部) 080694859247.dkr.ecr.us-west-1.amazonaws.com/aws-fis-pod:0.1
美国西部(俄勒冈州) 864386544765.dkr.ecr.us-west-2.amazonaws.com/aws-fis-pod:0.1
非洲(开普敦) 056821267933.dkr.ecr.af-south-1.amazonaws.com/aws-fis-pod:0.1
亚太地区(香港) 246405402639.dkr.ecr.ap-east-1.amazonaws.com/aws-fis-pod:0.1
亚太地区(孟买) 524781661239.dkr.ecr.ap-south-1.amazonaws.com/aws-fis-pod:0.1
亚太地区(首尔) 526524659354.dkr.ecr.ap-northeast-2.amazonaws.com/aws-fis-pod:0.1
亚太地区(新加坡) 316401638346.dkr.ecr.ap-southeast-1.amazonaws.com/aws-fis-pod:0.1
亚太地区(悉尼) 488104106298.dkr.ecr.ap-southeast-2.amazonaws.com/aws-fis-pod:0.1
亚太地区(东京) 635234321696.dkr.ecr.ap-northeast-1.amazonaws.com/aws-fis-pod:0.1
加拿大(中部) 490658072207.dkr.ecr.ca-central-1.amazonaws.com/aws-fis-pod:0.1
欧洲地区(法兰克福) 713827034473.dkr.ecr.eu-central-1.amazonaws.com/aws-fis-pod:0.1
欧洲地区(爱尔兰) 205866052826.dkr.ecr.eu-west-1.amazonaws.com/aws-fis-pod:0.1
欧洲地区(伦敦) 327424803546.dkr.ecr.eu-west-2.amazonaws.com/aws-fis-pod:0.1
欧洲地区(米兰) 478809367036.dkr.ecr.eu-south-1.amazonaws.com/aws-fis-pod:0.1
欧洲地区(巴黎) 154605889247.dkr.ecr.eu-west-3.amazonaws.com/aws-fis-pod:0.1
欧洲(西班牙) 395402409451.dkr.ecr.eu-south-2.amazonaws.com/aws-fis-pod:0.1
欧洲地区(斯德哥尔摩) 263175118295.dkr.ecr.eu-north-1.amazonaws.com/aws-fis-pod:0.1
中东(巴林) 065825543785.dkr.ecr.me-south-1.amazonaws.com/aws-fis-pod:0.1
南美洲(圣保罗) 767113787785.dkr.ecr.sa-east-1.amazonaws.com/aws-fis-pod:0.1
AWS GovCloud (美国东部) 246533647532.dkr.ecr.us-gov-east-1.amazonaws.com/aws-fis-pod:0.1
AWS GovCloud (美国西部) 246529956514.dkr.ecr.us-gov-west-1.amazonaws.com/aws-fis-pod:0.1

实验模板示例

以下是 aws:eks:pod-network-latency 操作的实验模板示例。

{ "description": "Add latency and jitter to the network interface for the target EKS pods", "targets": { "myPods": { "resourceType": "aws:eks:pod", "parameters": { "clusterIdentifier": "mycluster", "namespace": "default", "selectorType": "labelSelector", "selectorValue": "mylabel=mytarget" }, "selectionMode": "COUNT(3)" } }, "actions": { "EksPod-latency": { "actionId": "aws:eks:pod-network-latency", "description": "Add latency", "parameters": { "kubernetesServiceAccount": "myserviceaccount", "duration": "PT5M", "delayMilliseconds": "200", "jitterMilliseconds": "10", "sources": "0.0.0.0/0" }, "targets": { "Pods": "myPods" } } }, "stopConditions": [ { "source": "none", } ], "roleArn": "arn:aws:iam::111122223333:role/fis-experiment-role", "tags": { "Name": "EksPodNetworkLatency" } }