启用 Amazon EMR on EKS 的集群访问 - Amazon EMR

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

启用 Amazon EMR on EKS 的集群访问

您必须通过执行以下操作来允许 Amazon EMR on EKS 访问集群中的特定命名空间:创建 Kubernetes 角色、将角色绑定到 Kubernetes 用户以及将 Kubernetes 用户映射为服务关联角色 AWSServiceRoleForAmazonEMRContainers。当 IAM 身份映射命令与 emr-containers 一起作为服务名称时,这些操作在 eksctl 中自动执行。您可以使用以下命令轻松地执行这些操作。

eksctl create iamidentitymapping \ --cluster my_eks_cluster \ --namespace kubernetes_namespace \ --service-name "emr-containers"

用 Amazon EKS 集群的名称来替换 my_eks_cluster,并使用创建用来运行 Amazon EMR 工作负载的 Kubernetes 命名空间来替换 kubernetes_namespace

重要

您必须使用前一步骤安装 eksctl下载最新的 eksctl 以使用此功能。

执行手动步骤以启用 Amazon EMR on EKS 的集群访问

您还可以使用以下手动步骤来启用 Amazon EMR on EKS 的集群访问。

  1. 在特定命名空间中创建 Kubernetes 角色

    Amazon EKS 1.22 - 1.29

    在 Amazon EKS 1.22-1.29 中,运行以下命令在特定命名空间中创建 Kubernetes 角色。此角色向 Amazon EMR on EKS 授予必要的 RBAC 权限。

    namespace=my-namespace cat - >>EOF | kubectl apply -f - >>namespace "${namespace}" apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: emr-containers namespace: ${namespace} rules: - apiGroups: [""] resources: ["namespaces"] verbs: ["get"] - apiGroups: [""] resources: ["serviceaccounts", "services", "configmaps", "events", "pods", "pods/log"] verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "deletecollection", "annotate", "patch", "label"] - apiGroups: [""] resources: ["secrets"] verbs: ["create", "patch", "delete", "watch"] - apiGroups: ["apps"] resources: ["statefulsets", "deployments"] verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "annotate", "patch", "label"] - apiGroups: ["batch"] resources: ["jobs"] verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "annotate", "patch", "label"] - apiGroups: ["extensions", "networking.k8s.io"] resources: ["ingresses"] verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "annotate", "patch", "label"] - apiGroups: ["rbac.authorization.k8s.io"] resources: ["roles", "rolebindings"] verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "deletecollection", "annotate", "patch", "label"] - apiGroups: [""] resources: ["persistentvolumeclaims"] verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "deletecollection", "annotate", "patch", "label"] EOF
    Amazon EKS 1.21 and below

    使用 Amazon EKS 1.21 及更低版本,运行以下命令以在特定命名空间中创建 Kubernetes 角色。此角色向 Amazon EMR on EKS 授予必要的 RBAC 权限。

    namespace=my-namespace cat - >>EOF | kubectl apply -f - >>namespace "${namespace}" apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: emr-containers namespace: ${namespace} rules: - apiGroups: [""] resources: ["namespaces"] verbs: ["get"] - apiGroups: [""] resources: ["serviceaccounts", "services", "configmaps", "events", "pods", "pods/log"] verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "deletecollection", "annotate", "patch", "label"] - apiGroups: [""] resources: ["secrets"] verbs: ["create", "patch", "delete", "watch"] - apiGroups: ["apps"] resources: ["statefulsets", "deployments"] verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "annotate", "patch", "label"] - apiGroups: ["batch"] resources: ["jobs"] verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "annotate", "patch", "label"] - apiGroups: ["extensions"] resources: ["ingresses"] verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "annotate", "patch", "label"] - apiGroups: ["rbac.authorization.k8s.io"] resources: ["roles", "rolebindings"] verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "deletecollection", "annotate", "patch", "label"] - apiGroups: [""] resources: ["persistentvolumeclaims"] verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "deletecollection", "annotate", "patch", "label"] EOF
  2. 创建作用域为命名空间的 Kubernetes 角色绑定

    运行以下命令以创建绑定在特定命名空间中的 Kubernetes 角色。此角色绑定将在上一步中创建的角色中定义的权限授予名为 emr-containers 的用户。此用户确定 Amazon EMR on EKS 的服务相关角色,因此允许 Amazon EMR on EKS 执行由您创建的角色所定义的操作。

    namespace=my-namespace cat - <<EOF | kubectl apply -f - --namespace "${namespace}" apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: emr-containers namespace: ${namespace} subjects: - kind: User name: emr-containers apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: emr-containers apiGroup: rbac.authorization.k8s.io EOF
  3. 更新 Kubernetes aws-auth 配置映射

    您可以使用以下选项之一将 Amazon EMR on EKS 与服务关联的角色映射到 emr-containers 用户,并且该用户在上一步中绑定了 Kubernetes 角色。

    选项 1:使用 eksctl

    运行以下 eksctl 命令:将 Amazon EMR on EKS 服务相关角色映射到 emr-containers 用户。

    eksctl create iamidentitymapping \ --cluster my-cluster-name \ --arn "arn:aws:iam::my-account-id:role/AWSServiceRoleForAmazonEMRContainers" \ --username emr-containers

    选项 2:不使用 eksctl

    1. 运行以下命令可在文本编辑器中打开 aws-auth 配置映射。

      kubectl edit -n kube-system configmap/aws-auth
      注意

      如果您收到错误信息Error from server (NotFound): configmaps "aws-auth" not found,请参阅 Amazon EKS 用户指南中添加用户角色中的步骤来应用该股票 ConfigMap。

    2. data 下,将 Amazon EMR on EKS 服务相关角色详细信息添加到 ConfigMapmapRoles 部分。如果此部分在文件中尚不存在,请添加它。已更新的 mapRoles 部分类似于以下示例。

      apiVersion: v1 data: mapRoles: | - rolearn: arn:aws:iam::<your-account-id>:role/AWSServiceRoleForAmazonEMRContainers username: emr-containers - ... <other previously existing role entries, if there's any>.
    3. 保存文件并退出文本编辑器。

在 EKS 上自动启用对 Amazon EMR 的集群访问权限

Amazon EMR 已与 A mazon EKS 集群访问管理 (CAM) 集成,因此您可以自动配置必要的 AuthN 和 AuthZ 策略,以便在亚马逊 EKS 集群的命名空间中运行 Amazon EMR Spark 任务。当您从 Amazon EKS 集群命名空间创建虚拟集群时,Amazon EMR 会自动配置所有必要的权限,因此您无需在当前的工作流程中添加任何额外的步骤。

注意

Amazon EKS 访问条目最多仅支持 100 个命名空间。如果您拥有超过 100 个虚拟集群,Amazon EMR 在您创建任何新的虚拟集群时将不会使用访问入口 API。在运行 ListVirtualClusters API 操作或 list-virtual-clusters CLI 命令时,您可以通过将eksAccessEntryIntegrated参数设置为 true 来查看哪些集群启用了访问入口集成。该命令返回所有适用虚拟集群的唯一标识符。

先决条件

  • 确保你运行的是 2.15.3 或更高版本的 AWS CLI

  • 您的 Amazon EKS 集群必须使用版本 1.23 或更高版本。

设置

要在 Amazon EMR 和 Amazon EKS AccessEntry 的 API 操作之间设置集成,请确保您已完成以下各项:

  • 确保authenticationMode您的 Amazon EKS 集群的集群设置为API_AND_CONFIG_MAP

    aws eks describe-cluster --name <eks-cluster-name>

    如果还没有,请将其设置authenticationModeAPI_AND_CONFIG_MAP

    aws eks update-cluster-config --name <eks-cluster-name> --access-config authenticationMode=API_AND_CONFIG_MAP

    有关身份验证模式的更多信息,请参阅集群身份验证模式

  • 确保您用于运行CreateVirtualClusterDeleteVirtualCluster API 操作的 I AM 角色也具有以下权限:

    { "Effect": "Allow", "Action": [ "eks:DescribeAccessEntry", "eks:CreateAccessEntry", "eks:DeleteAccessEntry", "eks:ListAssociatedAccessPolicies", "eks:AssociateAccessPolicy", "eks:DisassociateAccessPolicy" ], "Resource": "*" }

概念和术语

以下是与 Amazon EKS CAM 相关的术语和概念列表。

  • 虚拟集群 (VC) — 在 Amazon EKS 中创建的命名空间的逻辑表示形式。这是指向 Amazon EKS 集群命名空间的 1:1 链接。您可以使用它在指定命名空间内的 Amazon EKS 集群上运行 Amazon EMR 工作负载。

  • 命名空间 — 隔离单个 EKS 集群内资源组的机制。

  • 访问策略 — 向 EKS 集群中的 IAM 角色授予访问权限和操作权限的权限。

  • 访问条目 — 使用角色 arn 创建的条目。您可以将访问条目关联到访问策略,以便在 Amazon EKS 集群中分配特定权限。

  • EKS 访问入口集成虚拟集群 — 使用来自 Amazon EKS 的访问入口 API 操作创建的虚拟集群。