本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 IAM 角色为服务账户设置访问权限 (IRSA)
默认情况下,Livy 服务器和 Spark 应用程序的驱动程序和执行器无权访问 Amazon 资源。服务器服务帐户和 spark 服务帐户控制 Livy 服务器和 Spark 应用程序的 pod 对 Amazon 资源的访问权限。要授予访问权限,您需要将服务账户映射到具有必要 Amazon 权限的 IAM 角色。
您可以在安装 Apache Livy 之前、安装期间或完成安装之后设置 IRSA 映射。
在安装 Apache Livy 时设置 IRSA(适用于服务器服务帐户)
注意
只有服务器服务帐户支持此映射。
-
确保你已经完成了在 EKS 上为亚马逊 EMR 设置 Apache Livy,并且正在在 EKS 上安装带有亚马逊 EMR 的 Apache Livy。
-
为 Livy 服务器创建一个 Kubernetes 命名空间。在此示例中,命名空间的名称为
livy-ns
。 -
创建一个 IAM 策略,其中包含您希望 Pod 访问的权限。 Amazon Web Services 以下示例创建了一个 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
-
使用以下命令将您的 Amazon Web Services 账户 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
-
使用以下命令创建信任策略文件。如果要向命名空间中的所有服务帐号授予该角色的访问权限,请复制以下命令,然后替换为
StringLike
并StringEquals
$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 安装命令将设置
serviceAccount.executionRoleArn
为映射 IRSA。以下是 Helm 安装命令的示例。您可以按地区 Amazon Web Services 区域 从 Amazon ECR 注册账户中找到相应的ECR-registry-account
值。helm install livy-demo \ oci://895885662937.dkr.ecr.us-west-2.amazonaws.com/livy \ --version 7.1.0 \ --namespace
livy-ns
\ --set image=ECR-registry-account.dkr.ecr.region-id
.amazonaws.com/livy/emr-7.1.0:latest \ --set sparkNamespace=spark-ns
\ --set serviceAccount.executionRoleArn=arn:aws:iam::123456789012:role/my-role
将 IRSA 映射到 Spark 服务账户
在将 IRSA 映射到 Spark 服务帐户之前,请确保您已完成以下项目:
-
确保你已经完成了在 EKS 上为亚马逊 EMR 设置 Apache Livy,并且正在在 EKS 上安装带有亚马逊 EMR 的 Apache Livy。
-
你的集群必须有一个现有的 IAM OpenID Connect (OIDC) 提供者。要查看您是否已有或如何创建一个,请参阅为您的集群创建 IAM OIDC 提供商。
-
确保您已安装了 0.171.0 或更高版本的 CL
eksctl
I 或。 Amazon 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