

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

# 使用 FIS aw AWS s: eks: pod 操作
<a name="eks-pod-actions"></a>

 你可以使用 **aws: eks: pod** 操作将错误注入在 EKS 集群中运行的 Kubernetes Pod 中。

 操作启动后，FIS 将检索 [FIS 容器组容器映像](eks-pod-actions.html#eks-pod-container-images)。然后使用此镜像在目标 EKS 集群中创建 Pod。新创建的 Pod 负责注入、控制和监控故障。对于所有 FIS EKS 操作，除 [aws: eks: pod-delete](fis-actions-reference.html#pod-delete) 之外，错误注入都是通过使用临时容器来实现的，临时容器是一项 Kub [ernetes 功能，允许在现有 Pod 中创建临时容器](https://kubernetes.io/docs/concepts/workloads/pods/ephemeral-containers/)。临时容器在与目标容器相同的命名空间中启动，并执行所需的错误注入任务。如果未指定目标容器，则选择 Pod 规范中的第一个容器作为目标。

![](http://docs.aws.amazon.com/zh_cn/fis/latest/userguide/images/eks-actions.png)


1.  FIS 在实验模板中指定的目标集群中创建 FIS Pod。

1.  FIS Pod 在目标 Pod 中创建一个临时容器，其命名空间与目标容器相同。

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

1.  FIS 容器组（pod）控制和监视临时容器的故障注入，而 FIS 控制和监视 FIS 容器组（pod）。

 实验完成后或发生错误时，将删除临时容器和 FIS 容器组（pod）。

## 操作
<a name="supported-eks-pod-actions"></a>
+ [aws:eks:pod-cpu-stress](fis-actions-reference.md#pod-cpu-stress)
+ [aws:eks:pod-delete](fis-actions-reference.md#pod-delete)
+ [aws:eks:pod-io-stress](fis-actions-reference.md#pod-io-stress)
+ [aws:eks:pod-memory-stress](fis-actions-reference.md#pod-memory-stress)
+ [aws:eks:pod-network-blackhole-port](fis-actions-reference.md#pod-network-blackhole-port)
+ [aws:eks:pod-network-latency](fis-actions-reference.md#pod-network-latency)
+ [aws:eks:pod-network-packet-loss](fis-actions-reference.md#pod-network-packet-loss)

## 限制
<a name="eks-pod-limitations"></a>
+ 以下操作不适用于 AWS Fargate：
  + aws:eks:pod-network-blackhole-port
  + aws:eks:pod-network-latency
  + aws:eks:pod-network-packet-loss
+ 以下操作不支持 `bridge` [网络模式](https://docs.aws.amazon.com/AmazonECS/latest/bestpracticesguide/networking-networkmode.html)：
  + 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`支持使用不同流量类型的并行操作。
+ 只有当目标 Pod 的设置为时，FIS 才能监控故障注入`securityContext`的状态。`readOnlyRootFilesystem: false`如果没有此配置，所有 EKS Pod 操作都将失败。

## 要求
<a name="eks-pod-requirements"></a>
+ 在您的计算机 AWS CLI 上安装。此操作仅适用于您使用 AWS CLI 创建 IAM 角色的情况。有关更多信息，请参阅[安装或更新 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。
+ 在计算机上安装 **kubectl**。此操作仅适用于通过 EKS 集群交互来配置或监控目标应用程序的情况。欲了解更多信息，请参阅 [https://kubernetes。 io/docs/tasks/tools](https://kubernetes.io/docs/tasks/tools/)/。
+ 当前支持的 EKS 最低版本为 1.23。

## 创建实验角色
<a name="create-experiment-role-eks-pod"></a>

 要运行实验，您需要为实验配置 IAM 角色。有关更多信息，请参阅 [适用于 AWS FIS 实验的 IAM 角色](getting-started-iam-service-role.md)。此角色所需的权限取决于正在使用的操作。请参阅[以 `aws:eks:pod` 为目标的AWS FIS 操作](https://docs.aws.amazon.com/fis/latest/userguide/fis-actions-reference.html#eks-actions-reference)，查找执行您的操作所需的权限。

## 配置 Kubernetes 服务账户
<a name="configure-service-account"></a>

配置 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
   ```

1. 运行如下命令。

   ```
   kubectl apply -f rbac.yaml
   ```

## 向 IAM 用户和角色授予访问 Kubernetes 的访问权限 APIs
<a name="grant-k8s-access"></a>

按照 **EKS** 文档中[将 IAM 身份与 Kubernetes 权限相关联](https://docs.aws.amazon.com/eks/latest/userguide/grant-k8s-access.html#authentication-modes)中介绍的步骤进行操作。

### 选项 1：创建访问条目
<a name="grant-k8s-access-option-1"></a>

我们建议使用 **Access Entries**。您可以使用以下命令来创建将 IAM 角色与 Kubernetes 用户关联的访问条目。{{fis-experiment}}有关更多信息，请参阅使用 EK [S 访问条目向 IAM 用户授予访问 Kubernetes 的](https://docs.aws.amazon.com/eks/latest/userguide/access-entries.html)访问权限。

```
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_MAP` 或 `API` 模式。

### 选项 2：向 aws-auth 添加条目 ConfigMap
<a name="grant-k8s-access-option-2"></a>

还可以使用以下命令创建身份映射。有关更多信息，请参阅 **eksctl** 文档中的[管理 IAM 用户和角色](https://eksctl.io/usage/iam-identity-mappings/)。

```
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）容器映像
<a name="eks-pod-container-images"></a>

 AWS FIS 提供的 Pod 容器镜像托管在 Amazon ECR 中。从 Amazon ECR 中引用映像时，必须使用完整的映像 URI。

Pod 容器镜像也可在 [AWS ECR 公共图库](https://gallery.ecr.aws/aws-fis/aws-fis-pod)中找到。


| 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 | 
| 亚太地区（大阪） | 148336246925.dkr.ecr.ap-northeast-3.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 | 
| 欧洲（苏黎世） | 604225987275.dkr.ecr.eu-central-2.amazonaws.com/aws-fis-pod:0.1 | 
| 中东（巴林） | 065825543785.dkr.ecr.me-south-1.amazonaws.com/aws-fis-pod:0.1 | 
| 中东（阿联酋）： | 438374459301.dkr.ecr.me-central-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 | 

## 实验模板示例
<a name="example-eks-pod-experiment-template"></a>

以下是 [aws:eks:pod-network-latency](fis-actions-reference.md#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"
    }
}
```