Amazon Web Services 한국 블로그

Amazon EKS 기반 AWS Fargate 서버리스 컨테이너 서비스 정식 출시

Amazon Elastic Kubernetes Service를 사용하여 AWS Fargate에서 Kubernetes Pod를 실행할 수 있습니다. Amazon EKSFargate를 사용하면 Pod용 인프라를 프로비저닝하고 관리할 필요가 없으므로 Kubernetes 기반 애플리케이션을 AWS에서 간편하게 실행할 수 있습니다.

AWS Fargate에서는 Kubernetes 작업에 대한 전문 지식 없이 경제적인 고가용성 클러스터를 실행할 수 있습니다. Fargate에서는 Amazon EKS 클러스터를 위한 EC2 인스턴스를 생성하거나 관리할 필요가 없습니다.

이제 EC2 인스턴스 클러스터에 대한 패치, 크기 조정 또는 보안 걱정 없이 Kubernetes 애플리케이션을 클라우드에서 실행할 수 있습니다. Fargate를 사용할 때는 Pod 수준 리소스를 정의하고 해당 리소스에 대한 요금을 지불합니다. 따라서 각 애플리케이션에 적합한 크기의 리소스를 사용하고 각 Pod의 비용을 명확하게 볼 수 있습니다.

이 블로그의 나머지 부분에서는 Fargate 기반 Amazon EKS를 사용하여 단순한 Kubernetes 기반 애플리케이션을 배포해 보도록 하겠습니다.

EKS 클러스터 구축하기
클러스터를 설정하는 가장 간단한 방법은 EKS를 위한 공식 CLI 도구인 eksctl을 사용하는 것입니다. 아래의 명령을 실행하면 작업자 노드가 없는 demo-newsblog라는 클러스터가 생성됩니다.

eksctl create cluster --name demo-newsblog --region eu-west-1 --fargate

이 명령 하나로 많은 작업이 자동으로 완료되었습니다. 클러스터가 생성되었고 Fargate 프로필도 생성되었습니다.

Fargate 프로필은 Fargate에서 실행할 Kubernetes Pod, Pod가 실행되는 서브넷 및 Kubernetes 에이전트가 컨테이너 이미지를 Pod에 다운로드하고 기타 작업을 자동으로 수행하는 데 사용할 IAM 실행 역할을 지정하는 데 사용됩니다.

이 기능의 작동 방식을 이해하려면 Fargate 프로필에 대한 이해가 중요합니다. 이전에 자동으로 생성된 Fargate 프로필을 삭제하고 수동으로 다시 만들어 봅시다.

Fargate 프로필을 생성하려면 Amazon Elastic Kubernetes Service 콘솔로 이동하고 demo-newsblog 클러스터를 선택합니다. 세부 정보의 Fargate profiles 아래에서 [Add Fargate profile]을 선택합니다.

이제, 새 Fargate 프로필을 구성해야 합니다. 이름에는 demo-default를 입력합니다.

Pod 실행 역할에는 eks-fargate-pods.amazonaws.com 서비스 주체가 포함된 IAM 역할만 표시됩니다. eksctl 도구를 사용하여 AmazonEKSFargatePodExecutionRole이라는 IAM 역할을 생성할 수 있습니다. 이 역할을 처음부터 생성하는 방법은 설명서에 나와 있습니다.

[Subnets] 섹션에는 기본적으로 클러스터 VPC의 모든 서브넷이 선택되어 있습니다. 그러나 Fargate Pod에는 프라이빗 서브넷만 지원되므로 2개의 퍼블릭 서브넷을 선택 취소합니다.

[Next]를 클릭하면 [Pod selectors] 화면으로 이동합니다. 네임스페이스를 입력하라는 메시지가 표시됩니다. default를 추가합니다. 이렇게 하면 기본 Kubernetes 네임스페이스에 생성된 모든 Pod가 Fargate에서 실행됩니다. Fargate에서 Pod를 실행하기 위해 Kubernetes 앱을 수정할 필요는 없습니다. Fargate 프로필만 있으면 됩니다. Kubernetes 앱의 Pod가 프로필에 정의된 네임스페이스와 일치하면 해당 Pod가 Fargate에서 실행됩니다.

이 데모에서는 사용하지 않지만 레이블 일치 기능도 있습니다. 이 기능을 사용하면 선택할 Pod의 레이블을 지정하여 이 프로필에서 실행할 Pod를 보다 구체적으로 명시할 수 있습니다.

마지막으로 [Next]를 클릭한 다음 [Create]를 클릭합니다. 프로필이 생성되고 활성화되려면 몇 분 정도 걸립니다.

이 데모에서는 모든 Pod를 Fargate에서 실행합니다. 여기에는 Kubernetes의 일부인 CoreDNS Pod도 포함됩니다. Fargate에서 이러한 Pod를 실행하기 위해 kube-system 네임스페이스의 모든 Pod에 대한 두 번째 Fargate 프로필을 추가하겠습니다. 이번에는 다양한 데모를 위해 명령줄을 사용하여 프로필을 생성하겠습니다.

엄밀히 따지면 두 번째 프로필을 생성할 필요가 없습니다. 첫 번째 프로필에 추가 네임스페이스를 추가하면 되지만 이 방법을 사용하는 이유는 프로필을 생성하는 다른 방법을 보여드리기 위해서입니다.

먼저, 아래의 파일을 생성하고 demo-kube-system-profile.json으로 저장합니다.

{
    "fargateProfileName": "demo-kube-system",
    "clusterName": "demo-news-blog",
    "podExecutionRoleArn": "arn:aws:iam::xxx:role/AmazonEKSFargatePodExecutionRole",
    "subnets": [
        "subnet-0968a124a4e4b0afe",
        "subnet-0723bbe802a360eb9"
    ],
    "selectors": [
        {
            "namespace": "kube-system"
        }
    ]
}

위의 파일이 포함된 폴더로 이동하고 터미널에서 create-fargate-profile 명령을 실행합니다.

aws eks create-fargate-profile --cli-input-json file://demo-kube-system-profile.json

이제 클러스터에 컨테이너를 배포할 수 있습니다. 간편함을 위해 다음 kubectl 명령을 사용하여 단일 nginx 인스턴스를 배포합니다.

kubectl create deployment demo-app --image=nginx

그런 다음 get pods 명령을 실행하여 Pod의 상태를 확인합니다.

kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
demo-app-6dbfc49497-67dxk   0/1     Pending   0          13s

get nodes를 실행하면 3개의 노드가 생성됩니다(coreDNS용 노드 2개와 nginx용 노드 1개). 이러한 노드는 Pod 실행을 위해 초기화된 컴퓨팅 리소스를 나타냅니다.

kubectl get nodes
NAME                                                   STATUS   ROLES    AGE     VERSION
fargate-ip-192-168-218-51.eu-west-1.compute.internal   Ready    <none>   4m45s   v1.14.8-eks
fargate-ip-192-168-221-91.eu-west-1.compute.internal   Ready    <none>   2m20s   v1.14.8-eks
fargate-ip-192-168-243-74.eu-west-1.compute.internal   Ready    <none>   4m40s   v1.14.8-eks

잠시 후 get pods 명령을 다시 실행하면 demo-app 상태가 Running으로 변경됩니다. 컨테이너가 Fargate에 성공적으로 배포되었음을 의미합니다.

kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
demo-app-6dbfc49497-67dxk   1/1     Running   0          3m52s

요금 및 제한
AWS Fargate에서는 Pod 실행에 필요한 vCPU 및 메모리 리소스 양에 대해서만 요금이 부과됩니다. 여기에는 Pod에서 요청하는 리소스에 대한 요금과 Kubernetes 구성 요소를 Pod와 함께 실행하는 데 필요한 소량의 메모리에 대한 요금이 포함됩니다. Fargate에서 실행되는 Pod는 기존 요금 모델을 따릅니다. vCPU 및 메모리 리소스는 Pod의 컨테이너 이미지를 가져와서 Pod가 종료될 때까지의 시간으로 계산되며 초 단위로 반올림됩니다. 1분의 최소 요금이 적용됩니다. 또한 실행하는 각 EKS 클러스터에 대해 시간당 0.20 USD의 표준 요금이 부과됩니다.

현재 이 서비스에는 몇 가지 제한 사항이 있습니다.

  • Pod당 최대 4개의 vCPU와 30Gb 메모리를 사용할 수 있습니다.
  • 영구 볼륨 또는 파일 시스템이 필요한 상태 저장 워크로드는 지원되지 않습니다.
  • 데몬 세트, 권한이 있는 Pod나 HostNetwork 또는 HostPort를 사용하는 Pod를 실행할 수 없습니다.
  • 로드 밸런서의 경우 Application Load Balancer만 사용할 수 있습니다.

지금 바로 시작하기
AWS Fargate 기반 Amazon EKS를 직접 탐색하고 싶다면 미국 동부(버지니아 북부), 미국 동부(오하이오), EU(아일랜드)아시아 태평양(도쿄) 리전에서 EKS 콘솔로 이동하여 시작할 수 있습니다.

– Martin