

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

# 使用 AWS FIS aws：eks：pod 動作
<a name="eks-pod-actions"></a>

 您可以使用 **aws：eks：pod** 動作，將故障注入 EKS 叢集中執行的 Kubernetes Pod。

 啟動動作時，FIS 會擷取 [FIS Pod 容器映像](eks-pod-actions.html#eks-pod-container-images)。然後，此影像用於在目標 EKS 叢集中建立 Pod。新建立的 Pod 負責注入、控制和監控故障。對於除 [aws：eks：pod-delete](fis-actions-reference.html#pod-delete) 之外的所有 FIS EKS 動作，故障注入是透過使用[暫時性容器](https://kubernetes.io/docs/concepts/workloads/pods/ephemeral-containers/)來實現，這是允許在現有 Pod 中建立暫時容器的 Kubernetes 功能。暫時性容器會在與目標容器相同的命名空間中啟動，並執行所需的錯誤注入任務。如果未指定目標容器，則會選取 Pod 規格中的第一個容器做為目標。

![FIS Pod 建立工作流程顯示暫時性容器注入目標 Pod 容器。](http://docs.aws.amazon.com/zh_tw/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
+ 下列動作需要暫時性容器內的根許可。
  + aws:eks:pod-network-blackhole-port
  + aws:eks:pod-network-latency
  + aws:eks:pod-network-packet-loss

  暫時性容器會從目標 Pod 的安全內容繼承其許可。如果您需要以非根使用者身分執行 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 為目標並使用相同 的其他動作平行執行`trafficType`。支援使用不同流量類型的平行動作。
+ FIS 只能在目標 Pod `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：//[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 目標的 FIS `aws:eks:pod`](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是標準 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**。您可以使用下列命令來建立 Access Entry，將 IAM 角色與 Kubernetes 使用者 {{fis-experiment}} 建立關聯。如需詳細資訊，請參閱[使用 EKS 存取項目授予 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** 文件中的 [Manage IAM users and roles](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 工具組來設定身分映射，將導致在 ConfigMap `aws-auth` 中建立項目。請務必注意，這些產生的項目不支援包含路徑元件。因此，提供做為輸入的 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 Public Gallery](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 | 
| Europe (Paris) | 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 | 
| Middle East (Bahrain) | 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"
    }
}
```