使用服务账户的 IAM 角色(IRSA)设置访问权限
默认情况下,Livy 服务器和 Spark 应用程序的驱动程序和执行程序无权访问 AWS 资源。服务器服务账户和 Spark 服务账户控制对 Livy 服务器和 Spark 应用程序容器组(pod)AWS 资源的访问。要授予访问权限,您需要将服务账户映射到具有必要 AWS 权限的 IAM 角色。
您可以在安装 Apache Livy 之前、安装过程中或安装完成后设置 IRSA 映射。
在安装 Apache Livy 过程中设置 IRSA(适用于服务器服务账户)
注意
只有服务器服务账户支持此映射。
-
确保已完成设置适用于 Amazon EMR on EKS 的 Apache Livy,并正在使用 Amazon EMR on EKS 安装 Apache Livy。
-
为 Livy 服务器创建 Kubernetes 命名空间。在此示例中,应用程序名称为
livy-ns
。 -
创建一个 IAM 策略,其中包含您希望容器组(pod)访问的 AWS 服务 权限。以下示例创建了一个 IAM 策略,用于获取 Spark 入口点的 Amazon S3 资源。
cat >
my-policy.json
<<EOF{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-spark-entrypoint-bucket
" } ] } EOF aws iam create-policy --policy-namemy-policy
--policy-document file://my-policy.json
-
使用以下命令将 AWS 账户 ID 设置为变量。
account_id=$(aws sts get-caller-identity --query "Account" --output text)
-
将集群的 OpenID Connect(OIDC)身份提供程序设置为环境变量。
oidc_provider=$(aws eks describe-cluster --name
my-cluster
--region $AWS_REGION --query "cluster.identity.oidc.issuer" --output text | sed -e "s/^https:\/\///") -
为服务账户的命名空间和名称设置变量。务必使用您自己的值。
export namespace=default export service_account=my-service-account
-
使用以下命令创建信任策略文件。如果要向命名空间内的所有服务账户授予角色访问权限,请复制以下命令,将
StringEquals
替换为StringLike
,将$service_account
替换为*
。cat >trust-relationship.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::$account_id:oidc-provider/$oidc_provider" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "$oidc_provider:aud": "sts.amazonaws.com", "$oidc_provider:sub": "system:serviceaccount:$namespace:$service_account" } } } ] } EOF
-
创建角色。
aws iam create-role --role-name
my-role
--assume-role-policy-document file://trust-relationship.json --description "my-role-description
" -
使用以下 Helm install 命令设置
serviceAccount.executionRoleArn
以映射 IRSA。以下是 Helm install 命令的示例。您可以从按区域划分的 Amazon ECR 注册表账户中找到 AWS 区域 的相应ECR-registry-account
值。helm install livy-demo \ oci://895885662937.dkr.ecr.us-west-2.amazonaws.com/livy \ --version 7.3.0 \ --namespace
livy-ns
\ --set image=ECR-registry-account.dkr.ecr.region-id
.amazonaws.com/livy/emr-7.3.0:latest \ --set sparkNamespace=spark-ns
\ --set serviceAccount.executionRoleArn=arn:aws:iam::123456789012:role/my-role
将 IRSA 映射到 Spark 服务账户
将 IRSA 映射到 Spark 服务账户之前,请确保已完成以下项目:
-
确保已完成设置适用于 Amazon EMR on EKS 的 Apache Livy,并正在使用 Amazon EMR on EKS 安装 Apache Livy。
-
您的集群必须具有现有的 IAM OpenID Connect(OIDC)提供程序。要查看您是否拥有提供程序或如何创建,请参阅为集群创建 IAM OIDC 提供程序。
-
确保您已安装 0.171.0 或更高版本的
eksctl
CLI 或 AWS CloudShell。要安装或更新eksctl
,请参阅eksctl
文档中的安装。
按照以下步骤将 IRSA 映射到 Spark 服务账户:
-
使用以下命令获取 Spark 服务账户。
SPARK_NAMESPACE=
<spark-ns>
LIVY_APP_NAME=<livy-app-name>
kubectl --namespace $SPARK_NAMESPACE describe sa -l "app.kubernetes.io/instance=$LIVY_APP_NAME" | awk '/^Name:/ {print $2}' -
为服务账户的命名空间和名称设置变量。
export namespace=
default
export service_account=my-service-account
-
使用以下命令为 IAM 角色创建信任策略文件。下面的示例允许命名空间内的所有服务账户使用该角色。为此,请将
StringEquals
替换为StringLike
,将$service_account
替换为 *。cat >trust-relationship.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::$account_id:oidc-provider/$oidc_provider" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "$oidc_provider:aud": "sts.amazonaws.com", "$oidc_provider:sub": "system:serviceaccount:$namespace:$service_account" } } } ] } EOF
-
创建角色。
aws iam create-role --role-name
my-role
--assume-role-policy-document file://trust-relationship.json
--description "my-role-description" -
使用以下
eksctl
命令映射服务器或 Spark 服务账户。务必使用您自己的值。eksctl create iamserviceaccount --name
spark-sa
\ --namespace spark-namespace --clusterlivy-eks-cluster
\ --attach-role-arn arn:aws:iam::0123456789012
:role/my-role
\ --approve --override-existing-serviceaccounts