本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用服务账户的 IAM 角色(IRSA)设置访问权限
默认情况下,Livy 服务器和 Spark 应用程序的驱动程序和执行器无权访问 Amazon 资源。服务器服务帐户和 spark 服务帐户控制 Livy 服务器和 Spark 应用程序的 pod 对 Amazon 资源的访问权限。要授予访问权限,您需要将服务账户映射到具有必要 Amazon 权限的 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 访问的权限。 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
-
使用以下命令创建信任策略文件。如果要向命名空间内的所有服务账户授予角色访问权限,请复制以下命令,将
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 Web Services 区域 从 Amazon ECR 注册账户中找到相应的ECR-registry-account
值。helm install livy-demo \ oci://895885662937.dkr.ecr.us-west-2.amazonaws.com/livy \ --version 7.8.0 \ --namespace
livy-ns
\ --set image=ECR-registry-account.dkr.ecr.region-id
.amazonaws.com/livy/emr-7.8.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 或 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