View a markdown version of this page

FIS aws:eks:pod AWS アクションを使用する - AWS フォールトインジェクションサービス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

FIS aws:eks:pod AWS アクションを使用する

aws:eks:pod アクションを使用して、EKS クラスターで実行されている Kubernetes Pod に障害を挿入できます。

アクションが開始されると、FIS は FIS ポッドコンテナイメージを取得します。このイメージは、ターゲット EKS クラスターに Pod を作成するために使用されます。新しく作成された Pod は、障害の挿入、制御、モニタリングを担当します。aws:eks:pod-delete を除くすべての FIS EKS アクションでは、障害挿入は、既存の Pod 内に一時コンテナを作成できる Kubernetes 機能であるエフェメラルコンテナを使用して実現されます。エフェメラルコンテナは、ターゲットコンテナと同じ名前空間で起動され、目的の障害挿入タスクを実行します。ターゲットコンテナが指定されていない場合、Pod 仕様の最初のコンテナがターゲットとして選択されます。

ターゲットポッドコンテナへのエフェメラルコンテナインジェクションを示す FIS ポッド作成ワークフロー。
  1. FIS は、実験テンプレートで指定されたターゲットクラスターに FIS Pod を作成します。

  2. FIS Pod は、ターゲットコンテナと同じ名前空間のターゲットポッドにエフェメラルコンテナを作成します。

  3. エフェメラルコンテナは、ターゲットコンテナの名前空間に障害を挿入します。

  4. FIS ポッドは、エフェメラルコンテナのフォールトインジェクションを制御およびモニタリングし、FIS は FIS ポッドを制御およびモニタリングします。

実験の完了時、またはエラーが発生した場合、エフェメラルコンテナと FIS ポッドは削除されます。

アクション

制限事項

  • 以下のアクションは機能しません 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

  • 次のアクションには、エフェメラルコンテナ内のルートアクセス許可が必要です。

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

    • aws:eks:pod-network-latency

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

    エフェメラルコンテナは、ターゲット Pod のセキュリティコンテキストからアクセス許可を継承します。Pod 内のコンテナを非ルートユーザーとして実行する必要がある場合は、ターゲット Pod 内のコンテナに個別のセキュリティコンテキストを設定できます。

  • リソース ARN またはリソースタグを使用して、実験テンプレート内の 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 は、ターゲットポッドの が に設定されている場合にのみ、フォールトインジェクションのステータスsecurityContextをモニタリングできますreadOnlyRootFilesystem: false。この設定を行わないと、すべての EKS Pod アクションは失敗します。

要件

  • コンピュータ AWS CLI に をインストールします。これが必要なのは、 AWS CLI を使用して IAM ロールを作成する場合にのみ必要です。詳細については、「AWS CLIのインストールまたは更新」を参照してください。

  • コンピュータに kubectl をインストールします。これが必要なのは、EKS クラスターを操作してターゲットアプリケーションを設定するか、監視する場合に限られます。詳細については、https://kubernetes.io/docs/tasks/tools/ を参照してください。

  • 現在サポートされている最小バージョンは 1.23 です。

実験ロールの作成

実験を実行するには、実験の IAM ロールを設定する必要があります。詳細については、「FIS 実験の IAM AWS ロール」を参照してください。このロールに必要なアクセス許可は、使用しているアクションによって異なります。aws:eks:pod をターゲットとするAWS FIS アクションを参照して、アクションに必要なアクセス許可を見つけます。

Kubernetes サービスアカウントを設定する

指定した Kubernetes 名前空間のターゲットで実験を実行するように Kubernetes サービスアカウントを設定します。次の例では、サービスアカウントは myserviceaccount で、名前空間はデフォルトです。default は標準の Kubernetes 名前空間の1つであることに注意してください。

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 API へのアクセスを付与する

EKS ドキュメント」の「IAM アイデンティティと Kubernetes のアクセス許可を関連付ける」で説明されているステップに従います。

オプション 1: アクセスエントリを作成する

Access Entries を使用することをお勧めします。次のコマンドを使用して、IAM ロールを Kubernetes ユーザー fis-experiment に関連付けるアクセスエントリを作成できます。詳細については、「EKS アクセスエントリを使用して Kubernetes へのアクセス権を IAM ユーザーに付与する」を参照してください。

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 にエントリを追加する

次のコマンドを使用してアイデンティティマッピングを作成することもできます。詳細については、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) を含めることはできません。

ポッドコンテナイメージ

FIS が提供する Pod AWS コンテナイメージは Amazon ECR でホストされます。Amazon ECR からイメージを参照する場合は、イメージに完全なイメージの URI を使用する必要があります

ポッドコンテナイメージは、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
アジアパシフィック (大阪) 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

実験テンプレートの例

以下は、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" } }