Amazon Web Services 한국 블로그

AWS Fargate for Amazon EKS에서 Amazon EFS 지원 시작

AWS FargateAmazon Elastic Kubernetes Service(EKS)와 Amazon Elastic Container Service(ECS)에서 사용할 수 있는 서버리스 컴퓨팅 엔진입니다. Fargate를 사용하는 개발자는 인프라와 관련된 과도하고 무분별한 작업을 관리하지 않고 애플리케이션 구축에 집중할 수 있습니다.

개발자는 각 Kubernetes 포드에 리소스를 지정할 수 있고, 프로비저닝된 컴퓨팅 리소스에 대해서만 요금이 부과됩니다. Fargate를 사용하면 각 EKS 포드가 자체 커널 런타임 환경에서 실행되고 CPU, 메모리, 스토리지 및 네트워크 리소스가 절대 다른 포드와 공유되지 않아 워크로드 분리와 강화된 보안을 제공합니다.

컨테이너는 사실상 일시적입니다. 동적으로 확장 및 축소할 수 있으며, 저장된 상태 또는 데이터는 종료 시 삭제됩니다. 2019년에 Fargate에 대한 EKS 지원을 시작한 이후로 데이터 지속성과 컨테이너화된 애플리케이션의 공유 스토리지를 요청하는 고객이 많았고, 2020년 4월에 ECS에서 Fargate에 대한 Amazon Elastic File System(EFS) 지원을 발표했습니다. 현재 많은 고객이 Fargate에서 상태 저장 워크로드를 운영하고 있으며, Fargate에서 EKS를 사용할 때 EFS에 대한 지원 요청도 있었습니다. 오늘은 EFS를 지원하게 되었다는 기쁜 소식을 알려드립니다.

EFS는 AWS 클라우드 서비스에서 사용할 수 있는 간단하고 확장 가능한 완전관리형 파일 시스템을 제공하며, EFS에서 작성된 모든 데이터를 여러 AWS 가용 영역에 작성할 수 있어 Kubernetes 애플리케이션의 가용성을 높일 수 있습니다. EFS는 애플리케이션 중단 없이 페타바이트 규모로 필요할 때마다 확장할 수 있도록 구축되었고, 파일을 추가하고 제거하면 자동으로 확장 및 축소되어 그에 따른 프로비저닝과 용량 관리가 필요하지 않습니다. EFS Access Point는 파일 시스템에 저장된 데이터전송 중인 데이터를 암호화할 수 있으므로 보안에 민감한 워크로드에도 적합합니다.

Kubernetes는 컨테이너화된 워크로드에 블록 및 파일 스토리지 시스템 노출에 대한 표준인 “Container Storage Interface(CSI)“를 지원합니다. EFS CSI 드라이버는 Kubernetes 클러스터에 대해 탄력적인 파일 스토리지를 간단히 구성할 수 있도록 지원합니다. 이번 업데이트 전에 고객들은 클러스터에 연결된 Amazon EC2 작업자 노드를 통해 EFS를 사용할 수 있었습니다. 이제 표준 Kubernetes API를 사용하여 EFS 파일 시스템에 액세스하도록 Fargate에서 실행되는 포드를 구성할 수 있습니다. 이번 업데이트로 고가용성 파일 시스템이 필요한 상태 저장 워크로드와 공유 스토리지에 액세스해야 하는 워크로드를 실행할 수 있게 됩니다. EFS CSI 드라이버를 사용하면 전송 중인 모든 데이터가 기본적으로 암호화됩니다.

2020년 7월에 EKS용 Amazon EFS CSI 드라이버의 정식 버전이 출시되었습니다. Amazon EFS CSI 드라이버를 사용하면 표준 Kubernetes 인터페이스를 사용하여 AWS에서 실행되는 EKS 및 자체 관리형 Kubernetes 클러스터에 대해 탄력적 파일 스토리지를 손쉽게 구성할 수 있습니다. Kubernetes 포드가 종료된 후 다시 시작되면 다른 AWS 가용 영역에서 시작되었더라도 CSI 드라이버가 EFS 파일 시스템을 다시 연결해줍니다. 표준 EC2 작업자 노드를 사용할 때는 EFS CSI 드라이버를 포드 세트와 DaemonSets로 배포해야 합니다. 이번 새 업데이트로 Fargate에서 이 단계가 필요하지 않게 되었으며, EFS CSI 드라이버가 Fargate 스택에 설치되고 EFS에 대한 지원이 기본적으로 제공되어 드라이버를 별도로 설치할 필요가 없습니다. 고객들은 CSI 드라이버를 설치하고 업데이트하는 시간과 리소스를 들이지 않고도 Fargate for EKS로 EFS를 사용할 수 있습니다.

Fargate/EKS 및 EFS 통합을 구성하려면 어떻게 해야 합니까?

EKS에서 실행되는 Fargate에 EFS를 마운트하기 위한 Kubernetes 설정이 3가지가 있습니다. 바로 StorageClass, PersistentVolume(PV), PersistentVolumeClaim(PVC)입니다. StorageClass와 PV를 구성하는 단계는 관리자(또는 유사한 자격을 가진 사람)가 애플리케이션 개발자에게 EFS 파일 시스템을 제공할 때 사용합니다. PVC는 기존 PV 풀에서 필요에 따라 PV를 할당하여 애플리케이션을 배포할 때 사용합니다.

StorageClass 객체는 Kubernetes 관리자가 특정 스토리지 유형(예: EFS 또는 EBS)과 구성(예: 처리량, 백업 정책)을 등록하기 위한 수단을 제공합니다. StorageClass가 정의되면 PV 객체는 해당 클래스 내에서 실제 스토리지 볼륨을 생성하는 데 사용됩니다. StorageClass와 PV는 실제 스토리지 하위 시스템을 추상화하고 Kubernetes 사용자가 이러한 시스템을 사용하는 방식과 분리해주는 Kubernetes 메커니즘입니다. 예를 들어 Kubernetes 관리자는 특정 스토리지 서비스에서 특정 스토리지 구성을 어떻게 설정해야 하는지 정확히 알아야 하지만 Kubernetes 사용자는 스토리지의 추상 클래스 내에 있는 볼륨만 보기 때문에 그럴 필요가 없습니다.

마지막 단계는 바인딩입니다. Kubernetes 사용자는 PVC 객체와 관련 API를 통해 위와 같은 볼륨에 대한 액세스 권한을 요청합니다. 사용자가 PVC를 통해 요청할 때 이러한 볼륨이 동적으로 생성됩니다. 그렇지 않을 경우, 관리자가 나중에 Kubernetes 사용자가 사용할 볼륨을 고정적으로 미리 생성해야 합니다. EFS CSI 드라이버의 기존 배포에서는 PVC 바인딩이 작동하려면 볼륨을 고정적으로 미리 생성해야 합니다.

Kubernetes 영구 볼륨을 처음 사용하고 어떤 방식으로 작동하는지 자세히 알고 싶다면 자세한 정보가 나와 있는 Kubernetes 설명서 페이지를 참조하세요.

그러면 이 기능이 실제로 어떻게 작동하는지 살펴보겠습니다. 먼저 동일한 AWS 리전에서 자체적인 EFS 파일 시스템을 생성해야 합니다. EFS에 익숙하지 않다면 먼저 이 EFS 시작 안내서가 좋은 참고 자료가 될 것입니다.

EFS 파일 시스템을 생성하면 파일 시스템 ID를 받습니다. Kubernetes StorageClass와 PersistentVolume을 사용하여 마운트 설정을 구성할 수 있습니다. YAML 파일의 예제는 다음과 같습니다.

CSIDriver 객체

apiVersion: storage.k8s.io/v1beta1
kind: CSIDriver
metadata:
  name: efs.csi.aws.com
spec:
  attachRequired: false

지금은 위의 EFS CSIDriver 객체를 클러스터에 추가해야 Kubernetes가 Fargate에서 자동으로 설치하는 드라이버를 발견할 수 있습니다. 향후에는 EKS 클러스터에 이 매니페스트가 기본으로 추가될 예정입니다.

스토리지 클래스

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: efs-sc
provisioner: efs.csi.aws.com

PersistentVolume(PV)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: efs-pv
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: efs-sc
  CSI:
    driver: efs.csi.aws.com
    volumeHandle: <EFS filesystem ID>

volumeHandle은 파일 시스템이 생성되면 EFS 서비스에서 반환하고, 이를 사용하여 PV를 생성하도록 CSI 드라이버를 구성해야 합니다. AWS Management Console이나 아래의 AWS CLI 명령을 사용하여 EFS filesystem ID를 받을 수 있습니다.

aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text

위의 매니페스트를 적용하여 PV를 생성한 다음에는 포드 매니페스트에 PersistentVolumeClaim을 포함하여 EFS 파일 시스템에 액세스하도록 Kubernetes 포드를 구성합니다. 이를 실행하는 매니페스트 예제 두 가지는 다음과 같습니다.

PersistentVolumeClaim(PVC)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: efs-claim
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: efs-sc
  resources:
    requests:
      storage: 5Gi

포드 매니페스트

apiVersion: v1
kind: Pod
metadata:
  name: app1
spec:
  containers:
  - name: app1 image: busybox command: ["/bin/sh"] args: ["-c", "while true; do echo $(date -u) >> /data/out1.txt; sleep 5; done"]
    volumeMounts:
    - name: persistent-storage
      mountPath: /data
  volumes:
  - name: persistent-storage
    persistentVolumeClaim:
      claimName: efs-claim

지금 이용 가능

오늘부터 Kubernetes 버전 1.17로 새롭게 생성된 EKS 클러스터에서 이 기능을 사용할 수 있으며, 앞으로 몇 주 이내에 EKS의 다른 Kubernetes 버전에서도 이 기능을 지원할 예정입니다. 이번 업데이트는 Fargate with EKS가 지원되는 모든 AWS 리전에서 사용할 수 있습니다. 자세한 내용은 최신 설명서를 참조하세요.

– Kame;