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 프라이빗 전용 클러스터는 기본적으로 인바운드/아웃바운드 인터넷 액세스가 없으며 VPC 또는 연결된 네트워크 내에서만 API 서버에 액세스할 수 있습니다. Amazon VPC 엔드포인트는 다른 AWS 서비스에 대한 프라이빗 액세스를 활성화하는 데 사용됩니다.는 기존 Amazon VPC 및 서브넷을 사용하여 완전 프라이빗 클러스터 생성을 eksctl 지원합니다. eksctl 또한는 제공된 Amazon VPC에 Amazon VPC 엔드포인트를 생성하고 제공된 서브넷의 라우팅 테이블을 수정합니다.

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

선택적으로 Amazon ECR을 사용하여 풀스루 캐시 규칙을 생성할 수 있습니다. 외부 퍼블릭 레지스트리에 대한 풀스루 캐시 규칙이 생성되면 Amazon ECR 프라이빗 레지스트리 URI(Uniform Resource Identifier)를 사용하여 해당 외부 퍼블릭 레지스트리에서 이미지를 가져올 수 있습니다. 그러면 Amazon ECR이 리포지토리를 생성하고 해당 이미지를 캐시합니다. Amazon ECR 프라이빗 레지스트리 URI를 사용하여 캐시된 이미지를 가져오면 Amazon ECR은 원격 레지스트리를 점검하여 이미지의 새 버전이 있는지 확인하며, 최대 24시간마다 한 번씩 프라이빗 레지스트리를 업데이트합니다.

개요

이 자습서에서는 AWS CloudShell, kubectl 및 AWS Batch 를 사용하여 프라이빗 Amazon EKS로 설정하는 방법을 보여줍니다eksctl.

대상

이 자습서는 설정, 테스트 및 배포를 담당하는 시스템 관리자 및 개발자를 위해 설계되었습니다 AWS Batch.

사용된 기능

이 자습서에서는를 사용하여 다음을 AWS CLI수행하는 방법을 보여줍니다.

  • Amazon Elastic Container Registry(Amazon ECR)를 사용하여 컨테이너 이미지 저장

  • Amazon EKS 컴퓨팅 환경 생성 및 구성

  • 작업 대기열을 생성합니다.

  • 작업 정의 생성

  • 실행할 작업 생성 및 제출

  • 재정의가 있는 작업 제출

필요한 시간

이 자습서를 완료하는 데 약 40~50분이 소요됩니다.

리전별 제한 사항

이 솔루션 사용과 관련된 국가 또는 리전 제한은 없습니다.

리소스 사용 비용

AWS 계정 생성에는 요금이 부과되지 않습니다. 그러나 이 솔루션을 구현하면 아래 표에 나열된 비용이 일부 또는 전부 발생할 수 있습니다.

설명 비용(USD)
클러스터 시간으로 요금이 청구됩니다. 인스턴스에 따라 다릅니다. Amazon EKS 요금을 참조하세요.
Amazon EC2 인스턴스 생성된 각 Amazon EC2 인스턴스에 대해 비용을 지불합니다. 요금에 대한 자세한 정보는 Amazon EC2 요금을 참조하십시오.

사전 조건

이 자습서에서는에서 직접 시작하는 브라우저 기반 사전 인증된 AWS CloudShell 셸인를 사용합니다 AWS Management Console. 이렇게 하면 더 이상 퍼블릭 인터넷에 액세스할 수 없는 클러스터에 액세스할 수 있습니다. AWS CLI, kubectl및가 이미의 일부로 설치되어 있을 eksctl 수 있습니다 AWS CloudShell. 에 대한 자세한 내용은 AWS CloudShell사용 설명서를 AWS CloudShell참조하세요. 의 대안 AWS CloudShell 은 클러스터의 VPC 또는 연결된 네트워크에 연결하는 것입니다.

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

1단계: 용 EKS 클러스터 생성 AWS Batch

중요

이 자습서에는 가능한 한 간단하고 빠르게 시작하기 위해 기본 설정이 있는 단계가 포함되어 있습니다. 프로덕션용으로를 생성하기 전에 모든 설정을 숙지하고 요구 사항에 맞는 설정을 배포하는 것이 좋습니다.

클러스터를 생성하려면 eksctl 및 다음 구성 파일을 사용하는 것이 좋습니다. 클러스터를 수동으로 설정하려면 Amazon EKS 사용 설명서인터넷 액세스가 제한된 프라이빗 클러스터 배포의 지침을 따르세요.

  1. AWS CloudShell 콘솔을 열고 리전을 로 설정합니다us-east-1. 자습서의 나머지 부분에서는를 사용하고 있는지 확인합니다us-east-1.

  2. 샘플 eksctl 구성 파일을 사용하여 us-east-1 리전에 프라이빗 EKS 클러스터를 생성합니다. yaml 파일을 AWS CloudShell 환경에 저장하고 이름을 clusterConfig.yaml 로 지정합니다. my-test-cluster를 클러스터에 사용할 이름으로 변경할 수 있습니다.

    kind: ClusterConfig apiVersion: eksctl.io/v1alpha5 metadata: name: my-test-cluster region: us-east-1 availabilityZones: - us-east-1a - us-east-1b - us-east-1c managedNodeGroups: - name: ng-1 privateNetworking: true privateCluster: enabled: true skipEndpointCreation: false
  3. 명령을 사용하여 리소스를 생성합니다eksctl create cluster -f clusterConfig.yaml. 클러스터 생성에는 10~15분이 걸릴 수 있습니다.

  4. 클러스터 생성이 완료되면 허용 목록에 AWS CloudShell IP 주소를 추가해야 합니다. AWS CloudShell IP 주소를 찾으려면 다음 명령을 실행합니다.

    curl http://checkip.amazonaws.com

    퍼블릭 IP 주소가 있으면 허용 목록 규칙을 생성해야 합니다.

    aws eks update-cluster-config \ --name my-test-cluster \ --region us-east-1 \ --resources-vpc-config endpointPublicAccess=true,endpointPrivateAccess=true,publicAccessCidrs=["<Public IP>/32"]

    그런 다음 kubectl 구성 파일에 업데이트를 적용합니다.

    aws eks update-kubeconfig --name my-test-cluster --region us-east-1
  5. 노드에 액세스할 수 있는지 테스트하려면 다음 명령을 실행합니다.

    kubectl get nodes

    명령의 출력은 다음과 같습니다.

    NAME STATUS ROLES AGE VERSION ip-192-168-107-235.ec2.internal Ready none 1h v1.32.3-eks-473151a ip-192-168-165-40.ec2.internal Ready none 1h v1.32.3-eks-473151a ip-192-168-98-54.ec2.internal Ready none 1h v1.32.1-eks-5d632ec

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

모든 단계는 필수이며에서 수행해야 합니다 AWS CloudShell.

  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 클러스터마다 한 번씩 수행해야 합니다.

    $ 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: ["events"] verbs: ["list"] - 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

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

    $ 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

    Kubernetes aws-auth 구성 맵을 업데이트하여 이전 RBAC 권한을 AWS Batch 서비스 연결 역할에 매핑합니다.

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

    출력:

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

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

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

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

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

  • subnets 실행eksctl get cluster my-test-cluster하여 클러스터에서 사용하는 서브넷을 가져옵니다.

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

    $ aws eks describe-cluster \ --name my-test-cluster \ --query cluster.resourcesVpcConfig.clusterSecurityGroupId
  • 사전 조건에서 instanceRole 생성한의 ARN을 사용합니다.

$ cat <<EOF > ./batch-eks-compute-environment.json { "computeEnvironmentName": "My-Eks-CE1", "type": "MANAGED", "state": "ENABLED", "eksConfiguration": { "eksClusterArn": "arn:aws:eks:us-east-1:<your-account-ID>:cluster/my-test-cluster", "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
Notes
  • Amazon EKS 컴퓨팅 환경의 유지 관리는 공동 책임입니다. 자세한 내용은 Amazon EKS의 보안을 참조하세요.

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

중요

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

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

status 파라미터가 INVALID로 되어 있지 않은지 확인합니다. 그럴 경우 statusReason 파라미터에서 원인을 확인합니다. 자세한 내용은 문제 해결 AWS Batch 단원을 참조하십시오.

이 새 작업 대기열에 제출된 작업은 컴퓨팅 환경과 연결된 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

5단계: 풀스루 캐시를 사용하여 Amazon ECR 생성

클러스터에 퍼블릭 인터넷 액세스 권한이 없으므로 컨테이너 이미지용 Amazon ECR을 생성해야 합니다. 다음 지침에서는 풀스루 캐시 규칙을 사용하여 이미지를 저장하는 Amazon ECR을 생성합니다.

  1. 다음 명령은 풀스루 캐시 규칙을 생성합니다. 자습서 접두사를 다른 접두사로 바꿀 수 있습니다.

    aws ecr create-pull-through-cache-rule \ --ecr-repository-prefix "my-prefix" \ --upstream-registry-url "public.ecr.aws" \ --region us-east-1
  2. 퍼블릭 ECR로 인증합니다.

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin <your-account-ID>.dkr.ecr.us-east-1.amazonaws.com

    이제 이미지를 가져올 수 있습니다.

    docker pull <your-account-ID>.dkr.ecr.us-east-1.amazonaws.com/my-prefix/amazonlinux/amazonlinux:2
  3. 다음 명령을 실행하여 리포지토리와 이미지를 확인할 수 있습니다.

    aws ecr describe-repositories
    aws ecr describe-images --repository-name my-prefix/amazonlinux/amazonlinux
  4. 컨테이너를 가져오는 데 사용할 이미지 문자열의 형식은 다음과 같습니다.

    <your-account-ID>.dkr.ecr.us-east-1.amazonaws.com/my-prefix/amazonlinux/amazonlinux:2

6단계: 작업 정의 등록

다음 작업 정의는 포드에 60초 동안 절전 모드로 전환하도록 지시합니다.

작업 정의의 이미지 필드에서 퍼블릭 ECR 리포지토리의 이미지에 대한 링크를 제공하는 대신 프라이빗 ECR 리포지토리에 저장된 이미지에 대한 링크를 제공합니다. 다음 샘플 작업 정의를 참조하세요.

$ cat <<EOF > ./batch-eks-job-definition.json { "jobDefinitionName": "MyJobOnEks_Sleep", "type": "container", "eksProperties": { "podProperties": { "hostNetwork": true, "containers": [ { "image": "<your-account-ID>.dkr.ecr.us-east-1.amazonaws.com/my-prefix/amazonlinux/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

Notes

7단계: 실행할 작업 제출

에서 다음 AWS CLI 명령을 실행 AWS CloudShell 하여 새 작업을 제출하고 고유한 JobID를 반환합니다.

$ aws batch submit-job --job-queue My-Eks-JQ1 \ --job-definition MyJobOnEks_Sleep - -job-name My-Eks-Job1
Notes
  • Amazon EKS 리소스에서 작업을 실행하는 방법에 대한 자세한 내용은 Amazon EKS 작업 섹션을 참조하세요.

8단계: 작업의 출력 보기

작업의 상태를 확인하려면:

$ aws batch describe-jobs --job <JobID-from-submit-response>

startedAt 및는 1분 간격으로 이루어져야 stoppedAt 합니다.

9단계: (선택 사항) 재정의가 있는 작업 제출

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

$ 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
Notes

10단계: 자습서 리소스 정리

Amazon EC2 인스턴스가 활성화된 동안에는 요금이 부과됩니다. 인스턴스를 삭제하여 요금 발생을 중지할 수 있습니다.

생성한 리소스를 삭제하려면 다음을 수행합니다.

  1. https://console.aws.amazon.com/batch/ AWS Batch 콘솔을 엽니다.

  2. 탐색 창에서 작업 대기열을 선택합니다.

  3. 작업 대기열 테이블에서 자습서를 위해 생성한 작업 대기열을 선택합니다.

  4. 작업에서 비활성화를 선택합니다. 작업 대기열 상태가 비활성화되면 삭제를 선택할 수 있습니다.

  5. 작업 대기열이 삭제되면 탐색 창에서 컴퓨팅 환경을 선택합니다.

  6. 이 자습서를 위해 생성한 컴퓨팅 환경을 선택한 다음 작업에서 비활성화를 선택합니다. 컴퓨팅 환경 비활성화를 완료하는 데 1~2분 정도 걸릴 수 있습니다.

  7. 컴퓨팅 환경의 상태가 비활성화되면 삭제를 선택합니다. 컴퓨팅 환경을 삭제하는 데 1~2분 정도 걸릴 수 있습니다.

추가 리소스

자습서를 완료한 후 다음 주제를 살펴볼 수 있습니다.

문제 해결

에서 시작된 노드가 이미지를 저장하는 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에서 포드 상태 문제를 해결하려면 어떻게 해야 합니까?를 참조하세요.