이 페이지 개선에 도움 주기
이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 GitHub에서 이 페이지 편집 링크를 선택합니다.
EKS 자율 모드의 비용 최적화
EKS 자율 모드는 통합, 빈 패키징, 적절한 크기 조정을 통해 클러스터의 컴퓨팅 비용을 지속적으로 최적화합니다. 그러나 특정 워크로드 구성은 이러한 최적화를 방해할 수 있습니다. 이 주제에서는 비용 최적화의 작동 방식, 이를 차단할 수 있는 요소, 비용 효율성을 유지하도록 클러스터를 구성하는 방법을 설명합니다.
EKS 자율 모드가 비용을 최적화하는 방법
EKS 자율 모드는 다음 메커니즘을 통해 컴퓨팅 비용을 절감합니다.
-
빈 패킹 - 노드에 포드를 예약할 때 EKS 자율 모드는 집계 리소스 요청과 가깝게 일치하는 인스턴스 유형을 선택하여 미사용 용량을 최소화합니다.
-
통합 - EKS 자율 모드는 실행 중인 노드를 주기적으로 평가하고 워크로드가 더 적거나 저렴한 인스턴스에서 실행될 수 있을 때 노드를 교체하거나 제거합니다.
-
적절한 크기 조정 - 워크로드가 스케일 다운되면 EKS 자율 모드는 포드를 더 작은 노드로 통합하고 활용도가 낮은 인스턴스를 종료합니다.
이러한 최적화는 수동 개입 없이 지속적으로 실행됩니다. 그러나 특정 포드 주석 및 NodePool 구성은 통합 적용을 방지할 수 있습니다.
기본 제공 노드 풀 및 비용 가드레일
기본 제공 general-purpose 및 system 노드 풀은 이미 몇 가지 비용 보호 기본값을 적용합니다.
-
C, M, R로 제한된 인스턴스 패밀리 - 가속(P, G, Inf, Trn) 또는 특수 인스턴스 유형은 허용되지 않습니다.
-
온디맨드 용량만 - 스팟 인스턴스가 없으므로 중단으로 인한 이탈은 방지되지만 스팟 절감도 없습니다.
-
5세대 이상 - 비용 효율성이 낮은 이전 인스턴스 세대는 제외됩니다.
기본 제공 노드 풀만 사용 중이라면 이미 이러한 가드레일의 이점을 누리고 있는 것입니다. 인스턴스 패밀리 제외 및 인스턴스 크기 제약에 대한 이 주제의 지침은 이러한 제한을 상속하지 않는 사용자 지정 NodePool을 생성할 때 가장 적절합니다.
그러나 기본 제공 노드 풀의 경우에도 다음 섹션은 여전히 적용됩니다.
-
통합을 차단하는 요소 - 노드를 프로비저닝한 NodePool에 관계없이
do-not-disrupt주석과 제한적 PDB는 통합을 차단합니다. -
NodePool 제한을 비용 상한으로 사용 - 기본 제공 노드 풀에 리소스
limits가 구성되어 있지 않습니다. 워크로드 규모가 대폭 조정될 수 있는 경우 무한 기본 제공 풀에 의존하지 말고 제한이 있는 사용자 지정 NodePool을 생성하는 것이 좋습니다. -
노드 수명 주기 및 비용 - 노드 교체 중복은 기본 제공 풀이 프로비저닝한 노드를 포함한 모든 노드에 적용됩니다.
| 가드레일 | 기본 제공 노드 풀 | 사용자 지정 NodePool |
|---|---|---|
|
가속 인스턴스 제외 |
적용 |
구성해야 함 |
|
인스턴스 크기 제한 |
설정되지 않음 |
구성해야 함 |
|
리소스 |
설정되지 않음 |
구성해야 함 |
|
온디맨드만 |
적용 |
(스팟/온디맨드) 선택 |
|
통합 보호( |
사용자의 책임 |
사용자의 책임 |
통합을 차단하는 요소
노드를 중단하면 워크로드의 가용성 요구 사항이 위반된다고 EKS 자율 모드가 판단하면 통합이 차단됩니다. 다음 구성은 통합을 방지합니다.
do-not-disrupt 주석
karpenter.sh/do-not-disrupt 주석은 주석이 달린 포드가 노드에서 실행되는 한 노드를 보존하도록 EKS 자율 모드에 지시합니다. 이로 인해 노드 사용률이 낮은 경우에도 노드가 통합, 교체 또는 종료되지 않습니다.
metadata: annotations: karpenter.sh/do-not-disrupt: "true"
중요
비용 영향: 포드에 do-not-disrupt 주석이 있으면 포드가 실행되는 노드는 통합에서 제외됩니다. 이는 다음을 의미합니다.
-
노드는 실제 사용률에 관계없이 현재 인스턴스 크기로 계속 실행됩니다.
-
워크로드의 수요가 감소하더라도 해당 노드의 vCPU 및 메모리 사용량은 계속 높게 유지될 수 있습니다.
-
여러 노드에 걸쳐 여러 포드가 이 주석을 지니고 있는 경우 클러스터 전체의 통합이 크게 감소하여 비용이 지속적으로 증가합니다.
do-not-disrupt 주석은 가용성 메커니즘입니다. 이 주석은 비용을 고려하지 않습니다. 실행 도중 중단되면 데이터 손실 또는 상당한 재작업이 발생하는 워크로드(예: 장기 실행 배치 작업 또는 체크포인팅 없는 상태 저장 프로세스)에만 사용하세요.
고려할 대안:
-
포드 중단 예산(PDB) - PDB를 사용하여 중단을 완전히 차단하지 않고 중단 속도를 제어합니다. PDB를 사용하면 최소한의 복제본 수를 사용 가능한 상태로 유지하면서 통합을 진행할 수 있습니다.
-
수명이 짧은 워크로드 - CI/CD 러너 및 빌드 에이전트의 경우
do-not-disrupt를 사용하는 대신 중단을 허용하고 CI 시스템의 기본 제공 재시도 로직에 의존합니다. -
시간 제한 주석 - 중요한 작업 기간에만
do-not-disrupt를 적용한 다음 작업이 완료되면 프로그래밍 방식으로 제거합니다.
포드 중단 예산(PDB)
maxUnavailable: 0 또는 minAvailable을 현재 복제본 수와 동일하게 설정하는 PDB는 영향을 받는 포드의 모든 통합을 효과적으로 차단합니다. PDB를 검토하여 한 번에 1개 이상의 포드가 중단되도록 허용하는지 확인합니다.
NodePool 제한을 비용 상한으로 사용
NodePool limits는 NodePool이 프로비저닝할 수 있는 총 컴퓨팅 리소스에 하드 상한을 설정합니다. 한도에 도달하면 EKS 자율 모드는 해당 NodePool을 위한 새 노드 시작을 중지합니다. 이는 포드가 보류 중인 경우에도 발생합니다.
특히 무한 규모 조정이 적절하지 않은 비프로덕션, 테스트 또는 버스트 워크로드를 처리하는 NodePool에는 limits를 비용 가드레일로 사용하세요.
apiVersion: karpenter.sh/v1 kind: NodePool metadata: name: ci-runners spec: template: spec: nodeClassRef: group: eks.amazonaws.com kind: NodeClass name: default requirements: - key: "eks.amazonaws.com/instance-category" operator: In values: ["c", "m"] limits: cpu: "500" memory: 1000Gi
이 예제에서 ci-runners NodePool은 프로비저닝하는 모든 노드에서 모두 합쳐 500개의 vCPU 또는 1000GiB의 메모리를 초과할 수 없습니다. 이 제한을 초과하는 포드는 용량이 확보될 때까지 Pending 상태로 유지됩니다.
작은 정보
예상 최대 버스트 크기와 노드 교체용 버퍼를 기준으로 limits를 설정하세요. NodePool 사용률을 정기적으로 검토하고 워크로드 패턴이 변경되면 제한을 조정합니다.
비용 제어를 위해 인스턴스 패밀리 제외
기본적으로 EKS 자율 모드는 예약 유연성을 극대화하기 위해 광범위한 인스턴스 유형 중에서 선택합니다. 전문 하드웨어가 필요하지 않은 워크로드의 경우 비용이 많이 드는 인스턴스 유형이 시작되지 않도록 인스턴스 패밀리를 제한하세요.
가속 인스턴스 제외
워크로드가 GPU 또는 액셀러레이터 리소스를 요청하지 않는 경우 NodePool에서 가속 인스턴스 패밀리를 제외하세요. 이렇게 하면 용량 제약 중에 가속 인스턴스가 선택되는 시나리오를 방지할 수 있습니다.
spec: template: spec: requirements: - key: "eks.amazonaws.com/instance-category" operator: In values: ["c", "m", "r"]
컴퓨팅 최적화, 범용, 메모리 최적화 범주만 지정하면 가속(P, G, Inf, Trn) 및 기타 전문 인스턴스 패밀리를 선택에서 제외할 수 있습니다.
인스턴스 선택과 용량 제약의 상호 작용 방식
EKS 자율 모드는 정상적 인스턴스 선택 중에 가속 인스턴스 유형과 특수 인스턴스 유형을 우선순위에서 배제합니다. 하지만 시작 실패가 지속적으로 발생하면 EKS 자율 모드는 워크로드 가용성을 우선시하여 사용 가능한 나머지 인스턴스 유형에서 시작합니다. 예를 들어 선호하는 모든 인스턴스 유형의 EC2 서비스 할당량이 일시적으로 소진되면 이 현상이 발생합니다.
이 폴백 동작을 방지하려면 NodePool 요구 사항을 워크로드에 필요한 인스턴스 범주로만 명시적으로 제한하세요. 선호하는 유형을 사용할 수 없고 NodePool 구성에서 다른 유형을 허용하지 않는 경우 포드는 비용이 많이 드는 인스턴스에 예약되지 않고 Pending 상태로 유지됩니다.
인스턴스 크기 제약
인스턴스 패밀리 제한 외에도 NodePool 내에서 최대 인스턴스 크기를 제한할 수 있습니다. 인스턴스 크기를 제약하면 통합할 수 없는 단일 노드로 인한 비용 노출이 제한됩니다. 예를 들어 do-not-disrupt 주석으로 차단된 노드는 워크로드가 작아도 축소할 수 없습니다.
eks.amazonaws.com/instance-cpu 레이블을 사용하여 NodePool 요구 사항에서 최대 인스턴스 크기를 제한하세요.
requirements: - key: "eks.amazonaws.com/instance-cpu" operator: Lte values: ["32"]
이 구성은 EKS 자율 모드가 이 NodePool에서 vCPU 32개보다 큰 인스턴스를 시작하는 것을 방지합니다.
기존 클러스터에서 최적화 기회를 식별하려면 가장 큰 실행 중 인스턴스를 검토합니다. 큰 노드가 통합에서 지속적으로 차단된다면 해당 유휴 용량의 노드당 비용이 비례적으로 더 높은 것입니다.
버스트 워크로드에 권장되는 패턴
CI/CD 파이프라인, 배치 작업, 임시 러너는 비용 효율성을 유지하기 위해 특정 구성이 필요한 burst-and-idle 패턴을 생성합니다.
버스트 워크로드에 권장되는 기본값
| 구성 | 권장 사항 |
|---|---|
|
|
CI/CD 러너에는 사용하지 마세요. CI 시스템의 재시도 및 대기열 메커니즘을 대신 사용하세요. |
|
NodePool |
최대 예상 동시성과 노드 교체 중복용 버퍼를 기준으로 CPU/메모리 상한을 설정합니다. |
|
인스턴스 범주 |
|
|
인스턴스 크기 |
통합에서 차단되는 단일 노드로 인한 비용 노출을 제한하려면 중간 크기(예: 4~32개 vCPU)로 제약하는 것이 좋습니다. |
|
통합 타이밍 |
기본 |
|
용량 유형 |
내결함성 러너에 스팟 인스턴스를 사용합니다. 실행 중에 상태를 유지하는 빌드 에이전트의 경우 온디맨드와 결합합니다. |
예: CI 러너 NodePool
apiVersion: karpenter.sh/v1 kind: NodePool metadata: name: ci-runners spec: template: spec: nodeClassRef: group: eks.amazonaws.com kind: NodeClass name: default requirements: - key: "eks.amazonaws.com/instance-category" operator: In values: ["c", "m"] - key: "eks.amazonaws.com/instance-cpu" operator: Lte values: ["32"] - key: "karpenter.sh/capacity-type" operator: In values: ["spot", "on-demand"] limits: cpu: "500" memory: 1000Gi disruption: consolidationPolicy: WhenEmptyOrUnderutilized consolidateAfter: 30s
이 구성은 다음과 같습니다.
-
비용 효율적인 인스턴스 패밀리로 제한
-
총 NodePool 용량을 vCPU 500개로 제한
-
적극적인 통합 허용(포드 제거 후 30초)
-
스팟 및 온디맨드 용량 모두 허용
노드 수명 주기 및 비용
EKS 자율 모드는 노드가 원하는 사양에서 드리프트하거나(예: 새 Auto Mode AMI 릴리스 후) 노드 수명 만료가 다가올 때 정상적인 중단을 통해 노드를 교체합니다. 정상적 교체 중:
-
새 교체 노드가 시작되고 준비 상태가 됩니다.
-
포드는 포드 중단 예산을 적용하여 이전 노드에서 드레이닝됩니다.
-
잠깐 동안 이전 노드와 교체 노드가 동시에 실행됩니다.
노드가 크거나 많은 클러스터의 경우 이 중복으로 인해 주기적으로 비용이 증가할 수 있습니다. 영향을 최소화하려면:
-
중단 예산 검토 - 중단 예산이 적시 드레이닝을 허용해야 합니다. 제한적 예산은 이전 노드와 새 노드가 모두 실행되는 중첩 기간을 연장합니다.
-
적절한 인스턴스 크기 조정 - 인스턴스가 작을수록 중첩 기간의 절대 비용이 절감됩니다.
-
최대 노드 수명 단축 - 만료 값이 짧을수록(예: 7일) 교체 이벤트가 빈번하게 발생하지만 이벤트 규모는 작아집니다. 이렇게 하면 시간이 지나면서 비용이 집중되지 않고 더 균등하게 분산됩니다.
노드 수명 주기에 대한 자세한 내용은 Amazon EKS 자율 모드 관리형 인스턴스에 대해 알아보기를 참조하세요.