Amazon EMR on EKS에 대한 클러스터 액세스 활성화 - Amazon EMR

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon EMR on EKS에 대한 클러스터 액세스 활성화

다음 섹션에서는 클러스터 액세스를 활성화하는 몇 가지 방법을 보여줍니다. 첫 번째에서는 Amazon EKS 클러스터 액세스 관리(CAM)를 사용하며, 두 번째에서는 클러스터 액세스를 활성화하기 위한 수동 단계를 수행하는 방법을 보여줍니다.

EKS 액세스 항목을 사용하여 클러스터 액세스 활성화(권장)

참고

aws-auth ConfigMap은 더 이상 사용되지 않습니다. Kubernetes API에 대한 액세스를 관리하는 데 권장되는 방법은 액세스 항목입니다.

Amazon EMR은 Amazon EKS 클러스터 액세스 관리(CAM)와 통합되어 있으므로, 필요한 AuthN 및 AuthZ 정책의 구성을 자동화하여 Amazon EKS 클러스터의 네임스페이스에서 Amazon EMR Spark 작업을 실행할 수 있습니다. Amazon EKS 클러스터 네임스페이스에서 가상 클러스터를 생성하는 경우 Amazon EMR은 필요한 모든 권한을 자동으로 구성하므로 현재 워크플로에 단계를 추가하지 않아도 됩니다.

참고

Amazon EKS CAM과 Amazon EMR의 통합은 새로운 Amazon EMR on EKS 가상 클러스터에 대해서만 지원됩니다. 이 통합을 사용하기 위해 기존 가상 클러스터를 마이그레이션할 수 없습니다.

사전 조건

  • AWS CLI의 버전 2.15.3 이상을 실행 중인지 확인합니다.

  • Amazon EKS 클러스터는 버전 1.23 이상에 있어야 합니다.

설정

Amazon EKS에서 AccessEntry API 작업과 Amazon EMR 간 통합을 설정하려면 다음 항목을 완료해야 합니다.

  • Amazon EKS 클러스터의 authenticationModeAPI_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 작업을 실행하는 데 사용하는 IAM 역할에 다음 권한도 있는지 확인합니다.

    { "Effect": "Allow", "Action": [ "eks:CreateAccessEntry" ], "Resource": "arn:<AWS_PARTITION>:eks:<AWS_REGION>:<AWS_ACCOUNT_ID>:cluster/<EKS_CLUSTER_NAME>" }, { "Effect": "Allow", "Action": [ "eks:DescribeAccessEntry", "eks:DeleteAccessEntry", "eks:ListAssociatedAccessPolicies", "eks:AssociateAccessPolicy", "eks:DisassociateAccessPolicy" ], "Resource": "arn:<AWS_PARTITION>:eks:<AWS_REGION>:<AWS_ACCOUNT_ID>:access-entry/<EKS_CLUSTER_NAME>/role/<AWS_ACCOUNT_ID>/AWSServiceRoleForAmazonEMRContainers/*" }

개념 및 용어

다음은 Amazon EKS CAM과 관련된 용어 및 개념 목록입니다.

  • 가상 클러스터(VC) - Amazon EKS에서 생성된 네임스페이스의 논리적 표현. Amazon EKS 클러스터 네임스페이스에 대한 1:1 링크입니다. 이를 사용하여 지정된 네임스페이스 내 Amazon EKS 클러스터에서 Amazon EMR 워크로드를 실행할 수 있습니다.

  • 네임스페이스 - 단일 EKS 클러스터 내에서 리소스 그룹을 격리하는 메커니즘.

  • 액세스 정책 - EKS 클러스터 내의 IAM 역할에 액세스 및 작업을 부여하는 권한.

  • 액세스 항목 - 역할 ARN으로 생성된 항목. 액세스 항목을 액세스 정책에 연결하여 Amazon EKS 클러스터에서 특정 권한을 할당할 수 있습니다.

  • EKS 액세스 항목 통합 가상 클러스터 - Amazon EKS의 액세스 항목 API 작업을 사용하여 생성된 가상 클러스터.

aws-auth를 사용하여 클러스터 액세스 활성화

Kubernetes 역할을 생성하고, 이 역할을 Kubernetes 사용자에게 바인딩하며, Kubernetes 사용자를 서비스 연결 역할 AWSServiceRoleForAmazonEMRContainers에 매핑하는 등의 작업을 수행함으로써 Amazon EMR on EKS에서 클러스터의 특정 네임스페이스에 액세스할 수 있도록 허용해야 합니다. emr-containers에서 IAM ID 매핑 명령을 서비스 이름으로 사용하면 이러한 작업이 eksctl에서 자동화됩니다. 다음 명령을 사용하여 이러한 작업을 쉽게 수행할 수 있습니다.

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

my_eks_cluster를 Amazon EKS 클러스터 이름으로, kubernetes_namespace를 Amazon EMR 워크로드 실행을 위해 생성한 Kubernetes 네임스페이스로 바꿉니다.

중요

이 기능을 사용하려면 이전 단계(kubectl 및 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 서비스 연결 역할을 이전 단계에서 Kubernetes 역할에 바인딩된 emr-containers 사용자와 매핑할 수 있습니다.

    옵션 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. Amazon EMR on EKS 서비스 연결 역할 세부 정보를 data 아래 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. 파일을 저장하고 텍스트 편집기를 종료합니다.