Fault Injection SimulatorのEKS Pod ActionsをEKS on Fargateで利用できるようにした話
SRE Unitの若松です。今回はFault Injection SimulatorのEKS Pod ActionsをEKS on Fargateで利用できるようにした話を紹介します。
Fault Injection Simulatorとは
Fault Injection Simulatorとは、AWSが提供するカオスエンジニアリングの機能です。EC2、ECS、EKS、RDSなどに意図的に障害を発生させることができます。
EKS Pod Actionsとは
EKS クラスターで実行されている Podに障害を挿入できるアクションです。2023年7月現在、Fargateでは下記のアクションを利用することができます。
・aws:eks:pod-cpu-stress:ターゲットのPodにCPUの負荷をかけます。
・aws:eks:pod-delete:ターゲットのPodを削除します。
・aws:eks:pod-io-stress:ターゲットのPodにI/Oストレスをかけます。
・aws:eks:pod-memory-stress:ターゲットのPodにメモリの負荷をかけます。
前提条件
EKS Pod ActionsをEKS on Fargateで利用できるようにするには、ターゲットのPodが所属するnamespaceのFargate プロファイルで次のいずれかの条件を満たす必要があります。
・Fargate プロファイルのポッドセレクタでnamespaceだけを指定して、ラベルを条件に指定しない。
・Fargate プロファイルのポッドセレクタでnamespaceとラベルを条件に指定している場合には、ラベル条件にexperimentId = *を入れる。
EKS Pod Actionsを実行すると、fispodという名称のPodがターゲットのPodが所属するnamespaceで起動します。2023年7月現在、fispodには、任意のラベルを付与することはできません。
そのため、Fargateプロファイルのポッドセレクタでnamespaceだけを指定して、ラベルを条件に指定しないようにする必要があります。
もしくは、fispodには必ずexperimentIdというラベルが付与されるため、ポッドセレクタのラベルの条件でexperimentIdをキーに指定し、*を値に指定する必要があります。
Fargateプロファイルのポッドセレクタを更新することはできないため、ポッドセレクタの設定を変更する場合には、Fargate プロファイルの再作成が必要になります。
必要な権限設定
上記の前提条件を満たした後、まずは、Fault Injection Simulatorで使用するIAMロールを作成します。
信頼関係
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "fis.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
ロールに付与するIAMポリシー
{
"Statement": [
{
"Action": [
"logs:PutResourcePolicy",
"logs:DescribeResourcePolicies",
"logs:DescribeLogGroups",
"logs:CreateLogDelivery",
"eks:DescribeCluster",
"ec2:DescribeSubnets"
],
"Effect": "Allow",
"Resource": "*"
}
],
"Version": "2012-10-17"
}
続いてRole、RoleBinding、ServiceAccountをターゲットのPodが所属するnamespaceに作成します。
---
# Fault Injection Simulatorのサービスアカウント
apiVersion: v1
kind: ServiceAccount
metadata:
name: fis-sa
---
# Fault Injection Simulatorに必要な権限
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: fis-role
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"]
---
# Fault Injection SimulatorのサービスアカウントとユーザーをRoleにバインドする
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: bind-role-experiments
subjects:
- kind: ServiceAccount
name: fis-sa
- apiGroup: rbac.authorization.k8s.io
kind: User
name: fis-user
roleRef:
kind: Role
name: fis-role
apiGroup: rbac.authorization.k8s.io
次に、aws-authのConfigMapでIAMロールとUserの紐付けを行います。
apiVersion: v1
kind: ConfigMap
metadata:
name: aws-auth
namespace: kube-system
data:
mapRoles: |
- rolearn: arn:aws:iam::XXXXXXXXXXXX:role/fargate-profile-role
username: system:node:{{SessionName}}
groups:
- system:bootstrappers
- system:nodes
- system:node-proxier
- rolearn: 作成したIAMロールのARN #この部分を追加
username: fis-user #この部分を追加
実験テンプレートの作成
次に、AWSマネージメントコンソールから実験テンプレートを作成します。説明と名前を入力します。
続いて、ターゲットにて、ターゲットを追加します。
名前:入力します。
リソースタイプ:aws:eks:pod
clusterIdentifier:対象のEKSクラスターを選択
namespace:ターゲットのPodが所属するnamespaceを入力
selectorType:Podを特定する方法を選択します。labelSelector、deploymentName、podNameから選びます。
selectorValue:selectorTypeで選択したものの値を入力します。例えばlabelSelectorを選択した場合、対象のPodにラベルname: testというラベルがある場合には、name=testと入力します。
targetContainerName:Podに複数のコンテナがおり、特定のコンテナに対してアクションを行いたい場合には、対象のコンテナの名前を入力してください。
選択モード:対象のPodの数やパーセントを指定することができます。全てを指定している場合には、条件に合致する全てのPodに対してアクションが行われます。
次に、アクションです。
名前:アクションの名前を入力してください。
アクションタイプ:EKS Pod Actionsのアクションを指定してください。
ターゲット:先ほど作成したターゲットを指定してください。
kubernetesServiceAccount:今回作成したServiceAccountを入力してください。
作成したIAMロールを選択します。
ログの設定を行います。
設定は以上になります。実験テンプレートの作成を行なった後、実験を開始してください。
まとめ
今回はFault Injection SimulatorのEKS Pod ActionsをEKS on Fargateで利用する話を紹介しました。
前提条件に記載したfispodにラベルを指定できない制約の情報が見つかららず実装に時間を要したので、この記事がEKS on FargateでEKS Pod Actionsを利用したい方の参考になればと思います。
We’re hiring!
スタディストでは、一緒に働く仲間を募集しています。
EntranceBookはこちらをご参照ください。
採用情報はこちらをご参照ください。