使用 AWS FIS aws: eks: pod 操作 - AWS 故障注入服务

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

使用 AWS FIS aws: eks: pod 操作

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

启动操作后,会FIS检索 FISPod 容器镜像。然后使用此镜像在目标EKS集群中创建 Pod。新创建的 Pod 负责注入、控制和监控故障。对于除了 aws: eks: pod-delete 之外的所有FISEKS操作,错误注入都是通过使用临时容器来实现的,临时容器是一项 Kubernetes 功能,允许在现有 P od 中创建临时容器。临时容器在与目标容器相同的命名空间中启动,并执行所需的错误注入任务。如果未指定目标容器,则选择 Pod 规范中的第一个容器作为目标。

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

  2. FISPod 在 Target Pod 中创建一个临时容器,其命名空间与目标容器相同。

  3. 临时容器在目标容器的命名空间中注入错误。

  4. 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

  • 以下操作需要临时容器内的 root 权限。

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

    • aws:eks:pod-network-latency

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

    临时容器将从目标 Pod 的安全上下文中继承其权限。如果您需要以非 root 用户身份运行 Pod 中的容器,则可以为目标 Pod 中的容器设置单独的安全上下文。

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

  • 动作 aws: eks: pod-network-latency 和 aws: eks: pod-network-packet-loss 不应并行运行并针对同一 Pod。根据您指定的 maxErrors 参数值,该操作可能以已完成或失败状态结束:

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

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

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

  • 动作 aws: eks: pod-network-blackhole-port 不应与其他针对同一 Pod 并使用相同的 Pod 的操作并行运行。trafficType支持使用不同流量类型的并行操作。

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

要求

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

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

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

创建实验角色

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

配置 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 容器镜像托管在亚马逊中ECR。 AWS FIS当您引用来自亚马逊的图片时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" } }