Amazon EKS 프라이빗 AWS Batch 클러스터에서 시작하기 - AWS Batch

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

Amazon EKS 프라이빗 AWS Batch 클러스터에서 시작하기

AWS Batch Amazon Elastic Kubernetes Service (Amazon EKS) 클러스터의 배치 워크로드를 오케스트레이션하는 관리형 서비스입니다. 여기에는 대기열, 종속성 추적, 작업 재시도 및 우선 순위 관리, 포드 관리, 노드 조정 등이 포함됩니다. 이 기능은 기존 프라이빗 Amazon EKS 클러스터를 AWS Batch 연결하여 대규모 작업을 실행합니다. eksctl(Amazon EKS용 명령줄 인터페이스), AWS 콘솔 또는 를 사용하여 다른 모든 필수 리소스가 포함된 프라이빗 Amazon EKS 클러스터를 생성할 수 있습니다. AWS Command Line Interface 프라이빗 Amazon EKS 클러스터에 대한 AWS Batch 지원은 일반적으로 가능한 경우 상업용으로 AWS 리전 제공됩니다. AWS Batch

Amazon EKS 프라이빗 전용 클러스터는 인바운드/아웃바운드 인터넷 액세스가 없고 프라이빗 서브넷만 있습니다. Amazon VPC 엔드포인트는 다른 서비스에 대한 프라이빗 액세스를 지원하는 데 사용됩니다. AWS eksctl기존 Amazon VPC 및 서브넷을 사용하여 완전 사설 클러스터를 생성할 수 있습니다. eksctl또한 제공된 Amazon VPC에 Amazon VPC 엔드포인트를 생성하고 제공된 서브넷의 라우팅 테이블을 수정합니다.

기본 라우팅 테이블을 eksctl 수정하지 않으므로 각 서브넷에는 명시적인 라우팅 테이블이 연결되어 있어야 합니다. 클러스터는 Amazon VPC에 있는 컨테이너 레지스트리에서 이미지를 가져와야 합니다. 또한 Amazon VPC에 Amazon Elastic 컨테이너 레지스트리를 생성하고 노드가 가져올 수 있도록 컨테이너 이미지를 복사할 수 있습니다. 자세한 내용은 한 리포지토리에서 다른 리포지토리로 컨테이너 이미지 복사를 참조하십시오. Amazon ECR 프라이빗 리포지토리를 시작하려면 Amazon ECR 프라이빗 리포지토리를 참조하십시오.

Amazon ECR을 사용하여 풀스루 캐시 규칙을 생성할 수도 있습니다. 외부 공용 레지스트리에 대한 풀스루 캐시 규칙이 생성되면 Amazon ECR 사설 레지스트리 uriform 리소스 식별자 (URI) 를 사용하여 외부 공용 레지스트리에서 이미지를 가져올 수 있습니다. 그런 다음 Amazon ECR은 리포지토리를 생성하고 이미지를 캐싱합니다. Amazon ECR 사설 레지스트리 URI를 사용하여 캐시된 이미지를 가져오면 Amazon ECR은 원격 레지스트리를 검사하여 새 버전의 이미지가 있는지 확인하고 사설 레지스트리를 최대 24시간마다 한 번씩 업데이트합니다.

필수 조건

이 자습서를 시작하기 전에 Amazon EKS 리소스와 Amazon EKS 리소스를 모두 AWS Batch 생성하고 관리하는 데 필요한 다음 도구 및 리소스를 설치하고 구성해야 합니다. 또한 VPC, 서브넷, 라우팅 테이블, VPC 엔드포인트 및 Amazon EKS 클러스터를 포함하여 필요한 모든 리소스를 생성해야 합니다. AWS CLI를 사용해야 합니다.

  • AWS CLI— Amazon EKS를 비롯한 AWS 서비스와 함께 사용할 수 있는 명령줄 도구입니다. 이 가이드에서는 버전 2.8.6 이상 또는 1.26.0 이상을 사용해야 합니다. 자세한 내용은 AWS Command Line Interface 사용 설명서AWS CLI의 설치, 업데이트, 제거를 참조하세요.

    를 설치한 AWS CLI후에는 구성하는 것이 좋습니다. 자세한 내용은 AWS Command Line Interface 사용 설명서에서 aws configure를 사용한 빠른 구성을 참조하세요.

  • kubectl— Kubernetes 클러스터와 함께 작동하기 위한 명령줄 도구입니다. 이 가이드에서는 버전 1.23 이상을 사용해야 합니다. 자세한 내용은 Amazon EKS 사용 설명서kubectl 설치 또는 업데이트를 참조하세요.

  • eksctl— Amazon EKS 클러스터와 연동하여 많은 개별 작업을 자동화하는 명령줄 도구입니다. 이 가이드에서는 버전 0.115.0 이상을 사용해야 합니다. 자세한 내용은 Amazon EKS 사용 설명서eksctl 설치 또는 업데이트를 참조하세요.

  • 필수 AWS Identity and Access Management (IAM) 권한 — 사용 중인 IAM 보안 주체는 Amazon EKS IAM 역할 및 서비스 연결 역할, AWS CloudFormation VPC 및 관련 리소스를 사용할 수 있는 권한을 가지고 있어야 합니다. 자세한 내용은 IAM 사용 설명서의 Amazon Elastic Kubernetes Service의 작업, 리소스 및 조건 키 및 서비스 연결 역할 사용을 참조하십시오. 이 가이드의 모든 단계를 동일한 사용자로 완료해야 합니다.

  • Amazon EKS 클러스터 생성 — 자세한 내용은 Amazon EKS 사용 설명서의 Amazon EKS 시작하기를 참조하십시오. eksctl

    참고

    AWS Batch CoreDNS 또는 기타 배포 포드에 대한 관리형 노드 오케스트레이션을 제공하지 않습니다. CoreDNS가 필요한 경우 Amazon EKS 사용 설명서CoreDNS Amazon EKS 애드온 추가를 참조하세요. 또는 eksctl create cluster create를 사용하여 클러스터를 생성합니다. 클러스터에는 기본적으로 CoreDNS가 포함됩니다.

  • 권한 — Amazon EKS 리소스를 사용하는 컴퓨팅 환경을 만들기 위해 CreateComputeEnvironmentAPI 작업을 호출하는 사용자는 eks:DescribeCluster API 작업에 대한 권한이 필요합니다. 를 사용하여 Amazon EKS 리소스를 사용하여 컴퓨팅 리소스를 AWS Management Console 생성하려면 eks:DescribeClustereks:ListClusters 모두에 대한 권한이 필요합니다.

  • 샘플 구성 파일을 사용하여 us-east-1 리전에 프라이빗 EKS 클러스터를 생성합니다. eksctl

    kind: ClusterConfig apiVersion: eksctl.io/v1alpha5 availabilityZones: - us-east-1a - us-east-1b - us-east-1d managedNodeGroups: privateNetworking: true privateCluster: enabled: true skipEndpointCreation: false

    다음 명령을 사용하여 리소스를 생성합니다. eksctl create cluster -f clusterConfig.yaml

  • Batch Managed 노드는 필요한 VPC 인터페이스 엔드포인트가 있는 서브넷에 배포해야 합니다. 자세한 내용은 프라이빗 클러스터 요구 사항을 참조하십시오.

1단계: EKS 클러스터 준비 AWS Batch

필요한 단계는 다음과 같습니다.

  1. 작업 전용 네임스페이스 생성 AWS Batch

    kubectl을 사용하여 새 네임스페이스를 생성합니다.

    $ namespace=my-aws-batch-namespace $ cat - <<EOF | kubectl create -f - { "apiVersion": "v1", "kind": "Namespace", "metadata": { "name": "${namespace}", "labels": { "name": "${namespace}" } } } EOF

    출력:

    namespace/my-aws-batch-namespace created
  2. 역할 기반 액세스 제어(RBAC)를 통한 액세스 활성화

    kubectl을 사용하여 AWS Batch 가 노드와 포드를 감시하도록 하는 클러스터에 대한 Kubernetes 역할을 생성하고 역할을 바인딩합니다. 각 Amazon EKS 클러스터에 대해 이 작업을 한 번 수행해야 합니다.

    참고

    RBAC 승인에 대한 자세한 내용은 Kubernetes 설명서RBAC 승인 사용을 참조하세요.

    $ cat - <<EOF | kubectl apply -f - apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: aws-batch-cluster-role rules: - apiGroups: [""] resources: ["namespaces"] verbs: ["get"] - apiGroups: [""] resources: ["nodes"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["configmaps"] verbs: ["get", "list", "watch"] - apiGroups: ["apps"] resources: ["daemonsets", "deployments", "statefulsets", "replicasets"] verbs: ["get", "list", "watch"] - apiGroups: ["rbac.authorization.k8s.io"] resources: ["clusterroles", "clusterrolebindings"] verbs: ["get", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: aws-batch-cluster-role-binding subjects: - kind: User name: aws-batch apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: aws-batch-cluster-role apiGroup: rbac.authorization.k8s.io EOF

    출력:

    clusterrole.rbac.authorization.k8s.io/aws-batch-cluster-role created clusterrolebinding.rbac.authorization.k8s.io/aws-batch-cluster-role-binding created

    포드를 관리하고 수명 주기를 AWS Batch 연장할 네임스페이스 범위 Kubernetes 역할을 생성하고 바인딩하십시오. 이 작업은 각 고유 네임스페이스마다 한 번씩 수행해야 합니다.

    $ namespace=my-aws-batch-namespace $ cat - <<EOF | kubectl apply -f - --namespace "${namespace}" apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: aws-batch-compute-environment-role namespace: ${namespace} rules: - apiGroups: [""] resources: ["pods"] verbs: ["create", "get", "list", "watch", "delete", "patch"] - apiGroups: [""] resources: ["serviceaccounts"] verbs: ["get", "list"] - apiGroups: ["rbac.authorization.k8s.io"] resources: ["roles", "rolebindings"] verbs: ["get", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: aws-batch-compute-environment-role-binding namespace: ${namespace} subjects: - kind: User name: aws-batch apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: aws-batch-compute-environment-role apiGroup: rbac.authorization.k8s.io EOF

    출력:

    role.rbac.authorization.k8s.io/aws-batch-compute-environment-role created rolebinding.rbac.authorization.k8s.io/aws-batch-compute-environment-role-binding created

    Kubernetesaws-auth구성 맵을 업데이트하여 이전 RBAC 권한을 서비스 연결 역할에 매핑하세요. AWS Batch

    $ eksctl create iamidentitymapping \ --cluster my-cluster-name \ --arn "arn:aws:iam::<your-account>:role/AWSServiceRoleForBatch" \ --username aws-batch

    출력:

    2022-10-25 20:19:57 [ℹ] adding identity "arn:aws:iam::<your-account>:role/AWSServiceRoleForBatch" to auth ConfigMap
    참고

    서비스 연결 역할의 ARN에서 aws-service-role/batch.amazonaws.com/ 경로가 제거되었습니다. 이는 구성 맵에 aws-auth 문제가 있기 때문입니다. 자세한 내용은 경로가 의 ARN에 포함된 경우 경로가 있는 역할이 작동하지 않음을 참조하십시오. aws-auth configmap

2단계: Amazon EKS 컴퓨팅 환경 생성

AWS Batch 컴퓨팅 환경은 배치 워크로드 요구 사항을 충족하는 컴퓨팅 리소스 파라미터를 정의합니다. 관리형 컴퓨팅 환경에서 Amazon EKS 클러스터 내 컴퓨팅 리소스 (Kubernetes노드) 의 용량 및 인스턴스 유형을 관리하는 AWS Batch 데 도움이 됩니다. 이는 컴퓨팅 환경을 생성할 때 사용자가 정의한 컴퓨팅 리소스 사양을 기반으로 합니다. 사용자는 EC2 온디맨드 인스턴스 또는 EC2 스팟 인스턴스를 선택할 수 있습니다.

이제 AWSServiceRoleForBatch서비스 연결 역할이 Amazon EKS 클러스터에 액세스할 수 있으므로 리소스를 생성할 수 있습니다. AWS Batch 먼저 Amazon EKS 클러스터를 가리키는 컴퓨팅 환경을 생성합니다.

$ cat <<EOF > ./batch-eks-compute-environment.json { "computeEnvironmentName": "My-Eks-CE1", "type": "MANAGED", "state": "ENABLED", "eksConfiguration": { "eksClusterArn": "arn:aws:eks:<region>:123456789012:cluster/<cluster-name>", "kubernetesNamespace": "my-aws-batch-namespace" }, "computeResources": { "type": "EC2", "allocationStrategy": "BEST_FIT_PROGRESSIVE", "minvCpus": 0, "maxvCpus": 128, "instanceTypes": [ "m5" ], "subnets": [ "<eks-cluster-subnets-with-access-to-the-image-for-image-pull>" ], "securityGroupIds": [ "<eks-cluster-sg>" ], "instanceRole": "<eks-instance-profile>" } } EOF $ aws batch create-compute-environment --cli-input-json file://./batch-eks-compute-environment.json
참고
  • serviceRole파라미터를 지정하지 않아야 합니다. 그러면 AWS Batch 서비스 연결 역할이 사용됩니다. AWS Batch Amazon EKS에서는 AWS Batch 서비스 연결 역할만 지원합니다.

  • Amazon EKS 컴퓨팅 환경에서는 BEST_FIT_PROGRESSIVESPOT_CAPACITY_OPTIMIZED, 및 SPOT_PRICE_CAPACITY_OPTIMIZED 할당 전략만 지원됩니다.

    참고

    대부분의 인스턴스에서 SPOT_CAPACITY_OPTIMIZED보다 SPOT_PRICE_CAPACITY_OPTIMIZED을 사용하는 것을 권장합니다.

  • instanceRole에 대한 내용은 Amazon EKS 사용 설명서Amazon EKS 노드 IAM 역할 생성클러스터에 대한 IAM 주체 액세스 활성화를 참조하세요. 포드 네트워킹을 사용하는 경우 Amazon EKS 사용 설명서서비스 계정에 IAM 역할을 사용하도록 Kubernetes에 Amazon VPC CNI 플러그인 구성을 참조하세요.

  • subnets 파라미터에 사용할 서브넷이 제대로 작동하도록 하는 방법은 Amazon EKS 클러스터를 생성할 때 eksctl이 생성한 Amazon EKS 관리형 노드 그룹 퍼블릭 서브넷을 사용하는 것입니다. 그렇지 않으면 이미지 가져오기를 지원하는 네트워크 경로가 있는 서브넷을 사용합니다.

  • securityGroupIds 파라미터는 Amazon EKS 클러스터와 동일한 보안 그룹을 사용할 수 있습니다. 이 명령은 클러스터의 보안 그룹 ID를 검색합니다.

    $ eks describe-cluster \ --name <cluster-name> \ --query cluster.resourcesVpcConfig.clusterSecurityGroupId
  • Amazon EKS 컴퓨팅 환경의 유지 관리는 공동의 책임입니다. 자세한 내용은 Amazon EKS의 보안을 참조하십시오.

중요

진행하기 전에 컴퓨팅 환경이 정상인지 확인하는 것이 중요합니다. DescribeComputeEnvironmentsAPI 작업을 사용하여 이 작업을 수행할 수 있습니다.

$ aws batch describe-compute-environments --compute-environments My-Eks-CE1

status 파라미터가 INVALID로 되어 있지 않은지 확인합니다. 그럴 경우 statusReason 파라미터에서 원인을 확인합니다. 자세한 설명은 문제 해결 AWS Batch 섹션을 참조하세요.

3단계: 작업 대기열 생성 및 컴퓨팅 환경 연결

$ aws batch describe-compute-environments --compute-environments My-Eks-CE1

이 새 작업 대기열에 제출된 작업은 컴퓨팅 환경과 연결된 Amazon EKS 클러스터에 조인된 AWS Batch 관리형 노드에서 파드로 실행됩니다.

$ cat <<EOF > ./batch-eks-job-queue.json { "jobQueueName": "My-Eks-JQ1", "priority": 10, "computeEnvironmentOrder": [ { "order": 1, "computeEnvironment": "My-Eks-CE1" } ] } EOF $ aws batch create-job-queue --cli-input-json file://./batch-eks-job-queue.json

4단계: 작업 정의 생성

퍼블릭 ECR 리포지토리의 이미지로 연결되는 링크를 제공하는 대신 작업 정의의 이미지 필드에 프라이빗 ECR 리포지토리에 저장된 이미지에 대한 링크를 제공하십시오. 다음 샘플 작업 정의를 참조하십시오.

$ cat <<EOF > ./batch-eks-job-definition.json { "jobDefinitionName": "MyJobOnEks_Sleep", "type": "container", "eksProperties": { "podProperties": { "hostNetwork": true, "containers": [ { "image": "account-id.dkr.ecr.region.amazonaws.com/amazonlinux:2", "command": [ "sleep", "60" ], "resources": { "limits": { "cpu": "1", "memory": "1024Mi" } } } ], "metadata": { "labels": { "environment": "test" } } } } } EOF $ aws batch register-job-definition --cli-input-json file://./batch-eks-job-definition.json

kubectl 명령을 실행하려면 Amazon EKS 클러스터에 대한 프라이빗 액세스 권한이 필요합니다. 즉, 클러스터 API 서버로 향하는 모든 트래픽은 클러스터의 VPC 또는 연결된 네트워크 내에서 들어와야 합니다.

5단계: 작업 제출

$ aws batch submit-job - -job-queue My-Eks-JQ1 \ - -job-definition MyJobOnEks_Sleep - -job-name My-Eks-Job1 $ aws batch describe-jobs - -job <jobId-from-submit-response>
참고

(선택 사항) 재정의를 통한 작업 제출

이 작업은 컨테이너로 전달되는 명령을 재정의합니다.

$ cat <<EOF > ./submit-job-override.json { "jobName": "EksWithOverrides", "jobQueue": "My-Eks-JQ1", "jobDefinition": "MyJobOnEks_Sleep", "eksPropertiesOverride": { "podProperties": { "containers": [ { "command": [ "/bin/sh" ], "args": [ "-c", "echo hello world" ] } ] } } } EOF $ aws batch submit-job - -cli-input-json file://./submit-job-override.json
참고

문제 해결

에서 시작한 노드가 이미지를 저장하는 Amazon ECR 리포지토리 (또는 다른 리포지토리) 에 액세스할 수 AWS Batch 없는 경우 작업이 시작 상태로 유지될 수 있습니다. 이는 포드가 이미지를 다운로드하고 AWS Batch 작업을 실행할 수 없기 때문입니다. 에서 실행한 AWS Batch 포드 이름을 클릭하면 오류 메시지를 확인하고 문제를 확인할 수 있을 것입니다. 오류 메시지는 다음과 비슷해야 합니다.

Failed to pull image "public.ecr.aws/amazonlinux/amazonlinux:2": rpc error: code = Unknown desc = failed to pull and unpack image "public.ecr.aws/amazonlinux/amazonlinux:2": failed to resolve reference "public.ecr.aws/amazonlinux/amazonlinux:2": failed to do request: Head "https://public.ecr.aws/v2/amazonlinux/amazonlinux/manifests/2": dial tcp: i/o timeout

다른 일반적인 문제 해결 시나리오는 문제 해결을 참조하십시오 AWS Batch. 포드 상태에 따른 문제 해결은 Amazon EKS에서 포드 상태 문제를 해결하려면 어떻게 해야 합니까? 를 참조하십시오. .