Amazon ECS 컨테이너 인스턴스 드레이닝

Amazon ECS 컨테이너 인스턴스 드레이닝

클러스터에서 컨테이너 인스턴스를 제거해야 할 때 DRAINING 상태로 전환해 워크로드를 우아하게 옮기는 방법을 알아봐요.

출처: 문서

본문

시스템 업데이트를 수행하거나 클러스터 용량을 축소하는 등 클러스터에서 컨테이너 인스턴스를 제거해야 할 때가 있을 수 있어요. Amazon ECS는 컨테이너 인스턴스를 DRAINING 상태로 전환할 수 있는 기능을 제공해요. 이를 컨테이너 인스턴스 드레이닝(container instance draining)이라고 해요. 컨테이너 인스턴스가 DRAINING으로 설정되면 Amazon ECS는 새 태스크가 그 컨테이너 인스턴스에 배치되는 것을 방지해요.

서비스의 드레이닝 동작 (Draining behavior for services)

서비스의 일부인 태스크 중 PENDING 상태인 것은 즉시 중지돼요. 클러스터에 사용 가능한 컨테이너 인스턴스 용량이 있으면 서비스 스케줄러가 대체 태스크를 시작해요. 컨테이너 인스턴스 용량이 충분하지 않으면 문제를 나타내는 서비스 이벤트 메시지가 전송돼요.

컨테이너 인스턴스에서 서비스의 일부인 RUNNING 상태의 태스크는 STOPPED 상태로 전환돼요. 서비스 스케줄러는 서비스의 배포 유형과 배포 구성 파라미터(minimumHealthyPercent, maximumPercent)에 따라 태스크를 교체하려고 해요. 자세한 내용은 Amazon ECS services와 Amazon ECS service definition parameters 참고.

minimumHealthyPercent가 100% 미만이면 스케줄러는 태스크 교체 중에 desiredCount을 일시적으로 무시할 수 있어요. 예를 들어 desiredCount가 4개 태스크이면 최소 50%는 스케줄러가 두 개의 새 태스크를 시작하기 전에 두 개의 기존 태스크를 중지할 수 있게 해요. 최소가 100%이면 서비스 스케줄러는 대체 태스크가 건강한 것으로 간주될 때까지 기존 태스크를 제거할 수 없어요. 로드 밸런서를 사용하지 않는 서비스의 태스크가 RUNNING 상태이면 건강한 것으로 간주돼요. 로드 밸런서를 사용하는 서비스의 태스크는 RUNNING 상태이고 호스팅되는 컨테이너 인스턴스가 로드 밸런서에 의해 건강하다고 보고되면 건강한 것으로 간주돼요.

중요 — Spot Instances를 사용하고 minimumHealthyPercent가 100% 이상이면 서비스는 Spot Instance가 종료되기 전에 태스크를 교체할 시간이 충분하지 않을 거예요.

maximumPercent 파라미터는 태스크 교체 중 실행 중인 태스크 수의 상한을 나타내며, 이를 통해 교체 배치 크기를 정의할 수 있어요. 예를 들어 desiredCount가 4개 태스크이면 최대 200%는 4개의 새 태스크를 시작한 후 드레이닝할 4개 태스크를 중지해요(이에 필요한 클러스터 리소스가 사용 가능하다는 전제). 최대가 100%이면 드레이닝 태스크가 중지될 때까지 대체 태스크가 시작될 수 없어요.

중요 — minimumHealthyPercent와 maximumPercent가 모두 100%이면 서비스는 기존 태스크를 제거할 수도, 대체 태스크를 시작할 수도 없어요. 이는 성공적인 컨테이너 인스턴스 드레이닝을 막고 새 배포를 막아요.

독립 실행 태스크의 드레이닝 동작 (Draining behavior for standalone tasks)

PENDING 또는 RUNNING 상태의 독립 실행 태스크는 영향을 받지 않아요. 스스로 중지될 때까지 기다리거나 수동으로 중지해야 해요. 컨테이너 인스턴스는 DRAINING 상태로 유지돼요.

Amazon ECS Managed Instances의 드레이닝 동작

Amazon ECS Managed Instances 종료는 비용을 최적화하고 시스템 상태를 유지하면서 우아한 워크로드 전환을 보장해요. 종료 시스템은 각각 다른 타이밍 특성과 고객 영향 프로필을 가진 세 가지 별개의 인스턴스 종료 결정 경로를 제공해요.

고객 시작 종료 (Customer-initiated termination) — 서비스에서 컨테이너 인스턴스를 즉시 제거해야 할 때 인스턴스 제거에 대한 직접 제어를 제공해요. force 요청 파라미터를 true로 설정해 deregister-container-instance를 실행해요. 이는 실행 중인 워크로드에도 불구하고 즉시 종료가 필요하다는 뜻이에요.

시스템 시작 유휴 종료 (System-initiated idle termination) — Amazon ECS Managed Instances는 태스크를 실행하지 않는 유휴 Amazon ECS 컨테이너 인스턴스를 종료하여 비용을 지속적으로 모니터링하고 사전에 최적화해요. ECS는 휴리스틱 지연을 사용해 컨테이너 인스턴스가 종료되기 전에 새로 시작된 태스크를 획득할 기회를 줘요. 이는 Amazon ECS Managed Instances capacity provider 구성 파라미터 scaleInAfter로 사용자 지정할 수 있어요.

인프라 새로고침 종료 (Infrastructure refresh termination) — Amazon ECS Managed Instances는 워크로드 가용성을 유지하면서 보안과 규정 준수를 보장하기 위해 관리형 컨테이너 인스턴스의 소프트웨어를 자동으로 관리·업데이트해요. 자세한 내용은 patching in Amazon ECS Managed Instances 참고.

종료 시스템은 워크로드 연속성과 인프라 관리 요구 사항의 균형을 맞추는 2단계 접근 방식을 구현해요.

1단계: 우아한 완료 기간 (Graceful completion period) — 이 단계에서 시스템은 워크로드 연속성을 우선시하는 우아한 드레이닝 전략을 구현해요. 서비스 태스크는 정상적인 Amazon ECS 스케줄링 프로세스를 통해 우아하게 드레이닝돼요. 독립 실행 태스크는 자연스럽게 완료될 수 있으므로 계속 실행돼요. 시스템은 모든 태스크가 자연 완료 프로세스를 통해 중지 상태에 도달하는 것을 모니터링해요.

2단계: 하드 마감일 집행 (Hard deadline enforcement) — 우아한 완료가 허용 가능한 시간 내에 종료 목표를 달성하지 못하면 시스템은 하드 마감일 집행을 구현해요. 하드 마감일은 일반적으로 드레이닝 시작 시간 + 7일로 설정되어, 운영 요구 사항을 유지하면서 완료에 상당한 시간을 제공해요. 집행에는 자동 강제 등록 취소 절차와 완료 상태와 무관하게 남은 모든 태스크의 즉시 종료가 포함돼요.

모든 태스크가 STOPPED 상태로 전환되면 컨테이너 인스턴스의 드레이닝이 완료된 것이에요. 컨테이너 인스턴스는 다시 활성화되거나 삭제될 때까지 DRAINING 상태로 유지돼요. containerInstance 파라미터가 있는 ListTasks 작업으로 인스턴스의 태스크 목록을 얻은 후 각 태스크의 ARN 또는 ID가 있는 DescribeTasks 작업으로 태스크 상태를 확인해 컨테이너 인스턴스의 태스크 상태를 검증할 수 있어요.

컨테이너 인스턴스가 다시 태스크를 호스팅하도록 할 준비가 되면 컨테이너 인스턴스 상태를 DRAINING에서 ACTIVE로 변경해요. 그러면 Amazon ECS 서비스 스케줄러가 다시 태스크 배치를 위해 컨테이너 인스턴스를 고려해요.

절차 (Procedure)

다음 단계로 새 AWS Management Console을 사용해 컨테이너 인스턴스를 드레이닝으로 설정할 수 있어요. UpdateContainerInstancesState API 작업이나 update-container-instances-state 명령을 사용해 컨테이너 인스턴스 상태를 DRAINING으로 변경할 수도 있어요.

  1. 콘솔(https://console.aws.amazon.com/ecs/v2)을 엽니다.
  2. 내비게이션 창에서 Clusters를 선택합니다.
  3. Clusters 페이지에서 인스턴스를 호스팅하는 클러스터를 선택합니다.
  4. Cluster : name 페이지에서 Infrastructure 탭을 선택합니다. 그런 다음 Container instances에서 드레이닝할 각 컨테이너 인스턴스의 확인란을 선택합니다.
  5. Actions, Drain을 선택합니다.

더 알아보기 (Learn more)