使用 AWS FIS aws:eks:Pod 動作 - AWS 故障注入服務

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

使用 AWS FIS aws:eks:Pod 動作

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

啟動動作時, 會FIS擷取 FIS Pod 容器映像 。然後,此影像用於在目標EKS叢集中建立 Pod。新建立的 Pod 負責注入、控制和監控故障。對於所有FISEKS動作,除了 aws:eks:pod-delete 之外,這是透過使用暫時容器 實現的,這是允許在現有 Pod 中建立臨時容器的 Kubernetes 功能。暫時容器會在目標 Pod 中執行所需的故障注入任務。

Diagram showing FIS Pod creation and fault injection process in an EKS 叢集 environment.
  1. FIS 在實驗範本中提供的叢集中建立 FIS Pod。

  2. Pod 在目標 FIS Pod 中建立暫時容器。

  3. Pod FIS 控制和監控暫時容器的故障注入,並FIS控制和監控 FIS Pod。

完成實驗或發生錯誤時,會移除暫時容器和 FIS Pod。

動作

限制

  • 下列動作不適用於 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。如果沒有此組態,所有 Pod EKS 動作都會失敗。

要求

  • AWS CLI 在電腦上安裝 。只有在您將使用 AWS CLI 建立IAM角色時,才需要這樣做。如需詳細資訊,請參閱安裝或更新 AWS CLI

  • 在您電腦上安裝 kubectl。只有與EKS叢集互動才能設定或監控目標應用程式,才需要這樣做。如需詳細資訊,請參閱 https://https://kubernetes.io/docs/tasks/tools/

  • 支援的 最低版本EKS為 1.23。

建立實驗角色

若要執行實驗,您需要設定實驗IAM的角色。如需詳細資訊,請參閱適用於 AWS FIS 實驗的 IAM 角色。此角色的必要許可取決於您正在使用的動作。請參閱AWS FIS目標動作aws: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

請遵循EKS文件中將IAM身分與 Kubernetes 許可建立關聯中所述的步驟。

我們建議您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 容器映像

提供的 AWS FIS Pod 容器映像託管在 Amazon 中ECR。當您參考來自 Amazon 的映像時ECR,您必須使用完整映像 URI。

Pod 容器映像也可以在 AWS ECR Public Gallery 中使用。

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
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
Middle East (Bahrain) 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" } }