サービスアカウント用 IAM ロール (IRSA、IAM roles for service accounts) でクラスターアクセス権限を設定する
このセクションでは、AWS Identity and Access Management ロールを引き受けるように Kubernetes サービスアカウントを設定する方法を例を示して説明します。これにより、サービスアカウントを使用するポッドが、ロールにアクセス権限がある任意の AWS サービスにアクセスできるようになります。
以下の例では、Spark アプリケーションを実行して Amazon S3 内のファイルの単語をカウントします。これを行うには、サービスアカウント用 IAM ロール (IRSA、IAM roles for service accounts) を設定して、Kubernetes サービスアカウントを認証および認可します。
注記
この例では、Spark 演算子と Spark アプリケーションを送信する名前空間に「spark-operator」名前空間を使用しています。
前提条件
このページの例を試す前に、以下の前提条件を完了します。
-
お気に入りの詩を
poem.txt
という名前のテキストファイルに保存し、このファイルを S3 バケットにアップロードします。このページで作成した Spark アプリケーションは、テキストファイルの内容を読み取ります。S3 にファイルをアップロードする際の詳細については、「Amazon Simple Storage Service ユーザーガイド」の「バケットにオブジェクトをアップロードする」を参照してください。
IAM ロールを引き受けるように Kubernetes サービスアカウントを設定する
以下の手順に従って、Kubernetes サービスアカウントを設定し、AWS サービスにアクセスするためにポッドが使用できる IAM ロール (同サービスにアクセス権限を持つ) を引き受けるようにします。
-
前提条件 を完了したら、AWS Command Line Interface を使用して、Amazon S3 にアップロードしたファイルへの読み取り専用アクセスを許可する
example-policy.json
ファイルを作成します。cat >example-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::
my-pod-bucket
", "arn:aws:s3:::my-pod-bucket
/*" ] } ] } EOF -
続いて、IAM ポリシー
example-policy
を作成します。aws iam create-policy --policy-name example-policy --policy-document file://example-policy.json
-
次に、IAM ロール
example-role
を作成し、それを Spark ドライバーの Kubernetes サービスアカウントに関連付けます。eksctl create iamserviceaccount --name driver-account-sa --namespace spark-operator \ --cluster my-cluster --role-name "example-role" \ --attach-policy-arn arn:aws:iam::
111122223333
:policy/example-policy --approve -
Spark ドライバーサービスアカウントに必要なクラスターロールバインディングを含む yaml ファイルを作成します。
cat >spark-rbac.yaml <<EOF apiVersion: v1 kind: ServiceAccount metadata: name: driver-account-sa --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: spark-role roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: edit subjects: - kind: ServiceAccount name: driver-account-sa namespace: spark-operator EOF
-
クラスターロールバインディング設定を適用します。
kubectl apply -f spark-rbac.yaml
kubectl コマンドを実行すると、アカウントが正常に作成されたことを確認できます。
serviceaccount/driver-account-sa created
clusterrolebinding.rbac.authorization.k8s.io/spark-role configured
Spark 演算子からアプリケーションを実行する
Kubernetes サービスアカウントを設定すると、前提条件 の一部としてアップロードしたテキストファイル内の単語数をカウントする Spark アプリケーションを実行できます。
-
ワードカウントアプリケーションの
SparkApplication
定義を含む新しいファイルword-count.yaml
を作成します。cat >word-count.yaml <<EOF apiVersion: "sparkoperator.k8s.io/v1beta2" kind: SparkApplication metadata: name: word-count namespace: spark-operator spec: type: Java mode: cluster image: "895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.10.0:latest" imagePullPolicy: Always mainClass: org.apache.spark.examples.JavaWordCount mainApplicationFile: local:///usr/lib/spark/examples/jars/spark-examples.jar arguments: - s3://
my-pod-bucket
/poem.txt hadoopConf: # EMRFS filesystem fs.s3.customAWSCredentialsProvider: com.amazonaws.auth.WebIdentityTokenCredentialsProvider fs.s3.impl: com.amazon.ws.emr.hadoop.fs.EmrFileSystem fs.AbstractFileSystem.s3.impl: org.apache.hadoop.fs.s3.EMRFSDelegate fs.s3.buffer.dir: /mnt/s3 fs.s3.getObject.initialSocketTimeoutMilliseconds: "2000" mapreduce.fileoutputcommitter.algorithm.version.emr_internal_use_only.EmrFileSystem: "2" mapreduce.fileoutputcommitter.cleanup-failures.ignored.emr_internal_use_only.EmrFileSystem: "true" sparkConf: # Required for EMR Runtime spark.driver.extraClassPath: /usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/home/hadoop/extrajars/* spark.driver.extraLibraryPath: /usr/lib/hadoop/lib/native:/usr/lib/hadoop-lzo/lib/native:/docker/usr/lib/hadoop/lib/native:/docker/usr/lib/hadoop-lzo/lib/native spark.executor.extraClassPath: /usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/home/hadoop/extrajars/* spark.executor.extraLibraryPath: /usr/lib/hadoop/lib/native:/usr/lib/hadoop-lzo/lib/native:/docker/usr/lib/hadoop/lib/native:/docker/usr/lib/hadoop-lzo/lib/native sparkVersion: "3.3.1" restartPolicy: type: Never driver: cores: 1 coreLimit: "1200m" memory: "512m" labels: version: 3.3.1 serviceAccount: my-spark-driver-sa executor: cores: 1 instances: 1 memory: "512m" labels: version: 3.3.1 EOF -
Spark アプリケーションを送信します。
kubectl apply -f word-count.yaml
kubectl コマンドは、
word-count
というSparkApplication
オブジェクトが正常に作成されたことを示す確認を返します。sparkapplication.sparkoperator.k8s.io/word-count configured
-
SparkApplication
オブジェクトのイベントを確認するには、以下のコマンドを実行します。kubectl describe sparkapplication word-count -n spark-operator
kubectl コマンドは、
SparkApplication
の説明とイベントを返します。Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SparkApplicationSpecUpdateProcessed 3m2s (x2 over 17h) spark-operator Successfully processed spec update for SparkApplication word-count Warning SparkApplicationPendingRerun 3m2s (x2 over 17h) spark-operator SparkApplication word-count is pending rerun Normal SparkApplicationSubmitted 2m58s (x2 over 17h) spark-operator SparkApplication word-count was submitted successfully Normal SparkDriverRunning 2m56s (x2 over 17h) spark-operator Driver word-count-driver is running Normal SparkExecutorPending 2m50s spark-operator Executor [javawordcount-fdd1698807392c66-exec-1] is pending Normal SparkExecutorRunning 2m48s spark-operator Executor [javawordcount-fdd1698807392c66-exec-1] is running Normal SparkDriverCompleted 2m31s (x2 over 17h) spark-operator Driver word-count-driver completed Normal SparkApplicationCompleted 2m31s (x2 over 17h) spark-operator SparkApplication word-count completed Normal SparkExecutorCompleted 2m31s (x2 over 2m31s) spark-operator Executor [javawordcount-fdd1698807392c66-exec-1] completed
アプリケーションが S3 ファイル内の単語数をカウントするようになりました。単語数を確認するには、ドライバーのログファイルを参照してください。
kubectl logs pod/word-count-driver -n spark-operator
kubectl コマンドは、ワードカウントアプリケーションの結果を含むログファイルの内容を返します。
INFO DAGScheduler: Job 0 finished: collect at JavaWordCount.java:53, took 5.146519 s
Software: 1
Spark 演算子を使用して Spark にアプリケーションを送信する方法の詳細については、GitHub の Apache Spark 用 Kubernetes 演算子 (spark-on-k8s-operator) ドキュメントの「Using a SparkApplication